收藏 分享(赏)

第6章 应用程序设计.ppt

上传人:weiwoduzun 文档编号:5776691 上传时间:2019-03-16 格式:PPT 页数:47 大小:723.50KB
下载 相关 举报
第6章 应用程序设计.ppt_第1页
第1页 / 共47页
第6章 应用程序设计.ppt_第2页
第2页 / 共47页
第6章 应用程序设计.ppt_第3页
第3页 / 共47页
第6章 应用程序设计.ppt_第4页
第4页 / 共47页
第6章 应用程序设计.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、2019年3月16日,DSP原理及应用,1,回顾,第5章我们介绍了TMS320C54x汇编语言程序的设计源文件格式,标号: 助记符 操作数 ; 注释,助记符指令语法格式:,【例】 助记符指令源语句举例。 NANHUA .set 1 ; 符号NANHUA1Begin: LD #NANHUA,AR1 ; 将1加载到AR1,标 号,助记符,操作数,注 释,2019年3月16日,DSP原理及应用,2,汇编语言源程序的编写好后,还要进行汇编和链接,目的是对程序存储器和数据存储器进行分配;然后对源程序进行编译,编译无误后,再装载,即可调试程序。,2019年3月16日,DSP原理及应用,3,第6章 应用程序

2、设计,数字信号处理主要面向密集型的运算,包括乘法-累加、数字滤波和快速傅里叶变换等。C54x具备了高速完成上述运算的能力,并具有体积小、功耗低、功能强、软硬件资源丰富等优点,现已在通信等许多领域得到了广泛应用。本章结合数字信号处理和通信中最常见、最具有代表性的应用,介绍通用数字信号处理算法的DSP实现方法,主要包括:有限冲激响应(FIR)数字滤波器无限冲激响应(IIR)数字滤波器快速傅里叶变换(FFT)正弦波信号发生器在简要介绍上述内容的基本原理、结构和算法之后,重点介绍设计方法和DSP实现的方法。,2019年3月16日,DSP原理及应用,4,第6章 应用程序设计,主要内容: 1. FIR数字

3、滤波器的DSP实现(自学) 2. IIR数字滤波器的DSP实现(自学) 3. 快速傅里叶变换(FFT)的 DSP实现 4. 正弦波信号发生器的DSP实现,DSP原理及应用,5,2019年3月16日,时间安排:2学时 重点: 产生正弦波的算法分析、正弦波信号的发生; 快速傳里叶变换(FFT)的DSP实现 难点: 正弦波的实现编程;,时间安排:2学时 重点: 产生正弦波的算法分析、正弦波信号的发生; 快速傳里叶变换(FFT)的DSP实现 难点: 正弦波的实现编程;,重点:1. 快速傳里叶变换(FFT)的DSP实现;2. 产生正弦波的算法分析、正弦波信号的发生。难点:正弦波的实现编程时间安排:理论讲

4、授:4学时 实验:2学时,2019年3月16日,DSP原理及应用,6,第6章 应用程序设计,6.3 快速傅里叶变换(FFT)的DSP实现,快速傅里叶变换(FFT)是一种高效实现离散傅里叶变换(DFT)的快速算法,是数字信号处理中最为重要的工具之一,它在声学、语音、电信和信号处理等领域有着广泛的应用。,6.3.1 FFT算法的简介,1离散傅氏变换DFT,对于长度为N的有限长序列x(n),它的离散傅里叶变换为:,k = 0,1,N-1 (6.3.1),WN = e-j2/N,称为旋转因子,或蝶形因子。,在x(n)为复数序列的情况下,计算X(k):对某个k值,需要N次复数乘法、(N-1)次复数加法;

5、对所有N个k值,需要N2次复数乘法和N(N-1)次复数加法。,2019年3月16日,DSP原理及应用,7,第6章 应用程序设计,6.3.1 FFT算法的简介,2快速傅氏变换FFT,旋转因子WN的特性: 对称性: WkN = -WNk+N/2; 周期性: WkN =WNk+N。,FFT的算法 : 将长序列的DFT分解成短序列的DFT。,2019年3月16日,DSP原理及应用,8,第6章 应用程序设计,2快速傅氏变换FFT,FFT算法,DIT FFT算法:是在时域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。,按时间抽取的FFTDIT FFT按频率抽取的FFTDIF FFT,DIF FFT

