我有一个包含时间和加速度值的数据集。我想确定加速和减速区域,然后返回每个区域的峰值加速度/减速度值和相关时间。到目前为止,我已经使用'findpeaks'功能来查找数据中的峰值,但它们包含加速度和减速度峰值。任何帮助将不胜感激
[~,~,Data] = xlsread('data.xlsx');
ts = cell2mat(Data(2:end,1))/1000; %% time in seconds
av = cell2mat(Data(2:end,2)); %% acceleration values in m/s
figure
plot(ts,av)
findpeaks(av,ts)
[PKS,LOCS] = findpeaks(av,ts)
答案 0 :(得分:0)
如果您的数据代表加速度值,那么 findpeaks 功能将仅返回峰值加速度值。如果您还想要减速峰值,请将矢量乘以-1并再次调用 findpeaks 函数。
顺便说一句,如果您只需要加速和减速区域,这将是任何不为零的值。
实施例: 对于加速矢量:
x = [1 2 5 7 7 8 3 1 2 2 2 -2 -4 -7 -3 -1 0 5];
并且findpeaks
函数将返回值8(这是第6个索引)。
当您使用向量乘以-1运行相同的函数时,您将得到值-1(这是第8个索引)。再次,一个很好的可视化:
如果您的数据包含负值,您可以在findpeaks函数中使用对:(MinPeakHeight,0):
findpeaks(x, 'MinPeakHeight', 0);
对于加速问题,所以你不会得到负加速度。但是,这取决于您的具体问题详情。
编辑:正如您所看到的,我在向量中添加了一些负值,以便完整回答您的问题。 在原始图中,加速度峰值将是指数:(6,9)表示正数,(14)表示负数。 减速将是:(8)。
所以现在,每个加速度都将是原始矢量上的发现返回的任何正值;以及函数在翻转(乘以-1)向量时返回的每个正值。 至于减速,它将完全相反:来自原始矢量的负值和来自翻转矢量的负值。
希望现在很清楚。
答案 1 :(得分:0)
这是John BG jgb2012@sky.com
1.-我最近在另一个论坛上遇到过类似的问题。
让我在另一个答案中使用与上面相同的示例信号:
x = [1 2 5 7 7 8 3 1 2 2 2 -2 -4 -7 -3 -1 0 5]
2.-用xls数据替换测试信号。
尝试以下操作,让我知道它是否有效:
x=[x x(end)]
dx=diff([0 x])
k=1
n=1
while k<numel(x)
r(n).start=k
r(n).slope=sign(dx(k))
switch r(n).slope
case 1
while dx(k)>0 % up hill
if k<numel(x)
k=k+1;
end
if k==numel(x)
break
end
end
r(n).stop=k-1
case -1
while dx(k)<0 % down hill
if k<numel(x)
k=k+1;
end
if k==numel(x)
break
end
end
r(n).stop=k-1
otherwise % flat
while dx(k)==0
if k<numel(x)
k=k+1;
end
if k==numel(x)
break
end
end
r(n).stop=k-1
end
n=n+1
end
n=n-1 % match n to amount of segments
for k=2:1:size(r,2) % correction r(n>1).start
r(k).start=r(k).start-1
end
for k=1:1:size(r,2) % calculate segment slopes
if x(r(k).stop)>x(r(k).start)
r(k).slope=1
end
if x(r(k).stop)<x(r(k).start)
r(k).slope=-1
end
if x(r(k).stop)==x(r(k).start)
r(k).slope=0
end
end
for k=1:1:size(r,2) % calculate peaks assuming max thrust sought regardless of sign
L1=x([r(k).start:1:r(k).stop])
k1=find(max(abs(L1)))
if sign(L1(k1))>0
r(k).peak=max(x([r(k).start:1:r(k).stop]))
end
if sign(L1(k1))<0
r(k).peak=min(x([r(k).start:1:r(k).stop]))
end
if sign(L1(k1))==0
r(k).peak=0
end
end
2 .-
测试每个段的开始停止
for k=1:1:size(r,2) % test read each segment
x([r(k).start:1: r(k).stop])
end
ans =
1 2 5 7
ans =
7 7
ans =
7 8
ans =
8 3 1
ans =
1 2
ans =
2 2 2
ans =
2 -2 -4 -7
ans =
-7 -3 -1 0 5
3.-
测试获得的斜率值
+1:加速
-1:减速
0:恒定速度
r(:).slope
ans =
1
ans =
0
ans =
1
ans =
-1
ans =
1
ans =
0
ans =
-1
ans =
1
4.-测试峰值
r(:).peak
ans =
7
ans =
7
ans =
8
ans =
8
ans =
2
ans =
2
ans =
2
ans =
-7
如果您觉得这个答案有用,请您考虑将我的答案标记为已接受的答案吗?
对于任何其他读者,如果您觉得这个答案有用 请考虑点击向上箭头投票链接
提前感谢时间和关注
John BG
评论:如上所述,我认为当同一段内的加速度较弱且硬减速时,峰值应该是更大的推力,这将是更高的减速度。
如果不是这样的情况,如果你真的想要最高的正向推力,不管峰值的反推力值是否更大,那么而不是:
for k=1:1:size(r,2) % calculate peaks assuming max thrust sought regardless of sign
L1=x([r(k).start:1:r(k).stop])
k1=find(max(abs(L1)))
if sign(L1(k1))>0
r(k).peak=max(x([r(k).start:1:r(k).stop]))
end
if sign(L1(k1))<0
r(k).peak=min(x([r(k).start:1:r(k).stop]))
end
if sign(L1(k1))==0
r(k).peak=0
end
end
使用
for k=1:1:size(r,2)
L1=x([r(k).start:1:r(k).stop])
k1=find(max(abs(L1)))
if sign(L1(k1))>0 || sign(L1(k1))<0
r(k).peak=max(x([r(k).start:1:r(k).stop]))
end
if sign(L1(k1))==0
r(k).peak=0
end
end