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

Finding peaks of an array and creating a sequence of bits (without using findpeaks)

给定一个数组 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 是步长 h = 0.1 的数值求解的 ode 系统的解),我得到的峰值比实际出现的要多图。有什么办法可以解决这个问题吗?

V向量的波动可以通过使用MATLAB提供的'smooth'函数来避免。默认情况下,此函数使用 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