6、算法:是在频域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。,区别:旋转因子出现的位置不同。DIT FFT算法输入端,DIF FFT输出端。,2019年3月16日,DSP原理及应用,9,第6章 应用程序设计,2快速傅氏变换FFT,假定序列x(n)的点数N是2的幂,按照DIT FFT算法可分解为:,偶序列:x(0),x(2),x(4),x(N -2)即x1(r) = x(2r),r = 0,1,,奇序列:x(1),x(3),x(5),x(N -1)即x1(r) = x(2r+1),r = 0,1,,2019年3月16日,DSP原理及应用,10,第6章 应用程序设计,2快速傅氏变换FFT,

7、按照奇偶序列,x(n)的DFT表示为:,(6.3.2),2019年3月16日,DSP原理及应用,11,第6章 应用程序设计,2快速傅氏变换FFT,由于WN2=e-j(2/N)2=e-j2/(N/2)=WN/2,则有:,k = 0,1,N/2-1 (6.3.3),X1(k)和X2(k)分别为x1(n)和x2(n)的N/2点的DFT。,由于对称性,WNk+N/2 = -WNk,则X(k+N/2)=X1(k) - WNkX2(k)。,N点X(k)可分为两部分: 前半部分:X(k)=X1(k) + WNkX2(k) k=0, 1, N/2-1 (6.3.4) 后半部分:X(k+N/2)=X1(k)-W

8、NkX2(k) k=0, 1, N/2-1 (6.3.5),2019年3月16日,DSP原理及应用,12,第6章 应用程序设计,2快速傅氏变换FFT,基2 DIT FFT的蝶形运算:,蝶形算法:xm(p)= xm-1(p)+ xm-1(q)WNk (6.3.6)xm(q)= xm-1(p) - xm-1(q)WNk (6.3.7),2019年3月16日,DSP原理及应用,13,第6章 应用程序设计,2快速傅氏变换FFT,在基数为2的FFT中,设N=2M,共有M级运算,每级有N/2个2点FFT蝶形运算,因此,N点FFT总共有(N/2)log2N个蝶形运算。例如:在N点FFT中,当N=8时,共需要

9、3级,12个基2 DIT FFT的蝶形运算。,2019年3月16日,DSP原理及应用,14,第6章 应用程序设计,2快速傅氏变换FFT,信号流程如图:,DITFFT运算流图(N=8),2019年3月16日,DSP原理及应用,15,DIFFFT运算流图(N=8),2019年3月16日,DSP原理及应用,16,第6章 应用程序设计,2快速傅氏变换FFT,输入是经过比特反转的倒位序列位码倒置。 排列顺序:x(0)、x(4)、x(2)、x(6)、x(1)、x(5)、x(3)、x(7) 输出是按自然顺序排列。 排列顺序:x(0)、x(1)、x(2)、x(3)、x(4)、x(5)、x(6)、x(7),20

10、19年3月16日,DSP原理及应用,17,第6章 应用程序设计,6.3 快速傅里叶变换(FFT)的DSP实现,下面以81024复数点FFT算法为例,介绍用DSP芯片实现的方法。,6.3.2 FFT算法的DSP实现,1FFT运算序列的存储分配,FFT运算时间是衡量DSP芯片性能的一个重要指标,在用DSP芯片实现FFT算法时,合理地安排好所使用的存储空间是十分重要的。,2019年3月16日,DSP原理及应用,18,第6章 应用程序设计,1FFT运算序列的存储分配,(1) 程序空间的分配,E000hE1FFh:正弦系数表 E200hE3FFh:余弦系数表 E400hE4A2h:程序代码 FF80hF

11、FFFh:复位向量和中断向量表,2019年3月16日,DSP原理及应用,19,第6章 应用程序设计,1FFT运算序列的存储分配,(2) 数据空间的分配,2019年3月16日,DSP原理及应用,20,第6章 应用程序设计,1FFT运算序列的存储分配,(3) I/O空间的配置,PA0输出口;PA1输入口。,2019年3月16日,DSP原理及应用,21,第6章 应用程序设计,2FFT运算的实现,用汇编程序实现FFT算法主要分为四步:(1) 实现输入数据的比特反转 (倒序)(2) 实现N点复数FFT (3) 功率谱的计算 (4) 输出FFT结果,2019年3月16日,DSP原理及应用,22,第6章 应

