为了好玩,我计算了纯正弦波的 FFT。我选择的样本长度是信号周期的偶数倍,所以我看不到windowing-effects。这是我使用的 Matlab 代码:
% Signal properties
f_signal = 1000;
% Sampling properties
f_sample = 4000;
T_total = 100;
% Calculate signal vector
t = 0:1/f_sample:T_total;
N = length(t);
V = sin(2*pi*f_signal*t);
% Calculate FFT
f_spectrum = (0:N-1)/N*f_sample;
V_spectrum = abs(fft(V))/(N/2);
% Plot
figure(2)
semilogy(f_spectrum, V_spectrum)
set(gca, 'XLim', [f_signal-5, f_signal+5])
xlabel('Frequency in Hz')
ylabel('Normalized amplitude')
但是,我得到的不是单个峰值,而是以下结果:
这让我觉得很奇怪,原因有两个:
- 影响真的很大。中心峰值的幅度为 0.9 而不是 1,右边的下一个 bin 的幅度为 0.3 而不是 0。
- 虽然我希望有限的数值精度会扩大我的峰值,但我对效果如此柔滑感到非常惊讶。我一直认为舍入误差是最低有效数字的“噪音”。噪声通常会导致不和谐的光谱。
我观察到,如果我选择稍低的频率(999.9975),那么效果是最小的。这里发生了什么?