问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

FFT算法的频率准确性问题

创作时间:
作者:
@小白创作中心

FFT算法的频率准确性问题

引用
CSDN
1.
https://blog.csdn.net/qq_42892587/article/details/122960935

在信号处理领域,快速傅里叶变换(FFT)是一种广泛使用的算法,用于将时域信号转换为频域表示。然而,在实际应用中,由于采样频率和采样点数的选择不当,可能会导致FFT结果的频率准确性问题。本文通过一个具体的工程案例,详细探讨了这一问题的原因和解决方案。

FFT算法的频率准确性问题

1、问题描述

在项目中需要对采样的正弦波数据进行幅值解析。由于不需要考虑相位关系,因此选择使用FFT算法。MATLAB提供了封装好的函数,网上也有很多基于C和C++的源代码,学习起来非常方便。但是在计算频率时出现了得不到目标信号频率的准确值,而在频率周围的幅值比较大的问题。

例如,对于一个包含1kHz幅值为10和1.9kHz幅值为20的正弦波信号,FFT后的结果在1.8kHz和2kHz处的幅值较大,而1.9kHz处的幅值误差较大。如图1和图2所示:


图1:对1kHz与2KHz叠加后的曲线进行傅里叶分析

图2:FFT曲线在2kHz位置明显有误差

2、问题原因

采样数据在经过FFT算法之后可以得到离散信号在对应频率上的幅值。但是由于采样频率和采样点数量的选择问题,导致不能显示出对应频率点的幅值。例如,上述示例中只能列出1.8kHz和2kHz频率点,而无法列出1.9kHz的目标频率点,如图3所示:

图3:图像无法标注出1.9kHz频率,导致计算有误差

3、解决方案

选择合适的采样频率和采样点数进行分析,使得可以计算出目标曲线的对应频率值,即可得到非常准确的FFT结果。

具体来说:

  • 采样频率为fs
  • 采样点有n
  • FFT后第m个点的频率为m*fs/n,则m必然为整数
  • 若需要分析的信号包含两个频率的正弦波,其频率分别为f1f2
  • 则需要满足:m1*fs/n=f1m2*fs/n=f2
  • 即:m1=f1*n/fsm2=f2*n/fs均为整数

满足以上关系即可获得比较准确的FFT结果。例如,将第二个频率改成 2kHz 即可满足以上关系,得到的FFT图像如下:

图4:图像可以标注出2kHz频率,计算准确

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号