DSP技术-06 电子通信08_第1页
DSP技术-06 电子通信08_第2页
DSP技术-06 电子通信08_第3页
DSP技术-06 电子通信08_第4页
DSP技术-06 电子通信08_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章 应用程序设计一、FIR滤波器的DSP实现二、IIR滤波器的DSP实现三、FFT运算的DSP实现四、正弦波信号发生器1一、FIR滤波器的DSP实现 数字信号处理主要是面向实时密集型数据运算,滤波在数字信号处理中占有极其重要的地位。用DSP芯片实现数字滤波具有稳定性好、精确度高、不受环境影响,以及灵活性好等突出优点。 数字滤波又称为程序滤波,其功能是将输入的数字信号通过一定的运算关系(程序实现)变为所需要的输出信号,也即:实现数字滤波就必须把输入输出信号关系转变成可实现的数学模型或算法。2 离散系统的输入输出关系有几种不同的描述方法,例如:时域卷积、差分方程、频域的离散傅立叶变换、复频域的

2、Z变换等,最常用的描述离散系统的数学形式是系统函数H(Z)或差分方程。 数字系统可以分为:无限冲激响应系统(IIR)和有限冲激响应系统(FIR)。 IIR系统因为与过去输出有关,所以网络结构有反馈支路称为递归结构,FIR系统只与激励有关没有反馈支路,称为非递归结构。3 IIR系统的系统函数H(Z)有极点,FIR系统的系统函数H(Z)只有零点; IIR系统的差分方程y(n)除了与当前及以往的激励有关,还与以前的输出有关,FIR系统的差分方程y(n)只与当前及以往的激励有关,而与过去的输出无关; IIR系统的单位冲激响应h(n)有无穷多项,FIR系统的h(n) 只有有限项;4 1FIR滤波器基本概

3、念 FIR滤波器的系统函数为没有反馈回路,因此它是稳定系统,其单位冲激响应h(n)是一个有限长序列。FIR系统的差分方程为实际上是一种乘法累加运算。5FIR滤波器的基本结构图:由结构图看出,实际算法由一组基本运算单元:乘法器、加法器、延迟器组成。显然,最主要的问题是延迟环节如何实现。6 2. FIR滤波器中z-1的实现 对于N级的FIR滤波器,在数据存储器中开辟一个称为滑窗的N个单元的线性数据缓冲区,存放最新的N个输入样本;从最老的样本开始,每读一个样本后,将此样本向下移位,读完最后一个样本后,输入最新样本至缓冲区的顶部。 用线性缓冲区实现z-1的优点是,新老数据在存储器中存放的位置直接明了。

4、(1)用线性缓冲区法实现z-1 7N=6的线性缓冲区存储器图8C54x片内没有I/O资源,CPU通过外部译码可以寻址64K的I/O空间。有两条实现输入和输出的指令:PORTR PA, Smem ;将PA端口的内容送 ;数据存储器SmemPORTW Smem, PA ;将地址为Smem的数据 ;存储器内容送端口PA数据的输入/输出 9 使用存储器延时指令DELAY,可以将数据存储单元中的内容向较高地址的下一单元传送。实现z-1的运算指令为:DELAY Smem ;(Smem)Seme+1,数据存储器 ;单元的内容复制下一高地址单元DELAY *AR2 ;AR2指向源地址,即将AR2所指单 ;元内

