在2个不同事件的数据集中查找峰值

时间:2016-04-29 07:24:04

标签: arrays matlab max

我有一个包含时间和加速度值的数据集。我想确定加速和减速区域,然后返回每个区域的峰值加速度/减速度值和相关时间。到目前为止,我已经使用'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)  

2 个答案:

答案 0 :(得分:0)

如果您的数据代表加速度值,那么 findpeaks 功能将仅返回峰值加速度值。如果您还想要减速峰值,请将矢量乘以-1并再次调用 findpeaks 函数。

顺便说一句,如果您只需要加速和减速区域,这将是任何不为零的值。

实施例: 对于加速矢量:

x = [1 2 5 7 7 8 3 1 2 2 2 -2 -4 -7 -3 -1 0 5];

它的情节将是: enter image description here

并且findpeaks函数将返回值8(这是第6个索引)。 当您使用向量乘以-1运行相同的函数时,您将得到值-1(这是第8个索引)。再次,一个很好的可视化: enter image description here

如果您的数据包含负值,您可以在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

jgb2012@sky.com

评论:如上所述,我认为当同一段内的加速度较弱且硬减速时,峰值应该是更大的推力,这将是更高的减速度。

如果不是这样的情况,如果你真的想要最高的正向推力,不管峰值的反推力值是否更大,那么而不是:

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