12、用程序设计,2FFT运算的实现,(1) 实现输入数据的比特反转(倒序),输入数据的比特反转是将输入数据进行位码倒 置,以便在整个运算后的输出序列是一个自然序列。在用汇编指令进行位码倒置时,使用位码倒置寻址可以大大提高程序执行速度和使用存储器的效率。在这种寻址方式下,AR0存放的整数N是FFT点的一半,用一个辅助寄存器指向一个数据存放的单元。当AR0加到辅助寄存器时,地址将以位码倒置的方式产生。,2019年3月16日,DSP原理及应用,23,第6章 应用程序设计,2FFT运算的实现,(2) 实现N点复数FFT,N点复数FFT算法的实现可分为三个功能块: 第一级蝶形运算 第二级蝶形运算 第三级至l

13、og2N级蝶形运算,对于任何一个2的整数幂N = 2M,N点复数FFT算法总可以通过M次分解成为2点的DFT计算。通过这样的M次分解,可构成M(即log2N)级迭代计算,每级由N/2个碟形运算组成。,2019年3月16日,DSP原理及应用,24,第6章 应用程序设计,(2) 实现N点复数FFT,每个蝶形运算可由基本迭代运算完成。,设蝶形的输入为xm-1(p)和xm-1(q),输出为xm(p)和xm(q),则有,xm(p) = xm-1(p)+xm-1(q)WNk xm(q) = xm-1(p)-xm-1(q)WNk,(6.3.8),m为第m列迭代,p和q为数据所在的行数。,为了避免运算结果的溢

14、出,对每个蝶形的运算结果右移一位。,2019年3月16日,DSP原理及应用,25,第6章 应用程序设计,(2) 实现N点复数FFT,FFT运算中的旋转因子WN是一个复数,可表示:,为了实现旋转因子WN的运算,在存储空间分别建立正弦表和余弦表,每个表对应从0度到180度,采用循环寻址来对正弦表和余弦表进行寻址。,2019年3月16日,DSP原理及应用,26,第6章 应用程序设计,2FFT运算的实现,(3) 功率谱的计算,用FFT计算x(n)的频谱,即计算:,X(k)是由实部XR(k)和虚部X I(k)组成的复数:X(k)=XR(k)+jX I(k) 计算功率谱时只需将FFT变换好的数据,按照实部

15、XR(k)和虚部X I(k)求它们的平方和,然后对平方和进行开平方运算。,2019年3月16日,DSP原理及应用,27,第6章 应用程序设计,3汇编语言程序,程序主体由四个子程序组成:, rfft_task:主调用子程序,用来调用其他子程序,实现统一的接口。 bit_rev:位码倒置子程序,用来实现输入数据的比特反转(倒序)。 fft:FFT算法子程序,用来完成N点FFT运算。分为三个功能块:第一级蝶形运算、第二级蝶形运算、第三级至log2N级蝶形运算。 power:功率谱计算子程序。,2019年3月16日,DSP原理及应用,28,第6章 应用程序设计,4正弦系数表和余弦系数表,正弦和余弦系数

16、表可以由数据文件coeff.inc给出,主程序通过.copy汇编命令将正弦和余弦系数表与程序代码汇编在一起。数据文件coeff.inc给出1024复数点FFT的正弦、余弦系数各512个。利用此系数表可完成81024点FFT的运算。,2019年3月16日,DSP原理及应用,29,第6章 应用程序设计,6.4 正弦波信号发生器,正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计

17、算出一个角度的正弦和余弦值,且只需要较小的存储空间。本节主要介绍用泰勒级数展开法来实现正弦波信号。,2019年3月16日,DSP原理及应用,30,第6章 应用程序设计,6.4 正弦波信号发生器,6.4.1 产生正弦波的算法,正弦函数和余弦函数可以展开成泰勒级数,其表达式:,2019年3月16日,DSP原理及应用,31,第6章 应用程序设计,6.4.1 产生正弦波的算法,取泰勒级数的前5项,得近似计算式:,(6.4.3),(6.4.4),2019年3月16日,DSP原理及应用,32,第6章 应用程序设计,6.4.1 产生正弦波的算法,递推公式:,(6.4.3),(6.4.4),sin(nx) =

