Board logo

标题: 深入解析C28x DSC傅立叶变换库 [打印本页]

作者: yuyang911220    时间: 2017-6-19 10:17     标题: 深入解析C28x DSC傅立叶变换库

用于 C2000TM 微处理器的 controlSUITETM 是一套全面的软件基础设施和软件工具集,旨在最大程度地缩短软件开发时间。从特定于器件的驱动程序和支持软件到复杂系统应用中的完整系统示例,controlSUITETM 在每个开发和评估阶段都提供了程序库和示例


      TI公司的C28x+FPU架构以其高速的数据处理能力和简单易用的编程方法,必将成为后续高性能电机控制的发展趋势之一。上次讲了TI公司常用浮点单元函数库fastRTS的一些内容,一些常用的函数,如正余弦、正切、反正切、平方根等都可以供我们直接调用,不用费时去自己编写、优化了。同时,TI还提供了可供我们直接调用的、已经高度优化的傅立叶变换、反变换函数,包括RFFT_f32、RFFT_f32u、RFFT_f32_mag、RFFT_f32s_mag、RFFT_f32_phase以及RFFT_f32_sincostable。其具体的使用方法描述如下:


如果使用定点格式,则引用IQmath格式


首先声明函数,即voidRFFT_f32(RFFT_F32_STRUCT*)


其结构体内部的定义为:



typedefstruct{


float32        *InBuf;float32         *OutBuf; float32        *CosSinBuf; float32        *MagBuf;float32         *PhaseBuf;Uint16         FFTSize; Uint16          FFTStages;


}RFFT_F32_STRUCT;


实际的调用为:


#includeFPU.h


#defineFFT_SIZE  128       /*32,64,128,256,etc       */


#defineFFT_STAGES  7       /*log2(FFT_SIZE)              */


/*AligntheINBUFsectionto2*FFT_SIZEinthelinkerfile  */


#pragmaDATA_SECTION(Inbuf,"INBUF");


float32InBuffer[FFT_SIZE];


float32OutBuffer[FFT_SIZE];float32 TwiddleBuffer[FFT_SIZE];RFFT_F32_STRUCT fft;


main()


{



fft.InBuf=InBuffer;         /*Inputdatabuffer     */ fft.OutBuf =OutBuffer;       /*FFToutputbuffer     */ fft.CosSinBuf=TwiddleBuffer;/*Twiddlefactorbuffer*/ fft.FFTSize=FFT_SIZE;       /*FFTlength            */ fft.FFTStages=FFT_STAGES;   /*FFTStages            */


…………………


RFFT_f32_sincostable(&fft)/*Initializetwiddlebuffer*/


RFFT_f32(&fft);            /*Calculateoutput         */


}



最终的性能测试为:



FFTSize

C-CallableASM

32

608cycles

64

1278cycles

128

2784cycles

256

6170cycles

512

13672cycles

上面的性能指标中,所有的缓存区与堆栈都是放在DSP的片内RAM中的(零等待)。曾经为了节省片内资源,放在片外扩展的RAM中做过测试,发现结果总是不对。后来才发现每次调用片外RAM的数据都需要几十个ns,几千次读写下来这个总延时已经远远超过了中断周期,自然不能正常执行了。现在想想,像28335这样的高性能大容量芯片,其片内存储再多放几个fft的缓冲区也没有关系啊。






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0