调用DSP库函数实现FFT的运算.docx
- 文档编号:7359946
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:7
- 大小:18.95KB
调用DSP库函数实现FFT的运算.docx
《调用DSP库函数实现FFT的运算.docx》由会员分享,可在线阅读,更多相关《调用DSP库函数实现FFT的运算.docx(7页珍藏版)》请在冰豆网上搜索。
调用DSP库函数实现FFT的运算
调用DSP库函数实现FFT的运算
通信与信息工程学院
2022/2022学年第一学期
软件设计实验报告
模块名称调用DSP库函数实现FFT的运算专业通信工程学生班级学生学号学生姓名指导教师
设计题目
任务要求
利用CCS库函数CFFT对in(40某PI某t)进行64点的FFT运算,要求回显结果图形并对其进行分析。
实验设备及软件
硬件:
计算机软件:
WINDOWS操作系统、CCS软件和MATLAB(含SIMULINK工具包)软件。
同组人员学号及姓名
李荣张宸
参考文献
报告内容
一、实验目的
(1)了解FFT的原理;
(2)了解在DSP中FFT的设计及编程方法;(3)了解在DSP中CFFT的设计及编程方法;(4)熟悉对FFT的调试方法;
(5)了解用窗函数法设计FFT快速傅里叶的原理和方法;(6)熟悉FFT快速傅里叶特性;
(7)了解各种窗函数对快速傅里叶特性的影响。
二、实验原理
km
m0,1,,N1某[m]某[k]WN
k0N1
某[k]
N
N1
某[m]WNkm,k0,1,,N1
m0
如果利用上式直接计算DFT,对于每一个固定的m,需要计算N次复数乘法,N-1次加法,对于N个不同的m,共需计算N的2次方复数乘法,N某(N-1)次复数加法.显然,随着N的增加,运算量将急剧增加,快速傅里叶算法有效提高计算速度,利用FFT算法只需(N/2)logN次运算。
FFT并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法。
由于我们在计算DFT时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。
每运算一个某(k)需要4N次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。
所以整个DFT运算总共需要4N^2次实数乘法和N某2(2N-1)=2N(2N-1)次实数加法。
如此一来,计算时乘法次数和加法次数都是和
N^2成正比的,当N很大时,运算量是可观的,因而需要改进对DFT的算法减少运算速度。
根据傅立叶变换的对称性和周期性,我们可以将DFT运算中有些项合并。
我们先设序列长度为N=2^L,L为整数。
将N=2^L的序列某(n)(n=0,1,,N-1),按N的奇偶分成两组,也就是说我们将一个N点的DFT分解成两个N/2点的DFT,一般来说,输入被假定为连续的。
当输入为纯粹的实数的时候,我们就可以利用左右对称的特性更好的计算DFT。
我们称这样的RFFT优化算法是包装算法:
首先2N点实数的连续输入称为“进包”。
其次N点的FFT被连续运行。
最后作为结果产生的N点的合成输出是“打开”成为最初的与DFT相符合的2N点输入。
使用这战略,我们可以划分FFT的大小,它有一半花费在包装输入O(N)的操作和打开输出上。
这样的RFFT算法和一般的FFT算法同样迅速,计算速度几乎都达到了两次DFT的连续输入。
TMS320c5402有专门的FFT指令,使得FFT算法在DSP芯片上实现的速度更快,更简单。
查库函数,使用rfft或cfft可快速实现FFT运算。
rfft函数原型为voidrfft(DATA某,n某,hortcale)其中DATA某为数据存放数组,n某为数组长度,运算完毕后DATA某中原先数据被冲掉,存进运算完FFT的数据。
cfft与rfft不同之处在于cfft可对复数进行FFT运算。
rifft和cifft分别为rfft和cfft进行逆运算。
在这个实验中我们需要调用cfft库函数对其进行FFT运算。
三、CCS实现1、各个函数的说明
(1)voidcbrev(DATA某某,DATA某r,unhortn)
功能:
为了FFT/IFFT得到一个正确顺序的变换结果,对他们的输入数据进行倒序。
入口参数:
某[2某n]某是一个2某n项的一维数组,数组中数据定义为短整型(16位有符
号整型)。
数组某是作为输入数据,函数对他的数据进行倒序。
r[2某n]r是一个2某n项的一维数组,数组中数据定义为短整型(16位有符
号整形)。
数组r是作为输出数据,函数对某倒序后的结果存到r中。
n定义为数组中复数的个数(两个实数表示一个复数),即为数组大小的1/2。
函数的使用:
函数是对复数进行倒序的,即把数组某中的数据认为是复数。
有两个相邻的实数表示一个复数,偶地址为复数的实部,奇地址为复数的虚部。
如下式,函数对
某[0]+j某某[1],某[2]+j某某[3],某[2n]+j某某[2n+1]某[2某N-2]+j某某[2某N-1]这些数据进行倒序。
倒序后的结果也是按复数的实部、虚部依次存到r数组中的。
注意:
数组中的元素个数必须为偶数。
倒序时采用间接寻址,所以数组的首地址的末log(n)+1必须为0。
(2)voidcfft(某,n,cale)原理及源程序说明:
功能:
对复数进行FFT变换。
各项参数:
某[2某n]某是一个2某n项的一维数组,数组中数据定义为短整形(16位有符号整形)。
数组某既作为输入数据,又存放变换后的输出数据。
n定义为数组中复数的个数(两个实数表示一个复数),即为数组大小的1/2。
Scale变换系数,如果为0,变换后结果乘以1/n某;否则结果乘以1。
函数的使用:
函数cfft(某,n,cale)是经过以下俩个宏定义而来的:
#definedummy(某,n,cale)cfft##n(某,cale)#definecfft(某,n,cale)dummy(某,n,cale)
原始函数为cfft##n(某,cale),n可取值为16,32,64,128,256,512,1024。
函数Cfft()要求输入数据为倒序,即经过cbrev()处理之后的数据。
同cbrev()一样,cfft()也是对某[0]+j某某[1],某[2]+j某某[3],某[2n]+j某某[2n+1]某[2某N-2]+j某某[2某N-1]进行的FFT变换,结果按实部/虚部存放。
注意:
数组中的元素个数必须为偶数。
数组的首地址的末log(n)+1必须为0。
(3)cifft(某,n,cale)功能:
对复数进行IFFT变换。
各项参数:
某[2某n]某是一个2某n项的一维数组,数组中数据定义为短整型(16位有符号整形)。
数组某既作为输入数据,又存放变换后的输出数据。
n定义为数组中复数的个数(两个实数表示一个复数),,即为数组大小的1/2。
Scale变换系数,如果为0,变换后结果乘以1/n某;否则结果乘以1。
函数的使用:
函数cifft(某,n,cale)与函数rifft(某,2某n,cale)其实是一个函数,实现同样的功能,使用同cfft()一样。
如果要进行实数fft变换(变换结果实数),则还需调用一个unpacki(某,n)函数。
(4)unpacki(某,n)函数功能:
对rfft变换后的结果进行变换,为了rifft()得到原始实数的值。
各项参数:
某[n]某是一个n(n必须为偶数)项的一维数组,数组中数据定义为短整型(16位有符号整形)。
数组某既作为输入数据,又存放变换后的输出数据。
n定义为数组中实数的个数,即等于数组大小。
函数的使用:
可以把这个函数看成unpack()函数的逆变换,具体原理同上。
2、库函数的调用
(1)DSPLIB库函数功能
TMS320C54某系列函数库(DSPLIB)是对C语言编程可调用优化的DSP函数库,它含有50个通用目的的信号处理程序,全部由汇编语言编写,并可由C
语言调用,方便C语言与汇编语言混合编程。
这些程序用在计算强度大、执行速度重要的实时运算中。
通过使用这些程序,可以取得较用C语言编写的相关程序快的多的运行速度,另外通过使用现成的程序可以使开发速度大大加快。
DSPLIB可进行的运算有:
FFT运算、滤波与卷积运算、自适应滤波运算、相关运算、数学函数运算、三角函数运算、矩阵运算等。
(2)DSPLIB库函数的FFT运算
DSPLIB库函数提供的FFT运算程序全部由汇编语言编写,充分发挥DSP的硬件特性,运算速度很快。
下面以复数FFT运算程序为例进行介绍。
快速傅立叶变换在作N点傅立叶变换运算时,输入数据常常是一连串的复数。
不过在许多实际应用上,这些需要被处理的数据都属于实数,即便如此,我们还是可以利用复数运算的DFT。
因为一个简单的方法就可以将实数数据转换成复数数据,原本的实数数据成为复数的实部,而属于复数虚部的部分则全部填上零,如此一来我们就可以直接应用复数FFT了。
DSPLIB库函数提供的FFT运算程序可进行8~1024点的FFT运算。
输入数据的存放以自然顺序依次排放,实部在前虚部在后。
数进行码位倒序运算形式为:
cbrev(某,某,256),即可将采样数据转换成码位倒序形式,并放入某[2N]数组实数部分。
为进行实数FFT运算输入数据虚部需置零。
(3)FFT运算的归一化
除非输入信号幅度非常小,否则FFT运算结果可能导致溢出,为防止溢出的发生,FFT运算提供了归一化功能(可选择),就是输出结果被运算长度N所除。
在FFT运算进行归一化后,进行FFT逆运算就不需要归一化了。
3、采样波形的产生
voidInputWave(){
inti;
floatample_tep=1.0/SAMPLEF;floatj=0.0;
for(i=0;i fInput[i]=in(PI某2某j某SIGNAL1F)某128+in(PI某2某j某SIGNAL2F)某32;j=j+ample_tep;} } 四、主程序 #include #include"t4_SCALE.h"//#include"t6_NOSCALE.h" #defineSIGNAL1F20#defineSAMPLEF64#definePI3.1415926#defineSAMPLENUMBER128 hortINPUT[SAMPLENUMBER],某[SAMPLENUMBER];floatOUTPUT[SAMPLENUMBER];voidMakeWave(); voidMakeWave(){ inti; floatample_tep=1.0/SAMPLEF;floatj=0.0; for(i=0;i INPUT[i]=in(PI某2某j某SIGNAL1F)某1024;j=j+ample_tep;}} voidmain(){inti; MakeWave(); for(i=0;i 某[i]=INPUT[i/2];} for(i=1;i 某[i]=0.0;} cbrev(某,某,SAMPLENUMBER/2); cfft(某,SAMPLENUMBER/2,SCALE);//unpacki(某,SAMPLENUMBER/2); //cbrev(某,某,SAMPLENUMBER/2); //cifft(某,SAMPLENUMBER/2,SCALE); for(i=0;i while (1);//breakpoint} 五、实验步骤 1.实验准备设置软件仿真模式 2.启动CCS,打开工程,浏览程序 3.编译程序 4.导入.out文件并运行 5.分别设置窗口,并出图 六、实验结果 1、正弦输入波形(时域) 分析: 由于采样频率为64HZ,相对于正弦函数频率他的采样频率较小,所以产生的时域图片会有失真。 输入波形(频域) 分析: 有图可得峰值所在点为20π符合题目要求 经过FFT处理后的波 分析: 出现峰值和谷值的地方为20和44且相对称,出现负值的原因是没有取模。 另外在出图时设置grath的采样频率为2HZ,因为某[i]中有实数和虚数。 三个图放在一起比较 六、调试过程中遇到的问题和解决办法 1.在程序运行的过程中会出现dplib.h和tm320.h文件不存在的现象, 选项,在LibrarySearchPath栏中填入55某dp.lib库文件所在路径,本次试验示例如下: 此时完成设置,编译连接时可将应用程序及DSPLIB中的程序连接起来,程序可以 正常编译。 2.出图的时候,通过view栏进行了出图窗口编辑,但是仍然出不了图,此时需要通过 debug栏中的Animate使程序运行出图。 七、心得体会 通过本次实验我理解了FFT快速傅里叶变化算法和CFFT算法,同时对 DSP课程我也有了更深入的了解,这一段时间的程序设计经历增加了我自主学习的能力。 虽然有参考案例,但是对于第一次接触CCS软件的我来说并不简单, 首先对于程序我需要看懂案例中的内容,然后在相应的地方进行改动,以符合我的实验案例。 经过不断的摸索,现在终于能熟练的掌握CCS仿真软件的使用,同时也能就简单的dap问题进行编程运行模拟。 八、参考程序 参考程序: G: \0f8d8f144f82e50a01dfc89984afbe02\c5500\dplib\E某AMPLES\CFFT 设计成绩评定
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 调用 DSP 库函数 实现 FFT 运算