纯正弦波的 FFT 不是单峰

信息处理 matlab fft
2022-01-26 08:58:28

为了好玩,我计算了纯正弦波的 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')

但是,我得到的不是单个峰值,而是以下结果:

加宽 FFT 峰值。

这让我觉得很奇怪,原因有两个:

  1. 影响真的很大。中心峰值的幅度为 0.9 而不是 1,右边的下一个 bin 的幅度为 0.3 而不是 0。
  2. 虽然我希望有限的数值精度会扩大我的峰值,但我对效果如此柔滑感到非常惊讶。我一直认为舍入误差是最低有效数字的“噪音”。噪声通常会导致不和谐的光谱。

我观察到,如果我选择稍低的频率(999.9975),那么效果是最小的。这里发生了什么?

1个回答

就在我想点击“询问”按钮时,我意识到我遇到了围栏问题。

我的时间向量太长了 1 点。这意味着我的电压矢量的第一个点和最后一个点是相同的,这反过来意味着我的周期信号在重复时具有相移。这也解释了为什么当我降低频率时这种现象(几乎)消失了。

如果我改为正确地将我的时间向量定义为

t = 0:1/f_sample:T_total-1/f_sample;

然后我得到了我期望的结果:一个峰值和它周围的一点点噪音。

噪音固定