如何在matlab中找到主峰(fft)

时间:2014-04-30 02:23:52

标签: matlab signal-processing fft

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

Graph

信号是非常紧张的,因为它们上升然后下降,使得很难找到最大值及其指数。

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()给了我太多结果,所以我使用了这个功能。但是,如果我将阈值设置得太低,我会得到太多结果,如果我将它设置得太高,我会错过其中一个主要峰值。

我该怎么做?

3 个答案:

答案 0 :(得分:5)

如果你的主要峰值与你所包含的图表中的分离一样,那么findpeaks()的参数可以帮助很多。尝试:

findpeaks(x, 'MINPEAKDISTANCE', dist);

x是你的大小,dist是一个距离你可以假设是2个峰之间的最小距离。这可能会让你看到彼此超过2*dist的2次偷看,如果是这样的话,请考虑使用'MINPEAKHEIGHT'

添加一个小阈值

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

答案 1 :(得分:3)

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

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

或设置一个阈值,data(locs)>threshold等......

答案 2 :(得分:0)

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

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

如果事前未知突出峰值的数量,您可以使用此时的阈值作为突出度量。