4

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

t=0:1/44100:1

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

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

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

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

根据理论,我们应该在图中得到两个峰值,一个在 -500 Hz,另一个在 500Hz。我不明白的是,我确实得到了两个峰值,但我无法弄清楚这些峰值的频率。我知道有一种方法可以使用 FFT 指数、输入信号的长度和采样频率来计算频率,但我仍然无法计算频率。

我知道有一些方法可以对齐 FFT 图,以便峰值位于它们通过使用该fftshift函数表示的频率的索引号处,但我想要的是使用简单调用此函数产生的图来计算频率:

FFT=fft(x)

在这种情况下,我已经知道信号包含 500Hz 的余弦,但是如果我们想要获得 FFT 的信号在时间之前不知道怎么办。我们如何使用函数的输出获得该样本中峰值的频率值fft

4

2 回答 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
于 2012-12-05T11:17:03.953 回答
1

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

这是因为实数到复数 FFT 输出是复共轭对称的——当您仅查看幅度时,频谱的上半部分是下半部分的“镜像”,因此是多余的。

请注意,在绘制功率谱时,您通常可以通过使用 MATLAB 的周期图函数来节省大量工作,而不是直接处理 FFT、窗口函数、绘图等的所有细节。

于 2012-12-05T11:18:10.917 回答