为什么FFT导致高频范围不正确?

时间:2014-08-25 15:00:09

标签: matlab fft

我正在使用matlab进行FFT。我在fft上做的时间是1秒,它由50000个等距空间样本组成。我想测试FFT结果。所以我给出了一个输入如下(波),这是一个复杂的sinosuidal波(我通过50 KHZ的采样频率对其进行采样),我期望得到频率幅度结果,就像我在输入中给出的那样。结果适用于低频范围,但对于较高频率(5752 Hz和7993 Hz),结果分别为5.87和6.7(而不是6和)。这个大错的起源是什么?我怎样才能改善我的成绩?!

以下是代码:

t = 0:1/50000:1;

wave = 100*sin(2*pi*50*t)+1*sin (2*pi*123*t)+2*sin (2*pi*203*t)+3*sin(2*pi*223*t)+4*sin(2*pi*331*t)+5*sin(2*pi*2812*t)+6*sin(2*pi*5752*t)+7*sin(2*pi*7993*t);

SPEC = fft(wave);

L = size(SPEC,2);
x= (0:L/2-1);
Half_SPEC = abs(SPEC(1:L/2))/(L/2);  %% removing the mirror side and ranging the domain 

plot(x,Half_SPEC);  

1 个答案:

答案 0 :(得分:3)

正如Oli Charlesworth指出的那样,你正在采用50001点的FFT,这意味着频率间隔是1/50001。

通常只有当频率是频率间隔的精确倍数时,FFT才会给出正弦波的精确幅度。否则,能量将在称为spectral leakage的过程中分布在多个FFT区间。 你可以通过改变样本数来确认这一点,使你的正弦波频率是频率间隔的倍数:

t = 0:1/50000:1-1/50000;

Windowing输入信号也可以帮助控制泄漏量。