大学毕设论文基于dsp的fft实现设计.docx
《大学毕设论文基于dsp的fft实现设计.docx》由会员分享,可在线阅读,更多相关《大学毕设论文基于dsp的fft实现设计.docx(25页珍藏版)》请在冰豆网上搜索。
大学毕设论文基于dsp的fft实现设计
课程设计(论文)
题目名称基于DSP的FFT的实现
课程名称专业课程设计Ⅱ
学生姓名
学号
系、专业信息工程系通信工程
指导教师
2014年4月27日
摘要
随着计算机和微电子技术的飞速发展,基于数字信号处理的频谱分析已经应用到各个领域并且发挥着重要作用。
信号处理方法是当前机械设备故障诊断中重要的技术基础之一,分析结果的精确程度是诊断成功与否的关键因素。
研究频谱分析是当前主要的发展方向之一。
数字信号处理基本上从两个方面来解决信号的处理问题:
一个是时域方法,即数字滤波;另一个是频域方法,即频谱分析.
本文主要介绍了离散傅里叶变换以及快速傅里叶变换,通过对DFT以及FFT算法进行研究,从基础深入研究和学习,掌握FFT算法的关键。
通过对DSP芯片工作原理以及开发环境的学习,掌握CCS的简单调试和软件仿真,在DSP芯片上实现对信号的实时频谱分析。
关键字:
DSP;CCS仿真软件;FFT
目录
第1章绪论1
1.1DSP简介1
1.2设计目的1
1.3设计内容1
1.4设计原理1
1.5FFT算法的DSP实现过程2
第2章硬件实现4
2.1系统的硬件设计4
2.2原理图的设计5
第3章软件设计7
3.1FFT运算及存储分配7
3.2设计流程图8
第4章系统仿真9
4.1FFT实现的方法9
4.2程序运行结果9
第5章总结12
致谢13
参考文献14
附录源程序15
第1章绪论
1.1DSP简介
数字信号处理(DigitalSignalProcessing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。
数字信号处理是利用计算机或专用处理设备,以数字的形式对信号进行分析、采集、合成、变换、滤波、估算、压缩、识别等加工处理,以便提取有用的信息并进行有效的传输与应用。
数字信号处理是以众多学科为理论基础,它所涉及的范围极其广泛。
如数学领域中的微积分、概率统计、随机过程、数字分析等都是数字信号处理的基础工具。
它与网络理论、信号与系统、控制理论、通信理论、故障诊断等密切相关。
1.2设计目的
(1)加深对DFT算法原理和基本性质的理解;
(2)熟悉FFT的算法原理和FFT子程序的算法流程和应用;
(3)学习用FFT对连续信号和时域信号进行频谱分析的方法;
(4)学习DSP中FFT的设计和编程思想;
(5)学习使用CCS的波形观察器观察波形和频谱情况;
(6)简要画出硬件设计电路图。
1.3设计内容
用DSP汇编语言进行编程,实现FFT运算,对输入信号进行频谱分析。
1.4设计原理
快速傅氏变换(FFT)是一种高效实现离散傅氏变换的快速算法,是数字信号处理中最为重要的工具之一,它在声学、语音、电信、和信号处理等领域有着广泛的应用。
对于有限长离散数字信号{x[n]},0nN-1,其离散谱{x[k]}可以由离散付氏变换(DFT)求得。
可以方便的把它改写为如下形式:
不难看出,WN是周期性的,且周期为N,即
N的周期性是DFT的关键性质之一。
为了强调起见,常用表达式WN取代W以便明确其周期是N。
FFT算法可以分为按时间抽取FFT和按频率抽取FFT两大类,输入也有和复数之分,一般情况下,都假定输入序列为复数。
FFT算法利用旋转因子的对称性和周期性,加快了运算速度。
用定点DSP芯片实现FFT程序时,一个比较重要的问题是防止中间结果的溢出,防止中间结果的溢出的方法是对中间数值归一化。
为了避免对每级都进行归一化会降低运算速度,最好的方法是只对可能溢出的进行归一化,而不可能溢出的则不进行归一化。
由DFT的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N点DFT需要(N-1)2次复数乘法和N(N-1)次加法。
因此,对于一些相当大的N值(如1024)来说,直接计算它的DFT所作的计算量是很大的。
FFT的基本思想在于,将原有的N点序列序列分成两个较短的序列,这些序列的DFT可以很简单的组合起来得到原序列的DFT。
例如,若N为偶数,将原有的N点序列分成两个(N/2)点序列,那么计算N点DFT将只需要约[(N/2)2·2]=N2/2次复数乘法。
即比直接计算少作一半乘法。
因子(N/2)2表示直接计算(N/2)点DFT所需要的乘法次数,而乘数2代表必须完成两个DFT。
上述处理方法可以反复使用,即(N/2)点的DFT计算也可以化成两个(N/4)点的DFT(假定N/2为偶数),从而又少作一半的乘法。
这样一级一级的划分下去一直到最后就划分成两点的FFT运算的情况。
1.5FFT算法的DSP实现过程
DSP芯片的出现使FFT的实现方法变得更为方便。
由于大多数DSP芯片都具有在单指令周期内完成乘法—累加操作,并且提供了专门的FFT指令,使得FFT算法在DSP芯片实现的速度更快。
FFT算法可以分为按时间抽取FFT和按频率抽取FFT两大类,输入也有实数和复数之分,一般情况下,都假定输入序列为复数。
1.5.1FFT运算序列的存储分配
FFT运算时间是衡量DSP芯片性能的一个重要指标,因此提高FFT的运算速度是非常重要的。
在用DSP芯片实现FFT算法时,应允许利用DSP芯片所提供的各种软、硬件资源。
如何利用DSP芯片的有限资源,合理地安排好所使用的存储空间是十分重要的。
1.5.2FFT运算的实现
用TMS320C54x的汇编程序实现FFT算法主要分为四步:
(1)实现输入数据的比特反转
输入数据的比特反转实际上就是将输入数据进行码位倒置,以便在整个运算后的输出序列是一个自然序列。
在用汇编指令进行码位倒置时,使用码位倒置可以大大提高程序执行速度和使用存储器的效率。
在这种寻址方式下,AR0存放的整数N是FFT点的一半,一个辅助寄存器指向一个数据存放的单元。
当使用位码倒置寻址将AR0加到辅助寄存器时,地址将以位码倒置的方式产生。
(2)实现N点复数FFT
N点复数FFT算法的实现可分为三个功能块,即第一级蝶形运算、第二级蝶形运算、第三级至
级蝶形运算。
对于任何一个2的整数幂
,总可以通过M次分解最后成为2点的DFT计算。
通过这样的M次分解,可构成M(即
)级迭代计算,每级由N/2个蝶形运算组成。
(3)功率谱的计算
用FFT计算想x(n)的频谱,即计算
X(k)=
X(k)一般是由实部
(k)和虚部
(k)组成的复数,即
X(k)=
(k)+j
(k)
因此,计算功率谱时只需将FFT变换好的数据,按照实部实部
(k)和虚部
(k)求它们的平方和,然后对平方和进行开平方运算。
但是考虑到编程的难度,对于求FFT变换后数据的最大值,不开平方也可以找到最大值,并对功率谱的结果没有影响,所以在实际的DSP编程中省去了开方运算。
第2章硬件实现
2.1系统的硬件设计
基于DSP的系统设计过程中,最小系统的设计是整个系统设计的第一步,系统设计总是从最小系统开始,逐步向系统应用范围扩展,最终以DSP为核心的大系统的设计。
因此最小系统设计DSP设计的关键。
DSP最小系统的设计包括DSP电源和地线的设计,JTAG仿真口的设计、复位和时钟电路的设计、上拉和下拉引脚的设计等。
图2.1.1最小系统的设计
芯片介绍
(1)该模块上的资源有32千字FLASH;
(2)千字SARAM,544字DARAM,外扩64千字的程序ROM,64千字的数据RAM;
(3)两个事件管理器EVA和EVB;
(4)可扩展外部存储器总共192K字空间:
64K程序存储器,64K字数据存储器空间,64K字I/O寻址空间;
(5)看门狗定时模块;
(6)19位A/D转换器;
(7)控制局域网络CAN模块,串行通信接口SCI模块;
(8)16位串行外设SPI接口模块;
(9)基于锁相环的时钟发生器;
(10)高达40个可单独编程或复用的通用输入/输出引脚GPIO;
(11)5个外部中断;
(12)电源管理包括3种低功耗模式,能独立地将外设器件转入低功耗工作模式;
2.2原理图的设计
DSP最小系统的设计包括DSP电源设计,JTAG仿真口的设计、复位和时钟电路的设计、上拉和下拉引脚的设计等
2.2.1电源电路的设计
电源电路的选择是系统设计的一个重要的部分,设计好坏对系统的影响最大。
首先需要注意的是,为了减少电源噪声和互相干扰,数字电路和模拟电路一般要独立供电,数字地和模拟地也要分开,并最终通过一个磁珠在一点连在一起,用TPS7333Q进行3.3V电压的转换对最小系统供电
图2.2.1电源电路
2.2.2复位电路设计
TMS320C54X内部带有复位电路,因此可以直接RS复位引脚外面接一个上拉电阻即可,这对于简化外围电路,减少电路板尺寸很有用处,但是为了调试方便经常采用手动复位电路。
2.2.3锁相环电路设计
图2.2.3锁相环电路
2.2.4JTAG口
JTAG是JointTestActionGroup的简称,又称JTAG口,它是一符合IEEEStd1149.1边界扫描逻辑标准的标准接口。
它主要用于在硬件上对DSP进行实时在线仿真测试和DSP程序的下载,它提供对所连接设备的边界扫描,同时也可以用来测试引脚到引脚的连续性,以及进一步进行DSP芯片的外围器件的操作测试。
第3章软件设计
3.1FFT运算及存储分配
(1)DSP芯片的出现使FFT的实现方法变得更为方便,由于大多数DSP芯片都具有在单指令周期内完成乘法——累加的操作,并提供了专门的FFT指令,使得FFT算法在DSP的实现速度更快。
一般,FFT的算法可分为按时间抽取FFT和按频率抽取FFT,输入也有实数和复数之分,一般情况下都假定输入是复数序列。
(2)FFT运算序列的存储分配
FFT运算时间是衡量DSP芯片性能的一个重要指标,因此提高FFT的运算速度是非常重要的。
在用DSP芯片实现FFT算法时,应允许利用DSP芯片所提供的各种软、硬件资源。
如何合理的利用DSP芯片的有限资源,合理的安排DSP芯片所提供的存储空间相当关键。
本设计采用如下所示的存储分配:
图3.1数据空间分配图
3.2设计流程图
图3.2程序流程图
第4章系统仿真
4.1FFT实现的方法
(1)根据N值,修改rfft_task.asm中的两个常数,如N=64.
K_FFT_SIZE.set64
K_LOGN.set6
(2)准备输入数据文件in.dat。
输入数据按实部、虚部,实部、虚部,……顺序存放。
(3)汇编、链接、仿真执行,得到输出数据文件out.dat。
(4)根据out.dat作图,就可以得到输入信号的功率谱图。
当N超过1024时,除了修改K_FFT_SIZE和K_LOGN两个常数外,还要增加系数并且修改rfft_task.cmd命令文件。
通过data.pjt完成一个64点FFT程序,输入信号为一正弦波。
操作步骤如下:
(1)进入CCS环境。
(2)打开CCS选择File—New—SourceFile。
(3)编写源程序代码。
(4)创建工程文件。
(5)点击Project选择BuildOptions。
(6)在弹出的对话框在设置相应的编译参数,一般情况下,按默认值就可以。
(7)在弹出的对话框中选择连接的参数设置,设置传输文件、堆栈的大小以及初始化的方式。
(8)点击Project—Buildall,对工程进行编译。
(9)点击File—loadprogram,弹出的对话框中载入debug文件夹下的.out可执行文件。
(10)点击debug—GoMain回到C程序的入口。
(11)运行程序,观察结果。
4.2程序运行结果
验证输入数据波形,设置参数:
StartAddress=0x2800,Page=Data,AcquisitionBufferSize=64,DisplayDataSize=64,DSPDataType=32-bitsignedinteger
点击OK,就可以看到输入数据波形:
图4.2.1输入数据波形
全速运行程序,看输出结果,设置波形对话框参数:
StartAddress=0x2c80,Page=Data,AcquisitionBufferSize=64,DisplayDataSize=64,DSPDataType=16-bitsignedinteger
点击OK,就可以看到FFT输出结果:
图4.2.2FFT输出结果
第5章总结
在本次课程设计中,我、XXX、XXX三人一组。
XXX负责硬件设计部分,XXX负责软件设计部分,我负责系统仿真及论文的编写。
在系统仿真时我们需要在实验箱上设置信号源,信号源的幅度应该设在1000左右,信号的频率设在300左右,电压偏移设为1,通道设为0。
在论文编写的过程中,我首先对本次课程设计进行了总体设计,然后根据XXX、XXX和我各自负责的内容进行汇总编排。
通过本次课程设计我发现DSP应用型很强,许多的原理,程序看似简单,真正去做才知道知识并没有自己想象的那样扎实。
从而懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。
而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。
本次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
致谢
在此次设计中,XX老师作为我的指导老师,至始至终都给予我了不少帮助,从下任务书开始,就帮我制定规划,提醒我应注意的问题,借给我资料和实验器材,和我一起调程序,并提出了很多的修改意见以及完善方案。
此外还认真批阅了我的论文,指出其中很多瑕疵和不清晰的地方,更重要的是在我遇到困难时对我的鼓励,让我不懈怠、不退缩、也让我更有信心,可以说我的每一点进展都与黄老师的付出是分不开的。
当然还在此,我向身边关心我的老师、同学致以诚挚的谢意!
有其他老师和同学都帮了我不少忙,在此不再赘述。
谨祝老师们工作顺利,万事如意,桃李满天下;同学们学业有成,前程似锦!
参考文献
[1]戴明桢等编著.TMS320C54XDSP结构原理及应用.北京:
航空航天大学出版社,第2版,2007;
[2]彭启琮编著.DSP技术的发展与应用.北京:
高等教育出版社,2002;
[3]胡广书编著.数字信号处理理论、算法与实现.北京:
清华大学出版社,2005;
[4]黄席椿、高顺良编著.滤波器综合法设计原理.北京:
人民邮电出版社,1978;
[5]沈永欢梁在中等编著.实用数学手册.北京:
科学出版社,2001;
[6]程佩青编著.数字滤波与快速傅里叶变换.北京:
清华大学出版社,1990;
[7]北京合众达电子技术有限公司编著.SEED-DTK系列实验手册.北京合众达电子技术有限公司出版,2007。
附录源程序
#include"stdio.h"
#include"math.h"
main()
{
inti;
floatf[256];
FILE*fp;
if((fp=fopen("d:
\\tms320c54\\fft\\sindata","wt"))==NULL)
{
printf("can'topenfile!
\n");
exit(0);
}
for(i=0;i<=255;i++)
{
f[i]=sin(2*3.1415926*i/256.0);
fprintf(fp,".word%ld\n",(log)(f[i]*16384));
}
fclose(fp);
}
将生成的数据文件复制到目标系统存储器的语句为d_input.copysindata
汇编语言程序:
.title"fft.asm"
.mmregs
.include"coeff.inc"
.include"in.inc"
.defstart
sine:
.usect"sine",512
cosine:
.usect"cosine",512
fft_data:
.usect"fft_data",1024
fft_out:
.usect"fft_out",512
STACK.usect"STACK",10
K_DATA_IDX_1.set2
K_DATA_IDX_2.set4
K_DATA_IDX_3.set8
K_TWID_TBL_SIZE.set512
K_TWID_IDX_3.set128
K_FLY_COUNT_3.set4
K_FFT_SIZE.set64
K_LOGN.set6
PA0.set0
.bssd_twid_idx,1
.bssd_data_idx,1
.bssd_grps_cnt,1
.sect"fft_prg"
.asgAR2,REORDERED
.asgAR3,ORIGINAL_INPUT
.asgAR7,DATA_PROC_BUF
start:
SSBXFRCT
STM#STACK+10,SP
STM#sine,AR1
RPT#511
MVPD#sine1,*AR1+
STM#cosine,AR1
RPT#511
MVPDcosine1,*AR1+
STM#d_input,ORIGINAL_INPUT
STM#fft_data,DATA_PROC_BUF
MVMMDATA_PROC_BUF,REORDERED
STM#K_FFT_SIZE-1,BRC·
RPTBDbit_rev_end-1
STM#K_FFT_SIZE,AR0
MVDD*ORIGINAL_INPUT+,*REORDERED+
MVDD*ORIGINAL_INPUT-,*REORDERED+
MAR*ORIGINAL_INPUT+0B
bit_rev_end:
.asgAR1,GROUP_COUNTER
.asgAR2,PX
.asgAR3,QX
.asgAR4,WR
.asgAR5,WI
.asgAR6,BUTTERFLY_COUNTER
.asgAR7,STAGE_COUNTER
STM#0,BK
LD#-1,ASM
STM#fft_data,PX
STM#fft_data+K_DATA_IDX_1,QX
STMK_FFT_SIZE/2-1,BRC
LD*PX,16,A
RPTBDstage1end-1
STM#K_DATA_IDX_1+1,AR0
SUB*QX,16,A,B
ADD*QX,16,A
STHA,ASM,*PX+
STB,*QX+
||LD*PX,A
SUB*QX,16,A,B
ADD*QX,16,A
STHA,ASM,*PX+0%
STB,*QX+0%
||LD*PX,A
stage1end:
STM#fft_data,PX
STM#fft_data+K_DATA_IDX_2,QX
STM#K_FFT_SIZE/4-1,BRC
LD*PX,16,A
RPTBDstage2end-1
STM#K_DATA_IDX_2+1,AR0
SUB*QX,16,A,B
ADD*QX,16,A
STHA,ASM,*PX+
STB,*QX+
||LD*PX,A
SUB*QX,16,A,B
ADD*QX,16,A
STHA,ASM,*PX+
STHB,ASM,*QX+
MAR*QX+
ADD*PX,*QX,A
SUB*PX,*QX-,B
STHA,ASM,*PX+
SUB*PX,*QX,A
STB,*QX
||LD*QX+,B
STA,*PX
||ADD*PX+0%,A
STA,*QX+0%
||LD*PX,A
stage2end:
STM#K_TWID_TBL_SIZE,BK
ST#K_TWID_IDX_3,d_twid_idx
STM#K_TWID_IDX_3,AR0
STM#cosine,WR
STM#sine,WI
STM#K_LOGN-2-1,STAGE_COUNTER
ST#K_FFT_SIZE/8-1,d_grps_cnt
STM#K_FLY_COUNT_3-1,BUTTERFLY_COUNTER
ST#K_DATA_IDX_3,d_data_idx
stage:
STM#fft_data,PX
LDd_data_idx,A
ADD*(PX),A
STLMA,QX
MVDKd_grps_cnt,GROUP_COUNTER
group:
MVMDBUTTERFLY_COUNTER,BRC
RPTBDbutterflyend-1
LD*WR,T
MPY*QX+,A
MAC*WI+0%,*QX-,A
ADDPX,16,A,B;B:
=(QR*WR+QI*WI)+PR
STB,*PX;PR':
=((QR*WR+QI*WI)+PR)/2
||SUB*PX+,B
STB,*QX
||MPY*QX+,A
MAS*QX,*WR+0%,A
ADD*PX,16,A,B
STB,*QX+
||SUB*PX,B
LD*WR,T
STB,*PX+
||MPY*QX+,A
butterflyend:
PSHMAR0
MVDKd_data_idx,AR0
MAR*PX+0
MAR*QX+0
BANZDgroup,*GROUP_COUNTER-
POPMAR0
MAR*QX-
LDd_data_idx,A
SUB#1,A,B
STLMB,BUTTERFLY_COUNTER
STLA,1,d_data_idx
LDd_grps_cnt,A
STLA,ASM,d_grps_cnt
LDd_twid_idx,A
STLA,ASM,d_twid_idx
BANZDstage,*STAGE_COUNTER-
MVDKd_twid_idx,AR0
fft_end:
STM#fft_data,AR2
STM#fft_data,AR3
STM#fft_out,AR4
STM#K_FFT_SIZE*2-