基于C2000系列DSP的FFT

DSP FFT C2000
汉云
发布时间: 2018-10-30
阅读: 5683

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


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


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


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


无标题.png



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


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




无标题.png


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


无标题.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[i] = 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

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




无标题.png


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


FFT的直接运行结果如下图



无标题.png



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

例如:

OutBuf[0]=5199.99609

OutBuf[1]=-0.00438818475


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





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


无标题.png





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


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


无标题.png




如下,是运算的幅值的结果数值列表,可以看到,由于只是计算


原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (1)
汉云 擅长:无
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)