资源描述
目录
一、 前言
二、 设计题目
三、 设计要求
3.1 设计目的
3.2 设计要求
四、 设计内容
五、 设计原理
5.2 离散傅里叶变换DFT
5.3 快速傅里叶变换FFT
六、 总体方案设计
6.1 设计有关程序流程图
6.2 在CCS环境下加载、调试源程序
七、 主要参数
八、 实验结果分析
九、 设计总结
一、前言
随着数字电子技术的发展,数字信号处理的理论和技术广泛的应用于通讯、语音处理、计算机和多媒体等领域。快速傅里叶变换(FFT)使离散傅里叶变换的时间缩短了几个数量级。在数字信号处理领域被广泛的应用。FFT已经成为现代化信号处理的重要手段之一。
本次课程设计主要运用CCS这一工具。CCS(Code Composer Studio)是一种针对TM320系列DSP的集成开发环境,在Windows操作系统下,采用图形接口界面,提供环境配置、源文件编辑、程序调试、跟踪和分析等工具,可以帮助用户在一个软件环境下完成编辑、编译、链接、调试和数据分析等工作。
CCS有两种工作模式,即软件仿真器和硬件在线编程。软件仿真器工作模式可以脱离DSP芯片,在PC上模拟DSP的指令集和工作机制,主要用于前期算法实现和调试。硬件在线编程可以实时运行在DSP芯片上,与硬件开发板相结合进行在线编程和调试应用程序。
二、 设计题目
快速傅里叶变换(FFT)的DSP实现
三 、 设计要求
3.1设计目的
⑴加深对DFT算法原理和基本性质的理解;
⑵ 熟悉FFT的算法原理和FFT子程序的算法流程和应用;
⑶学习用FFT对连续信号和时域信号进行频谱分析的方法;
⑷学习DSP中FFT的设计和编程思想;
⑸学习使用CCS的波形观察器观察波形和频谱情况;
3.2 基本要求
⑴研究FFT原理以及利用DSP实现的方法;
⑵编写FFT程序;
⑶调试程序,观察结果。
四、 设计内容
⑴用DSP汇编语言及C语言进行编程;
⑵实现FFT运算、对输入信号进行频谱分析。
五、 设计原理
快速傅里叶变换FFT
快速傅里叶变换(FFT)是一种高效实现离散傅里叶变换(DFT)的快速算法,是数字信号处理中最为重要的工具之一,它在声学,语音,电信和信号处理等领域有着广泛的应用。
5.1. 离散傅里叶变换DFT
对于长度为N的有限长序列x(n),它的离散傅里叶变换(DFT)为 (1)
式中, ,称为旋转因子或蝶形因子。
从DFT的定义可以看出,在x(n)为复数序列的情况下,对某个k值,直接按(1)式计算X(k) 只需要N次复数乘法和(N-1)次复数加法。因此,对所有N个k值,共需要N2次复数乘法和N(N-1)次复数加法。对于一些相当大有N值(如1024点)来说,直接计算它的DFT所需要的计算量是很大的,因此DFT运算的应用受到了很大的限制。
5.2.快速傅里叶变换FFT
旋转因子WN 有如下的特性。
对称性:
周期性:
利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。FFT就是利用了旋转因子的对称性和周期性来减少运算量的。
FFT的算法是将长序列的DFT分解成短序列的DFT。例如:N为偶数时,先将N点的DFT分解为两个N/2点的DFT,使复数乘法减少一半:再将每个N/2点的DFT分解成N/4点的DFT,使复数乘又减少一半,继续进行分解可以大大减少计算量。最小变换的点数称为基数,对于基数为2的FFT算法,它的最小变换是2点DFT。
一般而言,FFT算法分为按时间抽取的FFT(DIT FFT)和按频率抽取的FFT(DIF FFT)两大类。DIF FFT算法是在时域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。而DIF FFT算法是在频域内将每一级输入序列依次奇/偶分成2个短序列进行计算。两者的区别是旋转因子出现的位置不同,得算法是一样的。在DIF FFT算法中,旋转因子 出现在输入端,而在DIF FFT算法中它出现在输入端。
假定序列x(n)的点数N是2的幂,按照DIF FFT算法可将其分为偶序列和奇序列。
偶序列:
奇序列:
则x(n)的DFT表示为
由于 ,则(3)式可表示为
式中, 和分别为和的N/2的DFT。
由于对称性,
则。因此,N点可分为两部分:
前半部分: (4)
后半部分: (5)
从式(4)和式(5)可以看出,只要求出0~N/2-1区间和的值,就可求出0~N-1区间的N点值。
以同样的方式进行抽取,可以求得N/4点的DFT,重复抽取过程,就可以使N点的DFT用上组2点的 DFT来计算,这样就可以大减少运算量。
基2 DIF FFT的蝶形运算如图(a)所示。设蝶形输入为和,输出为和,则有
(6)
(7)
在基数为2的FFT中,设N=2M,共有M级运算,每级有N/2个2点FFT蝶形运算,因此,N点FFT总共有个蝶形运算。
-1
图(a) 基2 DIF FFT的蝶形运算
例如:基数为2的FFT,当N=8时,共需要3级,12个基2 DIT FFT的蝶形运算。其信号流程如图(b)所示。
图(b) 8点基2 DIF FFT蝶形运算
从图(b)可以看出,输入是经过比特反转的倒位序列,称为位码倒置,其排列顺序为。输出是按自然顺序排列,其顺序为。
六、 总体方案设计
6.1 设计程序流程图
6.2在CCS环境下加载、调试源程序
(1)起动CCS,在CCS中建立一个工程文件project\new\FFT,往工程文件里添加程序file\new\sourcefile.建立C源文件和一个命令文件,并将这两个文件添加到工程,再编译并装载程序:
阅读Dsp原理及应用中fft 用dsp实现的有关程序。
双击,启动CCS的仿真平台的配着选项。选择C5510 Simulator。Add加到my system ,按下save
(2)启动c5510后打开文件FFT.pjt.将编写好的源程序,和命令文件加载到文件FFT.pjt\Source.
(3)按下project\build调试程序,看其中是否有错误。
(4)无错后,Debug\run运行FFT.out程序。
.
(5)通过graph property dialog窗口,改变N点的值,得到不同的结果。
七.主要参数
进行N点FFT运算,分别实现N=256,N=512得到不同的功率谱图
六.源程序:
Cmd源文件代码:
-f 0
-w
-stack 500
-sysstack 500
-l rts55.lib
MEMORY
{
DARAM: o=0x100, l=0x7f00
VECT:o=0x8000, l=0x100
DARAM2:o=0x8100,l=0x7f00
SARAM: o=0x10000,l=0x30000
SDRAM:o=0x40000,l=0x3e0000
}
SECTIONS
{
.text: {}>DARAM
.vectors: {}>VECT
.trcinit:{}>DARAM
.gblinit:{}>DARAM
.frt:{}>DARAM
.cinit:{}>DARAM
.pinit:{}>DARAM
.sysinit:{}>DARAM2
.far:{}>DARAM2
.const:{}>DARAM2
.switch:{}>DARAM2
.sysmem:{}>DARAM2
.cio:{}>DARAM2
.MEM$obj:{}>DARAM2
.sysheap:{}>DARAM2
.sysstack:{}>DARAM2
.stack:{}>DARAM2
.input:{}>DARAM2
.fftcode:{}>DARAM2
}
C文件源码:
#include "math.h"
#define sample_1 256
#define signal_1_f 60
#define signal_2_f 200
#define signal_sample_f 512
#define pi 3.1415926
int input[sample_1];
float fwaver[sample_1],fwavei[sample_1],w[sample_1];
float sin_tab[sample_1];
float cos_tab[sample_1];
void init_fft_tab();
void input_data();
void fft(float datar[sample_1],float datai[sample_1]);
void main()
{
int i;
init_fft_tab();
input_data();
for (i=0;i<sample_1;i++)
{
fwaver[i]=input[i];
fwavei[i]=0.0f;
w[i]=0.0f;
}
fft(fwaver,fwavei);
while(1);
}
void init_fft_tab()
{
float wt1;
float wt2;
int i;
for (i=0;i<sample_1;i++)
{
wt1=2*pi*i*signal_1_f;
wt1=wt1/signal_sample_f;
wt2=2*pi*i*signal_2_f;
wt2=wt2/signal_sample_f;
input[i]=(cos(wt1)+cos(wt2))/2*32768;
}
}
void input_data()
{
int i;
for(i=0;i<sample_1;i++)
{
sin_tab[i]=sin(2*pi*i/sample_1);
cos_tab[i]=cos(2*pi*i/sample_1);
}
}
void fft(float datar[sample_1],float datai[sample_1])
{
int x0,x1,x2,x3,x4,x5,x6,x7,xx;
int i,j,k,b,p,L;
float TR,TI,temp;
for(i=0;i<sample_1;i++)
{
x0=x1=x2=x3=x4=x5=x6=0;
x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01;
x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;x7=(i/128)&0x01;
xx=x0*128+x1*64+x2*32+x3*16+x4*8+x5*4+x6*2+x7;
datai[xx]=datar[i];
}
for(i=0;i<sample_1;i++)
{
datar[i]=datai[i];datai[i]=0;
}
for(L=1;L<=8;L++)
{
b=1;i=L-1;
while(i>0)
{
b=b*2;i--;
}
for(j=0;j<=b-1;j++)
{
p=1;i=8-L;
while(i>0)
{
p=p*2;i--;
}
p=p*j;
for(k=j;k<256;k=k+2*b)
{
TR=datar[k];TI=datai[k];temp=datar[k+b];
datar[k]=datar[k]+datar[k+b]*cos_tab[p]+datai[k+b]*sin_tab[p];
datai[k]=datai[k]-datar[k+b]*sin_tab[p]+datai[k+b]*cos_tab[p];
datar[k+b]=TR-datar[k+b]*cos_tab[p]-datai[k+b]*sin_tab[p];
datai[k+b]=TI+temp*sin_tab[p]-datai[k+b]*cos_tab[p];
}
}
}
for(i=0;i<sample_1/2;i++)
{
w[i]=sqrt(datar[i]*datar[i]+datai[i]*datai[i]);
}
}
八、 实验结果及分析
作图,得到输入信号的功率图谱。
2)FFT变换结果图
3) 改变信号的频率可以再做次实验。
FFT算法特点:()
共需次迭代;
第次迭代对偶结点的偶距为,因此一组结点覆盖的序号个数是。
第次迭代结点的组数为。
可以预先计算好,而且的变化范围是。
因此N越大,运算越多。
九、 设计总结
通过这次课程设计,我获得了很多。一开始对DSP这个概念很陌生,对于其中的内容更是一知半解。我只知道这门学科应该很有用,但是不知道该如何去把握它,认识它。这次课程设计,让我对DSP有了更进一步的了解。对FFT算法有了新的认识,对其原理和基本性质做了回顾,为以后深入的学习奠定了基础。这次课程设计,我觉得最有意义的就是掌握了一定的DSP系统的软件设计能力。而且还了解了CCS的组成与基本功能。掌握了它的安装、配置、基本操作、工程项目的建立和调试等。希望在以后的应用中能学到更多的知识,并将它们运用到实践中去。
展开阅读全文