欢迎来到天天文库
浏览记录
ID:38639205
大小:66.50 KB
页数:5页
时间:2019-06-16
《关于TIFFT库的使用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、这篇文章是应一些找我讨论DSP的同学所写,贴在这里大家一起学习。曾有不少论坛上的同学(包括DSP算法讨论群里的一些同学)问过我关于TI的FFT库的使用,这里我将我使用过的一些经验说一下。TI的这个FFT库在计算速度、计算精度以及数据存储等方面是做了不少优化的,比如数据存储,若作N点的FFT,供查表用的旋转因子必须有N/2点的正弦值与N/2点的余弦值,这个库将其压缩成3N/4点的正弦值,因此就节省了N/4点的存储空间;另外计算N点实数FFT时,一般简单的做法是将N点实数的虚部全化为0来处理,而这个库则把N点实数数据打包成N/2点复数数据来处理,在计算
2、速度和存储空间都有很大改进。之前我浏览helloDSP论坛的帖子,有很多人发出疑问:为什么我计算出的mag值全为零?这样的帖子真不少见;TI的官方工程师论坛不少老外也发问:WhydidIgetallzeros?事实上我想主要原因是输入数据格式不对。我认为使用这个库主要注意一下两点:1.数据输入输出的Q格式;2.存储空间分配。下面以32位实数FFT为例来说明。注意到文档的40页有如下说明:1.在函数voidcalc(RFFT32_handle)有如下一句:NotethattheinputandoutputdataareinQ31format.;2.在
3、函数voidmag(FFT128R_handle)有如下一句:NotethatthemagnitudeoutputisstoredinQ30format.因为28x系列DSP是定点处理器,而FFT计算涉及到不少浮点计算,TI使用Q格式来解决这个问题(Q格式说明可参考sprc087_IQmath)。事实上输入数据采用Q31格式能在避免计算溢出前提下获得最好的计算精度。对AD采样的数据进行FFT计算,定义计算缓冲区数组:longipcb[N+2];因为AD结果寄存器是12位的,在数据左对齐的情况下直接左移15位即可:ipcb[ConversionCou
4、nt]=((unsignedlong)AdcRegs.ADCRESULT0)<<15;另外我记得有份文档提到在某些存储器下是右对齐,此时则需左移19位,大家在使用时注意这个问题。当采样完成后,按照FFT库的文档上的说明或者仿照文档附带的例程,进行相应函数调用来实现自己的FFT计算,比如按计算点数来定义各个变量数组,是否加窗,是否求解幅值平方值等。在进行存储器分配时,文档上要求(128点实数FFT为例):FFTipcbALIGN(256):{}>L0L1RAMPAGE1FFTmag>L0L1RAMPAGE1FFTtf>NVMEMPAGE0/*Nonv
5、olatilememory*/.econst>NVMEMPAGE0/*Nonvolatilememory*/注意两点:FFT计算缓冲区FFTipcb需在page1上连续分配2N个位置(以ALIGN来指定),FFTtf(旋转因子)需放在Nonvolatilememory的page0内(事实上如何才能为Nonvolatile我也不清楚)。FFTtf位置这点我之前在调试时对计算FFT影响很大,因为twiddlefactor若因存储冲突肯定会造成查表值不准确,那计算FFT时肯定就不对了。有个论坛帖子作者说一定要放在origin=0x008000开始位置,其
6、实也不对,大家可自己去试验;后面我也会给出我的存储配置文件(即.cmd文件内容)。无图无真相,下面给出计算实例。假设有一信号包含两个谐波频率值,分别为413.0Hz(幅值设为1.00V)和287.0Hz(幅值设为0.400V),利用函数发生器产生这两路信号再混合,加上偏置后送入AD采样。设采样频率1024Hz,共采样2048点。图1的采样点均是右对齐的12位采样结果值。图1AD采样得到的采样点图利用TI的FFT库进行计算,查看mag数组,得到图2.图2FFT计算结果(mag数组)以1024Hz采样2048点,采样时间2s,对两个谐波频率可采样到整数
7、倍周期;从另一个角度理解,此时最小频率分辨率为0.5Hz,413.0Hz与287.0Hz均是其整数倍数,故不会发生频谱展宽或混叠情况,计算得到的频谱图应该为两根尖峰线。从图2结果也能看出这一点。查看mag数组,可知第一根尖峰线下标574,第二根尖峰线下标826,故真实频率值分别为:574*0.5=287Hz,826*0.5=413Hz若要计算幅值,按照输出的Q30格式除相应系数即可。注意最好另外定义浮点数组来做除运算,因为整型数据做除运算(或者右移位操作)会丢失小数位数据。若要验证DSP的FFT计算结果,可将AD数据从CCS导入到MATLAB中做对
8、比计算。有些同学不清楚如何导入导出,下面说一下步骤。1.save,选择保存类型Integer(若是其他进制还需在MATLA
此文档下载收益归作者所有