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

首先我们先将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()完成调用,即可。
准备阶段结束,进入仿真。
仿真结果如下:
频率点:

对应幅值:

直流分量:

实验结果与输入信号相吻合,测试结束。
本文如有错误,也请多多指出。