查看: 1270|回复: 0

[经验] 基于C2000系列DSP的FFT

[复制链接]

该用户从未签到

发表于 2021-1-11 21:09:03 | 显示全部楼层 |阅读模式
分享到:

虽然TI的C2000类的DSP被归类于高性能MCU了,但是其他DSP性能相较于其他的单片机中的DPS功能,还是要强大不少。而C2000类的DSP入门简单,成本相对于其他的DSP要低很多,电路的设计也简单,从而有很大量的应用的地方,从ADC采样计算到电机控制,都有使用到C2000的DSP芯片,其中最热门的当属[url=]TMS320F28[/url]335与[url=]TMS320F28[/url]12了。


      本文就基于TMS320F28335的硬件为平台,实现最常用的一种信号处理的算法——FFT算法。


     FFT算法的熟练使用,要从理论上开始进行学习,但是理论学习并不是本文的要点,而是要让大家最快的使用起来FFT算法,得到正常的结果,从而加快项目的进度。


    TMS320F28335FFT运算,有两种方式,一是自己根据FFT的原理写算法程序;一是使用TI提供的DSP库进行。前者,可以实现,也可以方便的进行修改与优化,但要对FFT有非常深入的理解,本人试着自己写过,虽然结果上是正确的,但是优化上总是比不上TIDSP库的效率。所以,建议大家还是使用TIDSP库进行FFT运行,为是学习,可以自己写一下FFT的运算。


7.png



C2000的软件开发,一般是使用controlSUITE的软件套件,其针对C2000的芯片进行了深度的优化。包括了我们要使用的DSP库。

controlSUITE下载后,要进行安装。安装后,可以在目录X:\ti\controlSUITE\libs\dsp\FPU\v131\examples下找到DSP库的相关例程程序。其中包括了如下的几个算法。


8.png


这里使用RFFT_f32()函数进行FFT,这个函数是调用FFT的运算函数。其只有一个参数,就是一个RFFT_F32_STRUCT类型的结构体变量。


9.png


如上所示,这个变量的成员有7个,要对这7个成员进行分别设置后,调用FFT函数才会有正确的结果,否则FFT的结果是不正确的。


设置:

FFTSize1024

FFTStages10,就是210次方为1024

InBuf为输入波形的数据的首地址

OutBuf为计算结果的输出数据的首地址

CosSinBuf为旋转因子的数据首地址

MagBuf为计算的幅值的结果数据首地址

PhaseBuf为相位计算结果的数据首地址


这里的MagBufPhaseBuf都是要使用相应的API函数才会计算出结果的,并不是运行完FFT就会有结果的。


由于一般的FTT结果都是ADC后的数据,所以,首先,构造一个虚拟的ADC采样波形数据,这里使用一个cos波形,其幅值为50,频率f050Hz,采样率fss25600,在其中添加上三次谐波成本,也就是第二个幅值为10cos公式的结果值,并添加了幅值为5的直流分量。这里的这个波形,就是典型的市电的频率的,对于电力行业的同僚,可以统一使用这个公式。


这里要注意,cos的计算要使用弧度为单位而不是角度,所以,这里使用了2*π了。


rfft_input = 50.0f*cos(2.0f*3.1415926f*f0/fss*(float)i+3.1415926f/3.0f)+10.0f*cos(2.0f*3.1415926f*3.0f*f0/fss*(float)i+3.1415926f/4.0f)

+5;


注:i01023,可以使用for进行赋值。


由于比较大的三次谐波与直流分量的加入,波形已经发生了畸变,但还是可以大体上看出来是个三角余弦函数的波形。

这个公式在CCS中的波形如下:

显示方法为:tools ——> Graph——> Sigle Time

设置好波形数据的首地址,波形数据量,与步长等参数后,就可以显示出这个波形了。




10.png



通过RFFT_f32_sincostable函数首先旋转因子,这个函数的参数也是RFFT_F32_STRUCT,而在这个函数中也就会根据你的FFT计算的参数配置进行计算出旋转因子,至于旋转因子的功能,要去看看FFT的原理才可以了,这里不赘述。

FFT的直接运行结果如下图



11.png


这里的数据是复数的形式,也就是在这一个数组中,每二个元素代表了一个复数的实部与虚部,1024的数据长度中,一共有512个复数。

例如:

OutBuf[0]=5199.99609

OutBuf[1]=-0.00438818475


那么这个复数就是5199.99609-0.00438818475j


调用函数RFFT_f32_mag可以计算出每个复数的模,也就是波形中的幅值,复数取模的公式为:


12.png

也就是实部与虚部的平方和的正根。


如下是计算出的FFT的幅值的的图表,可以看到基波分量、直流分量与三次谐波的地方有一个比较大的值,其他的值都几乎是为0

14.png



回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-11-23 15:39 , Processed in 0.118843 second(s), 16 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.