欢迎光临散文网 会员登陆 & 注册

[DSP学习笔记]基于TMS320F28335的FFT以及加窗函数的实现

2023-01-19 22:50 作者:七草稀饭  | 我要投稿

首先我们先将C2000 wave中我们所需要的函数库给导入到我们的新建工程中(可见于我实现FIR滤波文章中导入函数库的操作)。

工程中可见有以下文件。(仅FFT可删除滤波有关文件)

接着新建INPUT.c与window.c

借助MATLAB我们来生成所需的输入信号与窗函数

生成输入信号的MATLAB程序如下:

将record.txt的文件内容复制到INPUT.c中,如下:


仅截取了部分

接下我们进行窗函数的生成。

1.加窗之前,首先我们要明白我们为什么要加窗。

在实际应用中,我们采集到的信号通常是较长的非周期时间序列,在进行FFT时,需要对信号进行截断。截断后得到的信号通常是非周期信号,所以FFT结果就变成了连续的谱线,周期信号的频率-幅值不再是一条垂直的直线,而是一条曲线,同时幅值下降,泄露到曲线其他频率点,即我们常说的频谱泄露。而窗函数一个周期函数,窗函数与截断信号相乘后,会变成比较接近周期函数的波形(实际上就是利用窗函数进行调制)。加窗后的信号进行FFT后,得到的频谱曲线会更窄,趋向于垂直直线。因此对频谱泄露有一定改善。

2.知道为什么要加窗后,我们再来根据实际情况来选择我们所需要的窗函数。

通常情况下,我们不对输入信号进行处理,而直接截断情况下相当于给信号加了一个矩形窗。

如果我们对于FFT后的结果要求精确的幅值,平顶窗是我们的首选。

如果我们对应FFT后的结果要求精确的频率点,则可以选择汉宁窗。

3.选择完窗函数,我们还要对FFT后的结果乘以他们对应的恢复系数(窗函数对信号有衰减),如下表:

了解完以上知识,我们便可以继续我们的实验。

在MATLAB命令行窗口敲入window,进入下列界面并完成下列配置。(本次测试选用汉宁窗)

点击文件,导出,导出到工作区。

 但是,我们工程实际应用,还需对得到的窗函数进行处理,将其转化为Q16型(在官方给出的例程中有提出)。故我们通过编写MATLAB文件实现转换,并保存到本地的window.txt文件中。


 将window.txt的内容复制到window.c中,如下:


仅截取了部分

接下来我们对RFFT.c文件进行编写,有以下函数

初始化函数:

对幅度进行计算的函数:

对幅值与频率点计算的函数

需注意的是,FFT的返回值不是幅值,我们需对其进行转换。

首先对FFT的结果进行取模,使用RFFT_f32_mag()函数,得到幅度。

接着对幅度再进行相应的处理,如下表:

即,直流分量的幅值等于幅度除以采样点数,其余的的幅值等于幅值除以采样点数的一半。

在主函数中,对RFFT_Init()和RFFT_Caculate()完成调用,即可。

准备阶段结束,进入仿真。

仿真结果如下:

频率点:

对应幅值:

直流分量:

实验结果与输入信号相吻合,测试结束。

本文如有错误,也请多多指出。

[DSP学习笔记]基于TMS320F28335的FFT以及加窗函数的实现的评论 (共 条)

分享到微博请遵守国家法律