基于DSPLib的FFT程序设计实验一、实验目的1、了解FFT的原理;2、了解在DSP中FFT的设计及编程方法;3、熟悉对DSPLIB的调用方法;二、实验内容(要求)信号x(n)是2个频率分别为1kHz和2kHz余弦信号的合成,取样频率为fs=16000Hz,采用FFT对该信号进行频域分析。三、实验原理(背景知识)1、时间抽选基2FFT算法的基本原理。对于序列x[n](0≤n≤N-1),其频谱为:X(k)=DFT[x(n)]=10)(NnknNWnx(0≤n≤N-1),其中:旋转因子NjNeW2在x[n]为复数序列的情况下,完全可以直接运算N点DFT需要(N-1)2次复数乘法和N(N-1)次复数加法。因此,对于一些相当大的N值来说,直接计算它的DFT所需计算量很大。FFT(快速傅立叶变换)的基本思想为:将原来的N点序列最终分成分成两点为一组序列,并将这些序列的DFT通过蝶形运算(见下图)组合起来得到原序列的DFT。N点FFT仅需NN2log2次复数乘法和NN2log次复数加法。图18点FFT运算流图2、DSPLib的应用。CCS提供DSPLib,其中包含了基本的数学计算和数字信号处理常用算法模块的函数,可直接调用这些函数实现一些数字信号处理算法。本实验主要使用了DSPLib的cbrev,rfft两个函数实现数字序列的逆序和DFT的计算。dsplib位于C:\ti\c5400\dsplib其用户手册为:TMS320C54xdsplibraryprogramer'sreference.pdf3、CCS中的graph详细使用说明。CCS提供显示时频图(Time/Frequency),运算结果也可以通过CCS提供的图形功能经过一定处理显示出来,CCS提供的图形显示包括时频分析、星座图、眼图和图像显示。如表1所示,用户准备好需要显示的数据后,选择命令View→Graph,设置相应的参数,即可按所选图形类型显示数据。程序框图如下:开始待分析数据变址运算基2FFT运算计算幅度谱返回输入待分析数据四、实验步骤1、打开CCS,并设置好相对应的参数,采用软件仿真。2、编写主函数,包含必要的头文件,并设置好相对应的路径。完毕将支持的库函数加入工程中。3、接着编写中断向量表,中断向量表只要和主函数main中断一一对应就行。4、编译,看一下会产生哪些链接文件,然后编写链接文件。在这里注意字对齐的格式要求。5、编译通过后,用软件仿真,选择命令View→Graph→Time/Frequency对话框,验证是否有逻辑错误,然后进行修改。五、程序源代码1、主函数:#includemath.h#includetms320.h#includedsplib.h#defineNx1024#definepi3.1415924#definePMST(unsignedint*)0x1Dinti,j;intscale=1;intnoscale=0;DATAx[Nx],x_tempt[Nx];DATAy[Nx/2];#pragmaDATA_SECTION(x,.input)#pragmaDATA_SECTION(x_tempt,.input_tempt)#pragmaDATA_SECTION(y,.output)voiddataio();voidmain(){*PMST=0x00a0;dataio();for(i=0;iNx;i++){x_tempt[i]=x[i];}cbrev(x,x,Nx/2);rfft(x,Nx,scale);y[0]=x[0];y[Nx/2-1]=abs(x[1]);j=1;for(i=2;iNx;i=i+2){y[j]=sqrt(pow(x[i],2)+pow(x[i+1],2));j++;}return;}voiddataio(){//getdataforio}2、中断函数:.ref_c_int00.sect.vectorsrs:BD_c_int00;Restnopnopnmi:.space4*16;NMI,SINT16sint17:.space4*16;SINT17sint18:.space4*16;SINT18sint19:.space4*16;SINT19sint20:.space4*16;SINT20sint21:.space4*16;SINT21sint22:.space4*16;SINT22sint23:.space4*16;SINT23sint24:.space4*16;SINT24sint25:.space4*16;SINT25sint26:.space4*16;SINT26sint27:.space4*16;SINT27sint28:.space4*16;SINT28sint29:.space4*16;SINT29sint30:.space4*16;SINT30int0:.space4*16;INT0,SINT0int1:.space4*16;INT1,SINT1int2:.space4*16;INT2,SINT2tint0:.space4*16;TINT0,SINT3brint0:.space4*16;BRINT0,SINT4bxint0:.space4*16;BXINT0,SINT5dmac0:.space4*16;DMAC0,brint2,SINT6dmac1:.space4*16;DMAC1,bxint2,SINT7int3:.space4*16;INT3,SINT8hpint:.space4*16;HPINT,SINT9brint1:.space4*16;BRINT1orDMAC2,SINT10bxint1:.space4*16;BXINT1orDMAC3,SINT11dmac4:.space4*16;DMAC4,SINT12dmac5:.space4*16;DMAC5,SINT13rsvd1:.space4*16;reservedrsvd2:.space4*16;reserved.end3、链接文件:MEMORY{PAGE0:VECTOR_RAM:origin=0080h,length=80hPAGE0:PROG_RAM:origin=0100h,length=0F00hPAGE1:DATA_RAM1:origin=1000h,length=1500hPAGE1:DATA_RAM2:origin=2500h,length=100h}SECTIONS{.vectors:VECTOR_RAMPAGE0.text:PROG_RAMPAGE0.const:PROG_RAMPAGE0.data:DATA_RAM1PAGE1.bss:DATA_RAM1PAGE1.sintab:DATA_RAM1PAGE1.input:DATA_RAM1PAGE1,align(2048).input_tempt:DATA_RAM1PAGE1.output:DATA_RAM1PAGE1.cinit:PROG_RAMPAGE0.stack:DATA_RAM2PAGE1}六、实验结果及体会实验结果是输入两个正弦波,输出只有一个正弦波。通过这次实验,我更加熟悉了CCS开发环境以及设计运行调试过程,同时也重新回顾了一下以前学过的内容DSP,感觉自己还有很多很多已经学过的东西还没掌握,这一次实验更加认清了自己,以后要更加的认真刻苦去学习。