matlab - 为什么高频范围内的 FFT 结果不正确?

标签 matlab fft

我正在使用 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);  

最佳答案

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

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

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

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

关于matlab - 为什么高频范围内的 FFT 结果不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25488802/

相关文章:

matlab - MATLAB 中 10 倍 SVM 分类的示例

matlab - 当用户定义的类是结构的字段时,覆盖其值的显示方式

java - Android whiSTLe 检测与麦克风

c - FFTW 单精度库在使用 SIMD 优化时输出不正确的 DFT

image - 在MATLAB中对图像进行高通巴特沃斯滤波器

matlab - 为什么在MATLAB中24.0000不等于24.0000?

java - 你能像在 Matlab 中那样在 Java 中操作数组吗?

c++ - C/C++ 中固定长度实数输入数据的高效二维 FFT

java - 使用 FFT 计算频率时的错误值

c++ - 有没有关于如何使用英特尔 MKL FFT 的简单 C++ 示例?