DSP课设报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于CCS和ICETEK5509实验箱FFT算法的C语言实现与验证

学院:

姓名:

学号:

班级:

指导老师:

完成报告日期:

一、设计目的

1.本课程设计与理论课、实验课一起构成《DSP芯片原理与应用》完整课程体

系;

2.针对理论课、实验课中无时间和不方便提及内容和需强调重点进行补充与完

善;

3.以原理算法的实现与验证体会DSP技术的系统性,并加深基本原理的体会。

二、设计任务

1.设计一个以ICETEK5509为硬件主体,FFT为核心算法的频谱分析系统方案;

2.用C语言编写系统软件的核心部分,熟悉CCS调试环境的使用方法,在CCS IDE

中仿真实现方案功能;

3.在实验箱上由硬件实现频谱分析。

三、设计内容

1.设计方案原理

1)FFT工作原理及工作方式

工作原理:

快速傅里叶变换是离散傅里叶变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的新的发现,但是对于在计算机系统或者说数字系统中应用离散傅里叶变换,可以说是进了一大步。设x(n)为N项的复数序列,由DFT变换,任一X(n)的计算都需要N^2次复数乘法和N(N-1)次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法。所以作一次离散傅里叶变换需要作4N^2次实数乘法及N(4N-2)次实数加法。

而在FFT中,利用Wn的周期性和对称性,把一个N项序列分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT。而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT就只需要作(N/2)(log2N)次复数乘法和N(log2N)次复数加法。

这样,运算量的节约就很大,这就是FFT的优越性。

工作方式:

第一步,将1个N点的时域信号分成N个1点的时域信号,然后计算这N 个1点时域信号的频域,得到N个频域的点,然后将这个N个频域的点按照一定的顺序加起来,就得到了我们需要的频谱。这里每个点的意思是复数,都有实部和虚部。认真看蝶形图可以看出它是按照比特反转顺序来分解的。

第二步,计算每个点的频谱,这一步很简单,因为一个时域的点的频谱的数值就是它自己,所以这一步什么也不需做,但需明白这时候N个点不是时域信号了,而是频域信号。

第三步,将这N个频域信号结合起来,这一步是最麻烦的一步。就是和前面时域分解的顺序相反,将2个1点的频域信号变成1个2点的频域信号,再将2个2点的频域信号变成1个4点的频域信号,一直到结束。

2)DSP工作原理

数字信号处理器(DSP)是一种可编程的高性能处理器,近年来发展很快。

它不仅适用于数字信号处理,而且在图像处理、语音处理、通信等领域得到了广泛地应用。通用的微处理器在运算速度上很难适应信号实时处理的要求。数字信号处理器中集成有高速的乘法器硬件,能快速地进行大量数据的乘法海和加法运算。快速傅里叶变换的出现使得DFT在实际应用中得到了广泛的应用。

3)A/D模数转换原理

TMS320VC5509模数转换模块带内置采样和保持的10位模数转换模块ADC,最小转换时间为500ns,最大采样率为21.5kHz。它有2个模拟输入通道(AIN0—AIN1)。

模数转换模块接到启动转换信号后,开始转换第一个通道的数据。经过一个采样时间的延迟后,将采样结果放入转换结果寄存器总保存。转换结束后设置标志,等待下一个启动信号。

模数转换相对于计算机来说是一个较为缓慢的过程。一般采用中断方式启动转换或保存结果,这样在CPU忙于其他工作时可以少占用处理时间。设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,根据实际

需要选择适当的触发转换的手段,也要能及时地保存结果。

2.设计方案流程图:

1)FFT程序流程框图:

2)A/D转换流程框图:

3.主要实现方法

1)在CCS上进行软件仿真:

A.参考教材P371的14.3节完成CCS环境中的FFT工程的建立;

本工程的建立有点投机取巧,不太符合老师的要求,只是直接将书上给的FFT.c做成了头文件FFT.h,然后将其加入之前做实验时时老师给的一个关于泰勒级数展开的工程c55_sin0。

B.设计检测信号,验证FFT算法的正确性及FFT的部分性质;

基于谱线易于观察分析的角度,故本次软件仿真用的检测信号为正弦函数,也就是工程中由泰勒级数展开生成的正弦曲线。

下面给出FFT.h的程序和部分注解:

#include

struct compx { float real,imag;}; /*定义一个复数结构*/

struct compx s[257]; /*FFT输入和输出:均从s[1]开始存放*/

struct compx EE(struct compx ,struct compx ); /*定义附复数相乘结构*/

void FFT(struct compx *, int ); /*FFT函数定义*/

#define FFT_N 256

struct compx EE(struct compx b1,struct compx b2) //对两个复数进行乘法运算

{struct compx b3;

b3.real=b1.real*b2.real-b2.imag*b2.imag; //输入参数:两个以联合体定义的复数

b3.imag=b1.real*b2.imag+b1.imag*b2.real;

return(b3);

}

/*输入:xin(实部,虚部),输出:xin(实部,虚部),N:FFT点数*/

void FFT(struct compx *xin, int N)

{

int f,m,nv2,nm1,i,k,j=1,l;

struct compx v,w,t;

nv2=N/2; /*变址运算,即把自然顺序变成倒位序,采用雷德算法*/ f=N;

for(m=1;(f=f/2)!=1;m++){;}

nm1=N-1;

/*变址运算*/

for(i=1;i<=nm1;i++)

{

if(i

{ t=xin[j];xin[j]=xin[i];xin[i]=t;}

k=nv2; /*求j的下一个倒位序*/

while(k

{j=j-k; /*把最高位变成0*/

k=k/2; /*k/2,比较次高位,以此类推,逐个比较,直到某个位为0*/

}

j=j+k; /*把0改为1*/

}

/*fft*/

{ int le,lei,ip; //FFT运算核,使用蝶形运算完成FFT运算

float pi;

for(l=1;l<=m;l++)

{

le=pow(2,1);

lei=le/2;

pi=3014159265;

v.real=1.0;v.imag=0.0;

w.real=cos(pi/lei); //w为系数商,即当前系数与前一个系数的商

w.imag=-sin(pi/lei);

for(j=1;j<=lei;j++) //控制计算不同种蝶形结,即计算系数不同的蝶形结

{

for(i=j;i<=N;i=i+le) //控制计算同种蝶形结运算,即计算系数相同蝶形结

{

ip=i+lei; //i,ip分别表示参加蝶形运算的两个节点

t=EE(xin[ip],v); //蝶形运算

xin[ip].real=xin[i].real-t.real;

相关文档
最新文档