使用Matlab查找时间序列中的局部峰值和谷值

时间:2014-09-23 14:50:17

标签: matlab

我使用以下代码计算各种资产的时间序列数据中的峰值。峰值定义为任何大于其相邻点的时间序列。根据峰值数量,我在代码中计算得分,如下所示。 input_args采用这种格式,rc是input_args的大小。这段代码工作正常,但是当我跨资产长时间调用它时需要花费很多时间。他们是一种使这段代码更有效的方法。我正在寻找一个解决方案,通过该解决方案,我可以创建一个逻辑数组,以确定满足峰值条件的时间序列中的点,然后将它们隔离以计算得分?

Data:-
1
0.997
0.979
0.952
0.935
0.942
0.987
1.027
1.036
1.049

function [maxhill] = hill_calc(input_args,rc)
for i=2:rc(1)-1    
    if and(input_args(i)>input_args(i+1),input_args(i)>input_args(i-1))
    output_args_hills(i-1) = 2*input_args(i)-input_args(i+1)-input_args(i-1);
    else output_args_hills(i-1) = NaN;
    end
end
maxhill = max(output_args_hills);   
end

2 个答案:

答案 0 :(得分:1)

您可以按如下方式轻松计算峰的指数:

ind = 1+find((input_args(2:end-1)>input_args(1:end-2)) & ...
    (input_args(2:end-1)>input_args(3:end)));

实施例_

>> input_args = [1 2 5 4 7];

给出

ind =
     3

意味着只有第三个值才是峰值。

答案 1 :(得分:1)

假设您无法访问信号处理工具箱中的内置函数findpeaks ...

您可以使用diff函数找到峰值,如下所示:

peaks = [false; diff(diff(y) > 0) < 0; false]

e.g:

x = 1:100;
y = sin(0.2*x)+sin(rand()*x)*0.2;
peaks = [false, diff(diff(y) > 0) < 0, false];
plot(x,y);
hold on;
plot(x(peaks),y(peaks), 'ro')

enter image description here

请注意,低谷只需要翻转小于号

troughs = [false; diff(diff(y) > 0) > 0; false]