18、 2cos(x)sin(n-1)x-sin(n-2)x,cos(nx) = 2cos(x)sin(n-1)x-cos(n-2)x,由递推公式可以看出,在计算正弦和余弦值时,需要已知cos(x)、sin(n-1)x、sin(n-2)x和cos(n-2)x。,2019年3月16日,DSP原理及应用,33,第6章 应用程序设计,计算一个角度x的正弦值,可利用泰勒级数的展开式,采用子程序的调用方式来实现。在调用前先在数据存储器d_xs单元中存放x的弧度值,计算结果存放在d_sinx单元中。,1计算一个角度的正弦值,程序中要用到一些存储单元存放数据和变量,存储单元的分配如下:d_xs:x; d_squr

19、_xs: x2 d_temp_s:暂存; d_sinx:计算结果sinxc_1_s:7FFFh (数值1);d_coef_s :泰勒系数,2019年3月16日,DSP原理及应用,34,第6章 应用程序设计,存储单元分配图:,1计算一个角度的正弦值,2019年3月16日,DSP原理及应用,35,第6章 应用程序设计,程序清单sinx.asm:.title “sinx.asm”.mmregs.def start.ref sin_start,d_xs,d_sinx STACK: .usect “STACK”,10 start: STM #STACK+10,SPLD #d_xs,DPST #6487H

20、,d_xsCALL sin_start end: B end,1计算一个角度的正弦值,;定义符号;定义符号;建立堆栈;设置堆栈指针;设置页指针;xd_xs;调用子程序,2019年3月16日,DSP原理及应用,36,第6章 应用程序设计,程序清单sinx.asm:,1计算一个角度的正弦值,sin_start:.def sin_startd_coef_s .usect “coef_s”,4.datatable_s: .word 01C7H.word 030BH.word 0666H.word 1556Hd_xs .usect “sin_vars”,1d_squr_xs .usect “sin_va

21、rs”,1d_temp_s .usect “sin_vars”,1d_sinx .usect “sin_vars”,1c_1_s .usect “sin_vars”,1,;子程序;定义符号;定义数据空间存放系数;定义程序空间存放系数;c1=1/(89) ;c2=1/(67) ;c3=1/(45) ;c4=1/(23) ;定义1个数据空间存放x;定义1个数据空间存放x2;定义1个暂存单元;定义数据空间存放结果;定义数据空间存放数值1,2019年3月16日,DSP原理及应用,37,第6章 应用程序设计,程序清单sinx.asm:,.textSSBX FRCTSTM #d_coef_s,AR4RPT

22、 #3MVPD #table_s,*AR4+STM #d_coef_s,AR2STM #d_xs,AR3STM #c_1_s,AR5ST #7FFFH,c_1_sSQUR *AR3+,AST A,*AR3| LD *AR5,BMASR *AR3+,*AR2+,B,AMPYA A,;设置小数运算;设置系数表首地址;设置重复操作次数;向系数表传送泰勒系数;系数表首地址送AR2;x单元地址送AR3;数值1地址送AR5;将数值1送c_l_s单元;求x的平方值;x2值存入d_squr_xs单元 ;B=1;A=1-x2/72,T=x2;A=TA= x2(1-x2/72),2019年3月16日,DSP原理及