5、容复制到下一高地址单元中 ;延时指令与其它指令结合 LD+DELAYLTD指令 ;单数据存储器的值装入 ;T寄存器并送下一单元延时 MAC+DELAYMACD指令 ;乘加延迟存储器的延时操作10 在数据存储器中开辟一个称为滑窗的N个单元的循环缓冲区,循环缓冲区地址首尾相邻:滑窗中存放最新的N个输入样本,每次输入新样本时,以新样本改写滑窗中最老的数据,而滑窗中的其它数据不移动;利用片内循环缓冲区长度寄存器对滑窗进行间接寻址。 利用循环缓冲区实现Z-1的优点是不需要移动数据,不存在一个机器周期中要求能一次读和一次写的数据存储器,因而可以将循环缓冲区定位在数据存储器的任何位置(线性缓冲区要求定位在D

6、ARAM)。 (2)用循环缓冲区法实现z-111N=6的循环缓冲区存储器图12 3FIR滤波器的DSP实现方法 FIR滤波器的输出表达式写为 y(n)=b0 x(n)+b1x(n-1)+bn-1x(n-N+1)其结构图FIR滤波算法实际上是一种乘累加运算。它不断地从输入端读入样本值 xn,经延时(z-1)后做乘法累加,输出滤波结果yn。13 FIR滤波算法实际上是一种乘累加运算。它不断地从输入端读入样本值 xn,经延时(z-1)后做乘法累加,输出滤波结果yn。C54x通过两种方法实现FIR滤波器的延迟: 1. 线性缓冲区法 2. 循环缓冲区法 3.系数对称FIR滤波器的实现方法14例:编写N=

7、5的y(n)计算程序。y(n)=a0*x(n)+a1*x(n-1)+a2*x(n-2)+a3*x(n-3)+a4*x(n-4), 先将系数a0a4存放在数据存储器中,然后设置线性缓冲区,用以存放输入和输出数据。(1)用线性缓冲区和直接寻址方法实现FIR线性缓冲区安排:15 .title “FIR1.ASM” ;定义源程序名 .mmregs ;定义存储器映象寄存器 .def start ;定义语句标号start .bss y,1 ;为结果y预留1个单元的空间XN .usect “XN”,1 ;在自定义的未初始化段“XN”XNM1 .usect “XN”,1 ;中保留5个单元的空间XNM2 .us

8、ect “XN”,1XNM3 .usect “XN”,1 XNM4 .usect “XN”,1A0 .usect “A0”,1 ;在自定义的未初始化段“A0”A1 .usect “A0”,1 ;中保留5个单元的空间A2 .usect “A0”,1A3 .usect “A0”,1A4 .usect “A0”,1PA0 .set 0 ;定义PA0为输出端口PA1 .set 1 ;定义PA1为输入端口16 .datatable: .word 1*32768/10 ;假定程序空间有五个参数 .word -3*32768/10 .word 5*32768/10 .word -3*32768/10 .wo

9、rd 1*32768/10 .textstart: SSBX FRCT ;设置进行小数相乘 STM #A0,AR1 ;将数据空间用于放参数的首地址送AR1 RPT #4 ;重复下条指令5次传送 MVPD table,*AR1+ ;传送程序空间的系数到数据空间 LD #XN,DP ;设置数据存储器页指针的起始位置 PORTR PA1,XN ;从数据输入端口I/O输入最新数据x(n)FIR1: LD XNM4,T ;x(n-4)T17MPY A4,A ;a4*x(n-4)ALTD XNM3 ;x(n-3)T, x(n-3)x(n-4)MAC A3,A ;A+a3*x(n-3)ALTD XNM2 ;

10、x(n-2)T, x(n-2)x(n-3)MAC A2,A ;A+a2*x(n-2)ALTD XNM1 ;x(n-1)T, x(n-1)x(n-2)MAC A1,A ;A+a1*x(n-1)ALTD XN ;x(n)T, x(n)x(n-1)MAC A0,A ;A+a0*x(n)ASTH A,y ;保存y(n)的高字节PORTW y,PA0 ;输出y(n)BD FIR1 ;执行完下条指令后循环(带延迟转移)PORTR PA1,XN ;输入新的x(n).end18vectors.objfir1.obj-o fir1.out-m fir1.map-e startMEMORY PAGE 0 : EP

