MATLAB中如何确定实际频率值与FFT图索引之间的关系引起困惑

4

我知道有很多类似的问题,但我仍然无法找出答案。 假设我们在MATLAB中有时间信号:

t=0:1/44100:1

和一个频率为500Hz的余弦信号:

x=cos(2*pi*500*t);

现在,我正在尝试在信号x上使用fft命令绘制获得的幅度谱。

FFT=abs(fft(x))
plot(FFT)

根据理论,我们应该在图表中得到两个峰值,一个在-500 Hz处,另一个在500Hz处。 我不明白的是,我确实得到了两个峰值,但我无法确定这些峰值出现的频率。我知道有一种方法可以使用FFT索引、输入信号的长度和采样频率来计算频率,但我仍然无法计算频率。
我知道有一些方法可以通过使用fftshift函数来对齐FFT图形,使峰值位于它们所代表的频率的索引号上,但我想要的是仅仅调用此函数所生成的图形中确定频率。
FFT=fft(x)

在这种情况下,我已经知道信号包含一个500Hz的余弦波,但如果我们想要对不事先知道的信号进行FFT处理,该怎么办呢?如何使用fft函数的输出获取那个样本中峰值的频率值?
2个回答

1

你需要自己生成频率数组,并将FFT结果绘制在其上。

就像这样:

function [Ycomp, fHz] = getFFT(data, Fs)
     len = length(data);
     NFFT = 2^nextpow2(len);
     Ydouble = fft(data, NFFT)/len; % Double-sided FFT
     Ycomp = Ydouble(1:NFFT/2+1); % Single-sided FFT, complex
     fHz = Fs/2*linspace(0,1,NFFT/2+1); % Frequency array in Hertz.
     semilogx(fHz, abs(Ycomp))
end

1

您将会在500 Hz和Fs - 500 Hz(即在您的特定情况下为44100-500 = 43600 Hz)处看到峰值。

这是因为实际到复杂FFT输出是共轭对称的 - 当您只查看幅度时,频谱的顶部一半是底部一半的“镜像”,因此是多余的。

请注意,如果要绘制功率谱图,通常可以使用MATLAB的periodogram函数,而不必直接处理FFT、窗口函数、绘图等所有细节,从而节省大量工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接