【问题标题】:How to find dominant peaks in matlab (fft)如何在matlab(fft)中找到主峰
【发布时间】:2014-04-30 02:23:51
【问题描述】:

我无法在此图中找到 4 个主要峰值

信号值非常不稳定,因为它们先升后降,很难找到最大值和它的索引。

function [peaks, locations] = findMaxs (mag, threshold)
len = length(mag);

prev = 1;
cur = 2;
next = 3;
k = 1; %number of peaks
while next < len
    if mag(cur) - mag(prev) > threshold
        if mag(cur) > mag(next)
            peaks(k) = mag(cur);
            fprintf('peak at %d\n', cur);
            k = k + 1;
        end
    end
    prev = cur;
    cur = next;
    next = next + 1;
end

end

findpeaks() 给了我太多的结果,所以我正在使用这个函数。但是,如果我将阈值设置得太低,我会得到太多的结果,如果我将它设置得稍微太高,我就会错过一个主要的峰值。

我该怎么做?

【问题讨论】:

    标签: matlab signal-processing fft


    【解决方案1】:

    如果您的主峰像您包含的图中那样分开,则findpeaks() 的参数可以提供很大帮助。试试:

    findpeaks(x, 'MINPEAKDISTANCE', dist);
    

    x 是你的大小,dist 是一个距离,你可以假设它是两个峰之间的最小距离。这可能会让您在 2 个彼此之间超过 2*dist 的偷看之间做出错误的偷看,如果是这样,请考虑使用 'MINPEAKHEIGHT' 添加一个小阈值

    另一个选项是动态计算阈值,例如通过计算平均值 m 和标准差 sigma 并通过仅计算高于 n*sigma 的峰值来设置阈值 m

    【讨论】:

      【解决方案2】:

      您仍然可以使用findpeaks。 例如[pks,locs] = findpeaks(data) 返回局部峰值的索引。 那么你可以对data(locs)进行排序,得到前4个幅度。

      [a ind]=sort(data(locs,'descend')
      

      或设置阈值,data(locs)&gt;threshold 等...

      【讨论】:

        【解决方案3】:

        一种方法是计算幅度数组的差分函数(这相当于连续函数的导数)。寻找差分函数的值从正变为负的点。这些是你的高峰。

        要找到最突出的峰值,请计算从一阶差分获得的点处的二阶差分函数,并选择幅度最高的峰值。

        如果事先不知道突出峰的数量,此时您可以使用阈值作为突出度的衡量标准。

        【讨论】:

        • 计算量很大-_-
        猜你喜欢
        • 2014-04-19
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 2012-02-08
        • 2016-02-19
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多