【问题标题】:why FFT results in high frequency range are not correct?为什么高频范围内的 FFT 结果不正确?
【发布时间】:2014-08-25 23:20:43
【问题描述】:

我正在使用 matlab 进行 FFT。我在其上进行 fft 的时间段为 1 秒,它由 50000 个 equlay 空间样本组成。我想测试 FFT 结果。所以我给出了一个如下的输入(波),它是一个正弦波的复合体(我通过 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);  

【问题讨论】:

  • “结果”是什么意思?
  • 请注意,这里有 50001 个样本。
  • 嗨 Oli,“结果”是指时域信号指定的频率中的 FFT 幅度。例如,50 赫兹频率的幅度应该是 100,它是,但对于更高的频率,它与我在时域信号中表示的不完全一样,它会导致我的计算出现显着错误!
  • 这是频谱泄漏 - 有限长度序列的离散 FT 的固有属性。
  • 在 R2014a 上,看起来幅度排列:plot([50 123 203 223 331 2812 5752 7993],[100 1 2 3 4 5 6 7],'xr')

标签: matlab fft


【解决方案1】:

正如 Oli Charlesworth 所指出的,您正在采用 50001 点的 FFT,这意味着频率间隔为 1/50001。

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

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

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

【讨论】:

  • 感谢您的额外解释我明白了。
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 2022-01-07
  • 2015-08-23
  • 2015-07-16
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多