我知道有很多类似的问题,我仍然无法找到答案。 假设我们在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索引,输入信号的长度和采样频率来计算频率,但我仍然无法计算频率。
我知道有一些方法可以对齐FFT图,使得峰值位于它们使用fftshift
函数表示的频率的索引号,但我想要的是使用简单地调用此函数产生的情节:
FFT=fft(x)
在这种情况下,我已经知道信号包含500Hz的余弦,但是如果我们想要获得FFT的信号在时间之前是未知的。如何使用fft
函数的输出获得该样本中峰的频率值?
答案 0 :(得分: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 :(得分:1)
您将看到500 Hz和Fs - 500 Hz的峰值(在您的特定情况下,即44100 - 500 = 43600 Hz)。
这是因为实际到复数的FFT输出是复共轭对称的 - 当您只是观察幅度时,频谱的上半部分是下半部分的“镜像”,因此是多余的。
请注意,绘制功率谱时,通常可以使用MATLAB的periodogram函数来节省大量工作,而不是直接处理FFT,窗口函数,绘图等所有细节。