11、ROM: org=01OOOH len=01000H VECS: org=03F80H len=00080H PAGE 1 : SPRAM: org=00060H len=00020H DARAM: org=00080H len=01380H SECTIONS .vectors: VECS PAGE 0 .text: EPROM PAGE 0 .data: EPROM PAGE 0 .bss: SPRAM PAGE 1 .XN: DARAM align(8) PAGE 1 .A0: DARAM align(8) PAGE 1 19(2)用线性缓冲区和间接寻址方法实现FIR例:编写y(n)=a0

12、*x(n)+a1*x(n-1)+a2*x(n-2)+a3*x(n-3)+a4*x(n-4),的计算程序,其中N=5。 将系数a0a4存放在数据存储器中,并设置线性缓冲区存放输入数据。利用AR1和AR2分别作为间接寻址线性缓冲区和系数区的辅助寄存器。 20 .title “FIR2.ASM” ;定义源程序名 .mmregs ;定义存储器映象寄存器 .def start ;定义语句标号start .bss y,1 ;为结果y预留1个单元的空间x .usect “x”,5 ;在自定义的未初始化段“x”中保留5个单元的空间a .usect “a”,5 ;在自定义的未初始化段“a”中保留5个单元的空间P

13、A0 .set 0 ;定义PA0为输出端口PA1 .set 1 ;定义PA1为输入端口 .datatable: .word 2*32768/10 ;假定程序空间有五个参数 .word -3*32768/10 .word 4*32768/10 .word -3*32768/10 .word 2*32768/1021 .textstart: SSBX FRCT ;小数相乘 STM #a,AR2 ;将数据空间用于放系数的首地址送AR2 RPT #4 ;重复下条指令5次传送 MVPD table,* AR2+ ;传送程序空间的系数到数据空间 STM #x4, AR1 ;AR1指向x(n-4) STM

14、#a4, AR2 ;AR2指向a4 STM #4, AR0 ;指针复位值4AR0 LD #x, DP ;设置数据存储器页指针的起始位置 PORTR PA1,x ;从端口PA1输入最新值x(n)22FIR2: LD *AR1-, T ;x(n-4)T MPY *AR2-, A ;a4*x(n-4)A LTD *AR1- ;x(n-3)T, x(n-3)x(n-4) MAC *AR2-, A ;A+a3*x(n-3)A LTD *AR1- ;x(n-2)T, x(n-2)x(n-3) MAC *AR2-, A ;A+a2*x(n-2)A LTD *AR1- ;x(n-1)T, x(n-1)x(n-

15、2) MAC *AR2-, A ;A+a1*x(n-1)A LTD *AR1 ;x(n)T, x(n)x(n-1) MAC *AR2+0, A ;A+a0*x(n)A ,AR2复原,指向a4 STH A,y ;保存运算结果的高位字到y(n) PORTW y(n),PA0 ;将结果y(n)输出到端口PA0 BD FIR2 ;执行完下条指令后,从FIR2开始循环 PORTR PA1,*AR1+0 ;输入新值x(n), AR1复原指向x4 .end23(3)用线性缓冲区和带移位双操作数寻址方法实现FIR例:编写y(n)=a0*x(n)+a1*x(n-1)+a2*x(n-2)+a3*x(n-3)+a4

16、*x(n-4),的计算程序,其中N=5。 系数a0a4存放在程序存储器中,输入数据存放在数据存储器的线性缓冲区中。乘法累加利用MACD指令,该指令完成数据存储器单元与程序存储器单元相乘,并累加、移位的功能。 24 .title “FIR3.ASM” ;定义源程序名 .mmregs ;定义存储器映象寄存器 .def start ;定义语句标号start .bss y,1 ;为结果y预留1个单元的空间x .usect “x”,6 ;在自定义的未初始化 ;段“x”中保留6个单元PA0 .set 0 ;定义PA0为输出端口PA1 .set 1 ;定义PA1为输入端口 .data ;假定程序空间有五个参

