FFT算法的频率准确性问题
1、问题描述
做项目需要对采样的正弦波数据进行幅值解析,因为不需要考虑相位关系,所以直接用FFT算法比较简单,而且matlab有封装好的函数,网上也有很多基于C和C++的源代码,学习起来也非常的方便。但是在计算频率时出现了得不到目标信号频率的准确值,而在频率周围的幅值比较大的问题。
eg:目标信号为1kHz幅值为10与1.9khz幅值为20的正弦波,FFT后的2khz信号幅值在1.8kHz和2kHz比较大,而1.9kHz的值明显误差较大,如图1、图2:
2、问题原因
采样数据在经过FFT算法之后可以得到离散信号在对应频率上的幅值。但是由于采样频率和采样点数量的选择问题,导致不能显示出对应频率点的幅值。
上面所提供示例只能列出1.8k与2kHz频率点,而无法列出1.9kHz目标频率点。
3、解决方案
选择合适的采样频率和采样点数进行分析,使得可以计算出目标曲线的对应频率值即可得到非常高的FFT结果
另:
采样频率为 fs
采样点有 n 个
FFT后第 m 个点的频率为 m*fs/n ,则 m 必然为整数
若需要分析的信号包含两个频率的正弦波,其频率分别为 f1、 f2
则需要满足:
m1*fs/n=f1
m2*fs/n=f2
即:m1=f1*n/fs 与 m2=f2*n/fs 均为整数
满足以上关系即可以获得比较准确的FFT结果。
以上举例中,将第二个频率改成 2kHz 即可满足以上关系,得到的FFT图像如下: