查找数组的峰值并创建一系列位(不使用findpeaks)

时间:2018-03-24 14:56:56

标签: arrays algorithm matlab signal-processing

给定一个数组V,这是微分方程组的数值解,我想确定这个数组的局部正峰。每当我有一个大于0的峰值时,我的代码就等于1,每当我有一个带负值的峰值时,我会编码一个等于0的位(我不能使用findpeaks)。

我尝试了以下内容:

function Suite_bits = message_digital(V)
j = 1;
bit(1) = 0;
for i=2:numel(V)-1
    if V(i-1)<V(i) && V(i+1)<V(i)
        if V(i)>0
            bit(j) = 1;
            j = j + 1; 
        else
            bit(j) = 0;
            j = j + 1;
        end 
    end
    Suite_bits = bit;
end

但是由于矢量V中的一些小的异常,步骤之间的值的波动(记住V是数值求解的ode系统的解决方案,步长h = 0.1),我获得的峰值比实际出现的峰值多。我有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

通过使用“平滑”来避免V矢量的波动。功能由MATLAB提供。默认情况下,此功能使用5点移动平均值平滑数据。您可以更改此函数的参数,以使移动平均值包含多于或少于5个点。因此,根据波动的大小,可以安排该参数以使得波动被平滑并被算法忽略。这是一个可以工作的代码示例:

function Suite_bits = message_digital(V)
j = 1;
V = smooth(V, 15);
bit(1) = 0;
for i=2:numel(V)-1
    if V(i)>V(i-1) && V(i)>V(i+1) 
        if V(i)>0
            bit(j) = 1;
            j = j + 1; 
        else
            bit(j) = 0;
            j = j + 1;
        end 
    end
    Suite_bits = bit;
end
end