17、数COEF: .word 1*32768/10 ;a4 .word -4*32768/10 ;a3 .word 3*32768/10 ;a2 .word -4*32768/10 ;a1 .word 1*32768/10 ;a025 .textstart: SSBX FRCT ;设置小数乘法 STM #x+5, AR1 ;AR1指向x(n-4) STM #4, AR0 ;设置AR1复位值 LD #x+1, DP ;设置数据存储器页指针的起始位置 PORTR PA1, x+1 ;输入最新值x(n)FIR3: RPTZ A,#4 ;累加器A清0, 设置重复下条指令5次 MACD *AR1-, COE

18、F, A ;x(n-4)T, A= x(n-4)*a4 +A ;(PAR)+1PAR, x(n-4)x(n-3) STH A, *AR1 ;暂存结果到y(n) PORTW *AR1+, PA0 ;输出y(n)到PA0,AR1指向x(n) BD FIR3 ;执行下条指令后循环 PORTR PA1, *AR1+0 ;输入新数据到x(n), AR1指向x(n-4)26【例】用循环缓冲区和双操作数寻址方法编写实现FIR滤波的程序。1)FIR滤波器设计 设计一个FIR低通滤波器,通带边界频率为1500Hz,通带波纹小于1dB;阻带边界频率为2000Hz,阻带衰减大于40dB;采样频率为8000Hz。FI

19、R滤波器的设计可以用 MATLAB窗函数法进行。 b=fir1(16,1500/8000*2)-设计滤波器参数 h=round(b*215) -浮点数转换为定点数Q15格式(4)用循环缓冲区和双操作数寻址方法实现FIR272)产生滤波器输入信号的文件 按照通常的程序调试方法,先用Simulator逐步调试各子程序模块,再用硬件仿真器在实际系统中与硬件仪器联调。使用CCS的Simulator进行滤波器特性测试时,需要输入时间信号x(n)。 本例设计一个采样频率Fs为8000Hz,输入信号频率为1000Hz和2500Hz的合成信号,通过设计的低通滤波器将2500Hz信号滤掉,余下1000Hz信号。

20、283)编写FIR数字滤波器的汇编源程序FIR数字滤波器汇编程序fir.asm如下:*一个FIR滤波器源程序fir.asm * .mmregs .global start .def start,_c_int00INDEX .set 1KS .set 256 ;输入样本数据个数N .set 17 ;FIR滤波器阶数COEF_FIR .sect COEF_FIR;FIR滤波器系数29 .word 0,158,264,-290,-1406,-951,3187,9287,12272 .word 9287,3187,-951,-1406,-290,264,158,0 .dataINPUT .copy “

21、firin.inc” ;输入数据在数据区0 x2400OUTPUT .space 1024 ;输出数据在数据区0 x2500COEFTAB .usect “FIR_COEF”,N ;自定义段,为未初始化变量DATABUF .usect “FIR_BFR”,N ;保留存储空间BOS .usect “STACK”,0FhTOS .usect “STACK”,1 30 .text ;文本段 .asg AR0,INDEX_P ;将一个字符串赋给一个符号 .asg AR4,DATA_P ;输入数据x(n)循环缓冲区指针 .asg AR5,COEF_P ;FIR系数表指针 .asg AR6,INBUF_P

22、 ;模拟输入数据指针 .asg AR7,OUTBUF_P ;FIR滤波器输出数据指针_c_int00 b start nop nopstart: SSBX FRCT ;设置小数乘法 STM #COEFTAB, COEF_P ;将FIR系数从程序存储区 RPT #N-1 ;移到数据存储区 MVPD #COEF_FIR,*COEF_P+ STM #INDEX,INDEX_P31 STM #DATABUF,DATA_P ;数据循环缓冲区清零 RPTZ A,#N-1 STL A,*DATA_P+ STM #(DATABUF+N-1),DATA_P ;数据循环缓冲区指针 ;指向xn-(N-1) STM

