假设我有信号x(t),我是否可以在不使用FFT的情况下检测频谱中的峰值(即能量含量最高的频率)?
* PS - 我在Wavelet Decomposition中看到了一些名为scale2freq()的东西。我在MATLAB帮助页面中查看了它,结果让我感到困惑。该功能是否与频率表示有关?如果是,我如何使用它找到峰值频率?
答案 0 :(得分:0)
您可能想要的是一种音高检测算法,它们在时域或频域(或两者都有)中有很多种。请搜索谷歌搜索"音高检测算法"有关进一步参考或检查所选链接的快速概述:
在时域中,一些简单的方法是定位自相关函数的峰值。实际上,在t = 0时自相关是最大的,然后下一个峰给出主周期的估计:
ncount = 10000;
Ts = 0.0001; % Sampling period
t = (1:ncount) * Ts; % Sampling times
f = sin(2*pi*60*t) + 0.1*sin(2*pi*200*t) + 0.01 * randn(1, length(t)); % Signal
R = xcorr(f);
[~, locs] = findpeaks(R);
meanLag = Ts * mean(diff(locs));
pitch = 1 / meanLag; ===> Will be around 60 Hz
这种方法适用于非常基本的信号,你可能需要根据你的情况(噪音水平,周期性,多音等等)对其进行改进。有关更精细的算法,请参阅上述参考资料。