我原本期望频率分量为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')
同样,当我尝试下面的代码时,我没有达到我的预期:
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')
为什么我的频率分量显示为倍数值,因为在一个稳定的正弦/余弦波中信号中应该只有一个频率。
答案 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))')
例如,在您的第一个示例中,这将生成下图。
请注意+1700和-1700 Hz附近的两个尖峰。他们的位置并不完全有两个原因:
在你的第二个例子中,时间信号更长(它包含更多周期),这减少了频率尖峰的宽度。在第二个图中可以理解这一点(同样需要fftshift
校正才能使两个尖峰出现在对称的频率位置。)
答案 1 :(得分:2)
由于您的信号不是整数个周期,因此存在不连续性(请记住傅立叶变换假设周期性),这会产生spectral leakage,这可以看作是光谱的“拖尾”。为了避免这种情况,我们通常在FFT之前应用合适的window function(例如von Hann aka Hanning window) - 将其视为平滑不连续性。这样可以减少拖尾现象,使峰更明显。
如另一个答案中所述,您还会看到第二个峰值,因为您正在绘制整个频谱,并且时域中的每个分量在频域中都有正负频率分量。对于实值信号,FFT在频域中是复共轭对称的,因此一半的频谱是冗余的。您通常只会绘制N / 2个值。