23、#COEFTAB,COEF_P FIR_TASK: STM #INPUT,INBUF_P STM #OUTPUT,OUTBUF_P STM #KS-1,BRC ;块重复计数器32 RPTBD LOOP-1 STM#N,BK ;FIR循环缓冲区大小 LD *INBUF_P+,A ;装载输入数据FIR_FILTER: ;FIR滤波运算 STL A,*DATA_P+% ;用最新的样本值 ;替代最旧的样本值 RPTZA,N-1 MAC *DATA_P+0%,*COEF_P+0%,A ;计算 STH A,*OUTBUF_P+ LOOP: EEND B EEND .end334)编写FIR滤波器链接命令文

24、件对应以上汇编程序的链接命令文件fir.cmd如下:fir.obj-m fir.map-o fir.outMEMORYPAGE0: ROM1(RIX) :ORIGIN=0080H,LENGTH=100HPAGE1: INTRAM1(RW) :ORIGIN=2400H,LENGTH=0200H INTRAM2(RW) :ORIGIN=2600H,LENGTH=0100H INTRAM3(RW) :ORIGIN=2700H,LENGTH=0100H B2B(RW) :ORIGIN=0070H,LENGTH=10H34SECTIONS.text :ROM1PAGE 0.data : INTRAM1

25、PAGE 1FIR_COEF: INTRAM2 PAGE 1FIR_BFR : INTRAM3 PAGE 1.stack : B2B PAGE 1 355)CCS集成开发环境下上机操作过程(1)在CCS上建立fir工程并运行fir.out程序。 (2)观察输入信号的波形及频谱。(3)观察输出信号的波形及频谱。36 Graph 属性设置窗口37 输入信号的时域波形 输入信号的频谱图38 滤波器输出信号时域波形 滤波器输出信号频谱图39 4.系数对称FIR滤波器设计 系数对称的FIR滤波器具有线性相位特性,这种滤波器是用得最多的FIR滤波器,特别是对相位失真要求很高的场合。 如果FIR滤波器的h(

26、n)是实数,且满足偶对称h(n)=h(N-1-n)或奇对称h(n)=-h(N-1-n)的条件,则滤波器具有线性相位特性。 一个对称FIR滤波器满足h(n)=h(N-1-n)。 40例如,N=8的FIR滤波器,其输出方程为:Y(n)=h0 x(n)+h1x(n-1)+h2x(n-2)+h3x(n-3)+h3x(n-4) +h2x(n-5)+h1x(n-6)+h0 x(n-7) 总共有8次乘法和7次加法。如果利用对称性,可将其改写成: Y(n)=h0 x(n)+x(n-7)+h1x(n-1)+x(n-6)+h2x(n-2) +x(n-5)+h3x(n-3)+x(n-4) 变成4次乘法和7次加法,乘

27、法运算的次数少了一半。这是对称FIR的一个优点。 41 对称FIR滤波器的实现可按如下步骤进行:(1)将数据存储器分为新旧两个循环缓冲区,每个循环缓冲区的长度为N/2,New循环缓冲区中存放N/2=4个新数据;Old循环缓冲区中存放N/2=4个老数据。42(2)设置循环缓冲区指针,以AR2指向New循环缓冲区中最新数据;以AR3指向Old循环缓冲区中最老数据。(3)在程序存储器中设置系数表。(4)(AR2)+(AR3)AH(累加器A的高位),AR2-1AR2,AR3-1AR3。(5)将累加器B清0,重复执行4次(i=0,1,2,3)下面的运算: (AH)*系数hi+(B)B,系数指针(PAR)

