为什么等幅信号分量的峰值大小在 FFT 频域表示中不相等?

问题描述

在这里包含了我的原始 Matlab 代码,但我认为对于非 Matlab 用户来说,这已经足够清楚,可以理解这些行在做什么。我也在 Python 上对此进行了测试,并得到了相同的结果。我所做的基本上是将三个不同频率但幅度相等的正弦曲线相加,然后分解组合信号以观察功率谱峰值。问题是,根据采样点数量和采样频率,峰值大小相对于彼此采用不同的比率,而不是大小相等,因为分量信号具有相同的幅度。如果我们将 FFT 视为某种形式的点积,那么为什么手动(在信号和正弦波之间)进行点积会给出正确的结果,但 FFT 取决于样本数和采样频率?谢谢。

fs = 10;
time = 0:1/fs:205; % in seconds
freqs = [0.05,0.1,0.3]; % Hz
signal = zeros(1,length(time));
for f_i = 1:length(freqs)
    signal = signal + sin(2*pi*freqs(f_i)*time);
end
power_spectrum = abs(fft(signal)).^2 % Of course I'm just skipping the trimming part here
plot(power_spectrum)

您可以在此处查看调整后的图:spectrum

解决方法

您看到的是频谱泄漏。假设您在频率 a2 处有正弦波,但 DFT 只有频率 a1 和 a3 最接近 a2,a1a 处看到的是 a2 处的幅度,乘以 f(x)=sin(x)/x 的值,其中 x=x(a-a2)。参见例如 https://www.gaussianwaves.com/2011/01/fft-and-spectral-leakage-2/ .