我有一系列运动数据(动作捕捉)。我试图确定运动的方向:如果有一个最大值,那就是向上运动,如果有一个最小值,那就是向下运动。
我正在使用此处http://www.billauer.co.il/peakdet.html找到的功能peakdet,并由用户@Yuk修改How to differentiate between a double peak and a single peak array in MATLAB?
我希望能够将出现的动作分类为UP或DOWN,我认为识别最大值和最小值可能会有所帮助。但是,我将使用下图解释这个问题:
正如您所看到的,第一张图像同时发现了最大值和最小值,但是红色峰值是实际向上运动,而最小值则不是。与第二个数字相反,绿色最小值确实是向下运动,但红色峰值根本不是真正的运动。
我想知道如何修改这段代码,以便绘制最小值和最大值,只有当它们的幅度足够大时(因此发出一个真实的运动):
%# run peakdet twice left-to-right and right-to-left
delta = 10;
[ymaxtab, ymintab] = peakdet(y, delta, x);
[ymaxtab2, ymintab2] = peakdet(y(end:-1:1), delta, x(end:-1:1));
ymaxtab = unique([ymaxtab; ymaxtab2],'rows');
ymintab = unique([ymintab; ymintab2],'rows');
%# plot the curve and show extreme points based on number of peaks
plot(x,y)
hold on
if size(ymaxtab,1) == 2 && size(ymintab,1) == 1 %# if double peak
plot(ymintab(:,1),ymintab(:,2),'r.','markersize',30)
elseif size(ymaxtab,1) == 1 && size(ymintab,1) == 0 %# if single peak
plot(ymaxtab(:,1),ymaxtab(:,2),'r.','markersize',30)
else %# if more (or less)
plot(ymintab(:,1),ymintab(:,2),'r.','markersize',30)
plot(ymaxtab(:,1),ymaxtab(:,2),'r.','markersize',30)
end
hold off
... delta“设定你想要忽略的波动幅度。”
代码来源是:How to differentiate between a double peak and a single peak array in MATLAB? 更新:我尝试了一个移动平均滤波器,但似乎发生的是时间序列变得更加平滑,但仍然,最小和最大值以相同的方式被识别。我也试过Findpeaks函数[ypk,yt] = findpeaks(Ix,'MinPeakProminence',5);但是虽然我知道如何找到山峰,但我不知道如何找到山谷(时间序列的倒置降级非常奇怪的结果),所以使用这种方法,我不知道是为了让山谷变得不合时宜。
我想知道是否应该将阈值规则更改为:峰值只是一个峰值,如果它与整个时间序列数组的平均值相差2个标准差,则在任一方向上。但我不知道如何在上面发布的代码中实现它。