为什么它显示多个频率或变化频率?

时间:2014-09-18 10:08:41

标签: matlab fft

我原本期望频率分量为1700,即1700时的峰值,但输出显示多个频率:

fs = 44100;
t = 0:1/fs:0.001;
s = sin(2 * pi * 1700 * t);
subplot(211), stem(abs(fft(s))), title('abs(fft(s))')
subplot(212), stem(s), title('s')

enter image description here

同样,当我尝试下面的代码时,我没有达到我的预期:

Fs = 8000;
dt = 1/Fs;           
StopTime = 0.25;        
t = (0:dt:StopTime-dt)'; 
Fc = 60;                    
x = cos(2*pi*Fc*t);
subplot(211), stem(abs(fft(x))), title('abs(fft(x))')
subplot(212), stem(x), title('x')

为什么我的频率分量显示为倍数值,因为在一个稳定的正弦/余弦波中信号中应该只有一个频率。

enter image description here

2 个答案:

答案 0 :(得分:3)

这是单一频率,但它出现两次:正负频率。 fftshift会更好地看到这一点,它会安排频次样本,以便它们从 - fs / 2运行到 fs / 2:

subplot(211)
freq_axis = -fs/2+fs/numel(t):fs/numel(t):fs/2;
stem(freq_axis, abs(fftshift(fft(s))))
title('abs(fft(s))')

例如,在您的第一个示例中,这将生成下图。

enter image description here

请注意+1700和-1700 Hz附近的两个尖峰。他们的位置并不完全有两个原因:

  • 您的时间信号是有限持续时间,它会在频域中产生带有sinc的卷积。也就是说,频率尖峰变得更宽。
  • FFT给出频率样本,这些样本中没有一个精确地落在+/- 1700 Hz。

在你的第二个例子中,时间信号更长(它包含更多周期),这减少了频率尖峰的宽度。在第二个图中可以理解这一点(同样需要fftshift校正才能使两个尖峰出现在对称的频率位置。)

答案 1 :(得分:2)

由于您的信号不是整数个周期,因此存在不连续性(请记住傅立叶变换假设周期性),这会产生spectral leakage,这可以看作是光谱的“拖尾”。为了避免这种情况,我们通常在FFT之前应用合适的window function(例如von Hann aka Hanning window) - 将其视为平滑不连续性。这样可以减少拖尾现象,使峰更明显。

如另一个答案中所述,您还会看到第二个峰值,因为您正在绘制整个频谱,并且时域中的每个分量在频域中都有正负频率分量。对于实值信号,FFT在频域中是复共轭对称的,因此一半的频谱是冗余的。您通常只会绘制N / 2个值。