23、应用,38,第6章 应用程序设计,STH A,*AR3MASR *AR3-,*AR2+,B,AMPYA *AR3+ST B,*AR3| LD *AR5,BMASR *AR3-,*AR2,B,A MPYA *AR3+ST B,*AR3| LD *AR5,BMASR *AR3-,*AR2,B,A MPYA d_xsSTH B,d_sinxRET.end,;(d_temp_s)=x2(1-x2/72);A=1-x2/42(1-x2/72);T= x2(1-x2/72);B=x2(1-x2/42(1-x2/72);(d_temp_s)=x2(1-x2/42(1-x2/72);B=1;A=1-x2/20

24、(1-x2/42(1-x2/72);B=x2(1-x2/20(1-x2/42(1-x2/72);(d_temp_s)=B=;B=1;A=1-x2/6(1-x2/20(1-x2/42(1-x2/72);B=x(1-x2/6(1-x2/20(1-x2/42(1-x2/72);计算sinx结果存入d_sinx单元;子程序返回,2019年3月16日,DSP原理及应用,39,第6章 应用程序设计,计算余弦值与计算正弦值相同。 存储单元分配图:,2计算一个角度的余弦值,2019年3月16日,DSP原理及应用,40,第6章 应用程序设计,实现步骤如下:,3正弦波的实现,第一步:利用sin_start和cos

25、_start子程序,计算045(间隔为0.5)的正弦和余弦值; 第二步:利用sin(2x)=2sin(x)cos(x)公式,计算090的正弦值(间隔为1); 第三步:通过复制,获得0359的正弦值; 第四步:将0359的正弦值重复从PA口输出,便可得到正弦波。,2019年3月16日,DSP原理及应用,41,第6章 应用程序设计,正弦波源程序清单sin.asm,3正弦波的实现,.title “sinx.asm”.mmregs.def start.ref d_xs,sinx,d_sinx,d_xc,cosx,d_cosxsin_x: .usect “sin_x”,360STACK: .usect

26、“STACK”,10k_theta .set 286 ;theta=pi/360(0.5deg)PA0 .set 0,2019年3月16日,DSP原理及应用,42,第6章 应用程序设计,正弦波源程序清单sin.asm,start: .textSTM #STACK+10,SPSTM #0,AR0STM k_theta,AR1STM #sin_x,AR7STM #90,BRCRPTB loop1-1LDM AR0,A LD #d_xs,DPSTL A,d_xsSTL A,d_xc,;主程序;设置堆栈;AR0=x=0;设置增量;AR7指向sin_x;设置重复次数,计算sin0至sin90;取x值;设

27、置页指针;将x值送入d_xs单元 ;将x值送入d_xc单元,2019年3月16日,DSP原理及应用,43,第6章 应用程序设计,正弦波源程序清单sin.asm,CALL sin_startCALL cos_startLD #d_sinx,DPLD d_sinx,16,A MPYA d_cosx STH B,1,*AR7+MAR *AR0+0,;调用sinx子程序,计算x的正弦值;调用cos子程序,计算x的余弦值;切换到正弦指数据区 ;求得正弦值sin(x)加载累加器A;完成sin(x)cos(x)运算,将结果存入B;完成2sin(x)cos(x)运算,;结果存入AR7指定单元;修改AR0,20

28、19年3月16日,DSP原理及应用,44,第6章 应用程序设计,正弦波源程序清单sin.asm,loop1: STM #sin_x+89,AR6STM #88,BRC RPTB loop2-1LD *AR6-,ASTL A,*AR7+loop2: STM #179,BRC STM #sin_x,AR6RPTB loop3-1LD *AR6+,ANEG A STL A,*AR7+,;AR6指向sin_x+89单元;设置重复次数,计算sin91至sin179;设置重复次数,计算sin180至sin359;AR6指向sin_x单元,2019年3月16日,DSP原理及应用,45,第6章 应用程序设计,

29、正弦波源程序清单sin.asm,loop3: STM #sin_x,AR7STM #1,AR1STM #360,BKloop4: PORTW *AR7+0%,PA0B loop4.end,;AR7指向sin_x单元;设置缓冲区长度;输出正弦值;循环输出,产生正弦波,2019年3月16日,DSP原理及应用,46,第6章 应用程序设计,产生正弦波链接命令文件sin.cmd,vectors.objsin.obj-o sin.out-m sin.map-e startMEMORYPAGE0:EPROM: org = 0E000H,len=1000HVECS: org = 0FF80H,len=0080

30、HPAGE1:SPRAM: org = 0060H, len=0020HDARAM1: org = 0080H, len=0010HDARAM2: org = 0090H, len=0010HDARAM3: org = 0200H, len=0200H,2019年3月16日,DSP原理及应用,47,第6章 应用程序设计,产生正弦波链接命令文件sin.cmd,SECTIONS.text : EPROM PAGE0.data : EPROM PAGE0STACK : SPRAM PAGE1sin_vars : DARAM1 PAGE1coef_s : DARAM1 PAGE1cos_vars : DARAM1 PAGE1coef_c : DARAM2 PAGE1sin_x : align (512) DARAM3 PAGE1.vectors : VECS PAGE0,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报