28、加1, (AR2)+(AR3)AH,AR2和AR3减。43(6)保存和输出结果(结果在BH中)。(7)修正数据指针,让AR2和AR3分别指向New循环缓冲区最新的数据和Old循环缓冲区中最老的数据。(8)用New循环缓冲区中最老的数据替代Old循环缓冲区中最老的数据。Old循环缓冲区指针减1。(9)输入一个新数据替代New循环缓冲区中最老的数据。 重复执行(4)(9)步。44 C54x的有限冲激响应滤波器指令FIRS为: FIRS Xmem,Ymem,Pmad该指令执行 PmadPAR(程序存储器地址寄存器) 当(RC)!= 0 (B)+(A(3216)(由PAR寻址Pmem)B (Xmem)

29、+(Ymem)16A (PAR)+1PAR (RC)-1RC FIRS指令在同一个机器周期内,通过C和D总线读2次数据存储器,同时通过P总线读一个系数。45例 设计对称FIR滤波器(N=8)。 .title “FIR5.ASM” ;给汇编程序取名 .mmregs ;定义存储器映象寄存器 .def start ;定义标号start的起始位置 .bss y,1 ;为未初始化变量y保留空间x_new .usect “DATA1”,4 ;自定义4个单元的未初始化段DTAT1x_old .usect “DATA2”,4 ;自定义4个单元的未初始化段DATA2Size .set 4 ;定义符号size=4

30、PA0 .set 0 ;设置数据输出端口I/O,PA0=0PA1 .set 1 ;设置数据输入端口I/O,PA1=1 .dataCOEF .word 1*32768/10,2*32768/10 ;系数对称,只需 .word 3*32768/10,4*32768/10 ;给出N/2=4个系数46 .textstart: LD #y, DP ;设置数据存储器页指针的起始位置 SSBX FRCT ;小数乘法 STM #x_new, AR2 ;AR2指向新缓冲区第1个单元 STM #x_old+(size-1), AR3 ;AR3指向老缓冲区最后1个单元 STM #size, BK ;设置循环缓冲区长

31、度BK =size STM #-1, AR0 ;循环控制增量AR0=-1 PORTR PA1, #x_new ;从I/O输入端口PA1 ;输入数据到x(n)47FIR5: ADD *AR2+0%,*AR3+0%,A ;AH=x(n)+ x(n-7) ;(第一次) RPTZ B, #(size-1) ;RC=#size-1+1,B=0 FIRS *AR2+0%,*AR3+0%, COEF ;B+=AH*h0, ;AH=x(n-1)+x(n-6) STH B, y ;保存结果到y PORTW y, PA0 ;输出结果到PA0 MAR *+AR2(2)% ;修正AR2,指向新缓 ; 冲区最老的数据

32、MAR *AR3+% ;修正AR3,指向老缓 ;冲区最老的数据 MVDD *AR2, *AR3+0% ; 新缓冲区向老缓冲区传送一个数 ; 用新缓冲区最老的数据覆盖旧缓冲区 ; 最老的数据 BD FIR5 ;执行完下条指令后转移FIR5并循环 PORTR PA1, *AR2 ; 输入新数据至新缓冲区 .end48二、用DSP实现IIR滤波器 1IIR滤波器的基本概念 N阶无限冲激响应(IIR)滤波器的脉冲传递函数表达式为:其差分方程表达式可写为:49Y(n)由两部分构成:第一部分 是一个对x(n)的M节延时链结构,每节延时抽头后加权相加,是一个横向结构网络;第二部分 也是一个N节延时链的横向结

33、构网络,不过它是对y(n)的延时,因此是个反馈网络。IIR滤波器的脉冲传递在Z平面上有极点存在,其单位冲激响应是无限长序列。50 IIR滤波器与FIR滤波器的一个重要区别是,IIR可以用较少阶数获得很高的选择特性,所用存储单元少,运算次数少,具有经济、高效的特点。但是,在有限精度的运算中,可能出现不稳定现象。而且,选择性越好,相位的非线性越严重,而FIR滤波器可以得到严格的线性相位。 因此,在相位要求不很敏感的场合,如语言通信等,选用IIR滤波器较为合适;而对于图像信号处理、数据传输等以波形携带信息的系统,对线性相位要求较高,在条件许可的情况下,采用系数对称FIR滤波器较好。51直接形式的二阶

34、IIR数字滤波器 对于直接形式的二阶IIR数字滤波器,其结构如图所示: 2二阶IIR滤波器的实现方法 52存放输入、输出变量和滤波器 系数的缓冲区编程时,将变量和系数都存放在DARAM中,并采用循环缓冲区方式寻址,共需开辟4个循环缓冲区,用来存放变量和系数。这4个循环缓冲区的结构如图所示:53【例】设计一个三阶的切比雪夫型带通数字滤波器,其采样频率Fs=16kHz,其通频带3.2kHzf4.8kHz,内损耗不大于1dB;f5.6kHz为阻带,其衰减大于20dB。(1)IIR滤波器的设计利用MATLAB信号处理工具箱设计IIR滤波器,程序为: wp=3.2,4.8;ws=2.4,5.6;rp=1

35、;rs=20 n,wn=cheb1ord(wp/8,ws/8,rp,rs) b,a=cheby1(n,rp,wn) 54设计结果为: N=3 wn =0.4000 0.6000 b0=0.0114747 a0=1.000000 b1=0 a1=0 b2=-0.034424 a2=2.13779 b3=0 a3=0 b4=0.034424 a4=1.76935 b5=0 a5=0 b6=-0.0114747 a6=0.53975855(2)产生滤波器输入信号的文件使用CCS的Simulator进行滤波器特性的测试时,需要输入时间信号x(n)。 #include #include void mai

36、n() int i; double f256; FILE *fp; if(fp=fopen(iirin.inc,wt)=NULL) printf(cant open file! n); return; 56fprintf(fp,INPUT: .sect %cINPUT %cn,);for(i=0;iROM PAGE 0.data:DARAM PAGE 1BN:DARAM PAGE 1AN:DARAM PAGE 1 INBUF:RAM1 PAGE 1OUTPUT:RAM2 PAGE 165 3高阶IIR滤波器的实现 一个高阶IIR滤波器可以分解成若干个二阶基本节相级联。由于调整每个二阶基本节的系

37、数,只涉及到这个二阶节的一对极点和零点,不影响其他零、极点,因此便于调整系统的性能。 此外,由于字长有限,每个二阶基本节运算后都会带来一定的误差,合理安排各二阶基本节的前后次序,将使系统的精度得到优化。66对高阶IIR滤波器的几点特殊处理 当出现一个或一个以上系数。此时,既可以用最大的系数来定标,即用最大的系数去除所有的系数,也可以将此的系数分解成两个的系数进行运算和相加,例如B0=1.2,则:X(n)*B0=x(n)*(B0/2)+x(n)*(B0/2)=0.6*x(n)+0.6*x(n)这样,将使所有的系数保持精度,而仅仅多开销一个机器周期。(1)系数时的定标方法67(2)对输入数据定标

38、一般地,从外设口输入一个数据加载到累加器A,可用以下指令: PORTR 0001h, Xin LD Xin, 16,A如果运算过程中可能出现的输出值,可在输入数据时将其缩小若干倍,如: PORTR 0001h, Xin LD Xin, 16-3,A将输入数据除以8,将使输出值小于。上面用多种不同的方法进行了滤波器的设计,在实现滤波器功能的前提下,程序的繁简和对存储器的使用情况是不同的,应用中应根据具体情况进行选择。 68三、FFT运算的DSP实现FFT:是一种高效实现离散傅氏变换的算法。 FFT:一个非常重要的工具经常使用,甚至成为DSP运 算能力的一个考核因素。主要内容:1 基二实数FFT运

39、算的算法2 FFT运算模拟信号的产生及输入3 实序列FFT汇编源程序及链接命令文件4 观察信号时域波形及其频谱691. 基二实数FFT运算的算法该算法主要分为以下四步:第一步,输入数据的组合和位倒序把输入序列作位倒序是为了在整个运算最后的输出中得到的序列是自然顺序。第二步,N点复数FFT在DATA数据处理缓冲器里进行N点复数FFT运算。70第三步,分离复数FFT的输出为奇部分和偶部分分离FFT输出为RP、RM、IP和IM四个序列,即偶实数、奇实数、偶虚数和奇虚数四部分。第四步,产生2N点的复数FFT输出序列产生2N=256个点的复数输出,它与原始的256个点的实输入序列的DFT一致。712.

40、FFT运算模拟信号的产生及输入产生模拟输入信号可以有两种方法:第一种方法是用C语言程序产生mdata.inc文件,然后,在DSP汇编语言程序中通过.copy汇编命令将生成的数据文件mdata.inc复制到汇编程序中。第二种方法是建立与输入信号对应的数据流文件mdata.dat,具体操作步骤见教材内容。723. 实序列FFT汇编源程序及链接命令文件【例】256点实序列FFT的DSP实现。 256点实序列FFT汇编源程序如下: * *Radix-2,DIT,Real-input FFT Program * * fft.asm * * .mmregs .global reset,start,sav_

41、sin,sav_idx,sav_grp .def start,_c_int00 .data 73DATA .space 1024.copy mdata1.inc; mdata1.inc 为模拟输入信号数据,起始地址标号INPUTN.set128 ;复数点数LOGN.set7 ;蝶形级数sav_grp.usect tempv,3 ;定义组变量值sav_sin.setsav_grp+1 ;定义旋转因子表sav_idx.setsav_grp+2OUTPUT.usect OUTPUT,256 ;信号功率谱BOS.usectstack,0Fh ;定义堆栈TOS.usectstack,1 .copy “t

42、widdle1.inc” ;正弦表系数由twiddle1.inc ;文件给出,起始地址标号TWI174.copy “twiddle2.inc“ ; 余弦表系数由twiddle2.inc文件给 ;出,起始地址标号TWI2.text_c_int00b start nopnopstart:STM#TOS,SPLD#0,DPSSBXFRCT 75输入信号时域波形、频谱图及其功率谱4. 观察信号时域波形及其频谱76 四、正弦信号发生器用DSP实现正弦信号发生器的基本方法有三种:(1) 查表法。即将某个频率的正弦/余弦值计算出来后制成一个表,DSP工作时仅作查表运算即可。这种方法适用于信号精度要求不是很高

43、的情况。当对于信号的精度要求较高时,其信号采样点的个数增多,占用的存储器空间也将增大。(2) 泰勒级数展开法。与查表法相比,可以精确计算出一个角度的正弦值而需要的存储单元少,但是泰勒级数展开一般只能取有限次项,因而精度受到局限。(3) 迭代法。利用数字振荡器通过迭代方法产生正弦信号。77 数字振荡器原理设单位冲击序列经过一系统后,其输出为正弦序列 则系统的脉冲传递函数为其中,振荡频率由系数A、B和C决定。因此,设计振荡器主要就在于确定这些系数。 78设初始值为0,数字振荡器的二阶差分方程形式为: 利用单位冲击函数性质,即仅当k=1时,xk1=1,得:当k2,yk能用yk1和yk2算出,递归的差

44、分方程。 792 正弦波信号发生器的设计要求:利用 设计产生频率为 的正弦波; 采用定时中断的方法输出yn ; 设采样率为 (即通过定时器中断,每隔25s产生一个yn)。80递归差分方程的系数为: 将所有系数除以2,用16位定点,得81 定时器的初值计算要求:定时器产生25s时间间隔,获得40kHz的采样频率。定时器的初值计算由下式决定式中 为DSP时钟频率, 为采样频率。设预分频系数TDDR=0,则定时器周期寄存器初值PRD为本例中 , ,则PRD=2499。82 3 正弦波信号发生器的实现初始化:初始化y1和y2、初始化定时器、初始化中断1. 初始化y1和y2SSBXFRCT ;置FRCT =1,进行小数乘法运算ST #INIT_A,AA ;将常数A装入变量AAST #INIT_B,BB ;将常数B装入变量BBST #INIT_C,CC ;将常数C装入变量CC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论