《第7章应用程序设计.ppt》由会员分享,可在线阅读,更多相关《第7章应用程序设计.ppt(86页珍藏版)》请在优知文库上搜索。
1、第第7章章 应用程序设计应用程序设计本章内容提要:本章内容提要:n定标与溢出处理定标与溢出处理n基础算术运算基础算术运算nFIR滤波器滤波器nIIR滤波器滤波器n快速傅里叶变换快速傅里叶变换(FFT)7.1定标与溢出处理定标与溢出处理n数的定标数的定标n溢出的处理方法溢出的处理方法n常用信号处理算法中的定标方法常用信号处理算法中的定标方法7.1.1 数的定标数的定标l小数定标的概念小数定标的概念u设定一个设定一个16位数的小数点处于该数中的哪一位位数的小数点处于该数中的哪一位u可以表示不同大小和不同精度的小数可以表示不同大小和不同精度的小数lQ表示法表示法u表表7-1列出了一个列出了一个16位
2、数的位数的16种种Q表示及它们所能表示及它们所能表示的十进制数值范围表示的十进制数值范围表表7-1 Q表示及数值范围表示及数值范围l不同的不同的Q所表示的数不仅范围不同,而且精度也不相同所表示的数不仅范围不同,而且精度也不相同uQ越大,数值范围越小,但精度越高越大,数值范围越小,但精度越高uQ越小,数值范围越大,但精度就越低越小,数值范围越大,但精度就越低例如,例如,Q0的数值范围是的数值范围是-32768到到+32767,其精度为,其精度为1;Q15的数值范围为的数值范围为-1到到0.9999695,精度为,精度为 1/32768=0.00003051对定点数而言,数值范围与精度是一对矛盾。
3、一个变量要对定点数而言,数值范围与精度是一对矛盾。一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。在实际的而想提高精度,则数的表示范围就相应地减小。在实际的定点算法中,应该根据具体问题进行折衷处理定点算法中,应该根据具体问题进行折衷处理,以达到最以达到最佳效果。佳效果。l在在C55x中,中,16位整数采用补码形式表示。每个采用位整数采用补码形式表示。每个采用Qi定标的定标的16位数用位数用1个符号位、个符号位、i个小数位和个小数位和15-i个整个整数位来表示。数位来表示。表表7-2 同样的数
4、在不同定标方式下所表示的具体数值同样的数在不同定标方式下所表示的具体数值l同样一个同样一个16位数,若小数点设定的位置不同,它所表位数,若小数点设定的位置不同,它所表示的数也就不同。示的数也就不同。7.1.2 溢出的处理方法溢出的处理方法l如果算术运算结果超出寄存器所能表示的最大数就如果算术运算结果超出寄存器所能表示的最大数就会出现溢出会出现溢出u因为因为16位定点位定点DSP的动态范围有限,所以在使用的动态范围有限,所以在使用时必须注意动态范围以防溢出时必须注意动态范围以防溢出l溢出还与输入信号的特性和运算法则有关溢出还与输入信号的特性和运算法则有关 1.溢出溢出 C55x有以下几种硬件特性
5、可以处理溢出:有以下几种硬件特性可以处理溢出:l保护位保护位 C55x的每个累加器都有的每个累加器都有8个保护位(个保护位(3932位),位),允许连续允许连续256次乘加操作而累加器不溢出次乘加操作而累加器不溢出l溢出标志位溢出标志位 C55x的每个累加器都有相关的溢出标志位,当累加的每个累加器都有相关的溢出标志位,当累加器操作结果出现溢出时,这个标志位就会置位器操作结果出现溢出时,这个标志位就会置位2.C55x的溢出处理机制的溢出处理机制l饱和方式位饱和方式位SATD和和SATAuSATD控制控制D单元的操作,单元的操作,SATA控制控制A单元的操作。单元的操作。u如果如果SATD=1,当
6、,当D单元发生溢出时,对单元发生溢出时,对D单元的结单元的结果进行饱和处理。不管饱和方式位的值是什么,当果进行饱和处理。不管饱和方式位的值是什么,当累加器发生溢出时,相应的溢出标志位都会被置位累加器发生溢出时,相应的溢出标志位都会被置位uA单元没有溢出标志位,但如果单元没有溢出标志位,但如果SATA=1,发生溢出,发生溢出时,结果也会进行饱和处理时,结果也会进行饱和处理 饱和处理是用最近的边界值代替溢出结果。饱和处理是用最近的边界值代替溢出结果。例如,例如,1616位寄存器的范围是位寄存器的范围是8000h8000h(最小负数)(最小负数)7FFFh7FFFh(最大正数),饱和处理就是用(最大
7、正数),饱和处理就是用7FFFh7FFFh代替比代替比7FFFh7FFFh大的大的结果;用结果;用8000h8000h代替比代替比8000h8000h小的结果。小的结果。l饱和。饱和是一种处理溢出的方法,但是饱和会剪掉部饱和。饱和是一种处理溢出的方法,但是饱和会剪掉部分输出信号,可能会引起信号失真和引起系统非线性。分输出信号,可能会引起信号失真和引起系统非线性。l输入定标。分析所要使用的系统,假定最坏的情况,然输入定标。分析所要使用的系统,假定最坏的情况,然后对输入信号定标,以防止溢出。但是这种方法会极大后对输入信号定标,以防止溢出。但是这种方法会极大地降低输出信号的精确度。地降低输出信号的精
8、确度。l固定定标。假定最坏的情况,对中间结果定标。这种方固定定标。假定最坏的情况,对中间结果定标。这种方法可以防止溢出,同时增加了系统的信噪比。法可以防止溢出,同时增加了系统的信噪比。l动态定标。可以监测中间结果的范围,只在需要的时候动态定标。可以监测中间结果的范围,只在需要的时候对中间结果定标。这种方法可以防止溢出但会增加计算对中间结果定标。这种方法可以防止溢出但会增加计算量。量。3.溢出的处理方法溢出的处理方法7.1.3 常用信号处理常用信号处理 算法中的定标方法算法中的定标方法lFIR滤波器的定标方法滤波器的定标方法u在在FIR滤波器中处理溢出的最好方法是设计时使滤滤波器中处理溢出的最好
9、方法是设计时使滤波器的增益小于波器的增益小于1,这样就不需要对输入信号定标。,这样就不需要对输入信号定标。这种方法和累加器的保护位结合起来,可以有效地这种方法和累加器的保护位结合起来,可以有效地防止溢出。防止溢出。u由于对信号处理的负面影响,在由于对信号处理的负面影响,在FIR滤波器中不使滤波器中不使用固定定标和输入定标。如果不考虑计算量,在用固定定标和输入定标。如果不考虑计算量,在FIR滤波器中可以使用动态定标。对一些类型的音滤波器中可以使用动态定标。对一些类型的音频信号,饱和处理也是一种常用的方法。频信号,饱和处理也是一种常用的方法。lIIR滤波器的定标方法滤波器的定标方法uIIR滤波器的
10、定点实现推荐使用多个二阶基本节级滤波器的定点实现推荐使用多个二阶基本节级联组成,这样可以减小高阶滤波器频率响应灵敏度。联组成,这样可以减小高阶滤波器频率响应灵敏度。由于滤波器系数的量化引入误差,因此避免溢出对由于滤波器系数的量化引入误差,因此避免溢出对IIR滤波器非常重要。滤波器非常重要。u可以通过把中间结果保存在处理器累加器来避免节可以通过把中间结果保存在处理器累加器来避免节间数据溢出。为防止在第间数据溢出。为防止在第k阶内部发生数据溢出,阶内部发生数据溢出,需要用增益系数对滤波器的单位脉冲响应(前馈通需要用增益系数对滤波器的单位脉冲响应(前馈通道)定标。道)定标。u动态标定方法。在每个阶段
11、滤波器内部状态都被减动态标定方法。在每个阶段滤波器内部状态都被减半,以提高指令周期换取为代价提高了结果的精度。半,以提高指令周期换取为代价提高了结果的精度。knGabs(f(n)2 1/2knG(abs(f(n)l FFT的定标方法的定标方法u在FFT操作里,每次蝶形运算后数据平均增加一位。输入定标需要移位 (FFT长度为N),这会导致在计算FFT之前就衰减 6 dB。u在固定定标中,每级蝶形运算输出除以2,这是最常用的FFT定标方法,因为它简单而且有比较好的信噪比。但是,对于大的FFT,这种定标可能会使信息丢失。u另一种方法是动态定标,即在输出溢出时再除以2。在这种情况下,会在这个过程中指定
12、一个变量,每定标一次变量的值加1,计算结束后根据变量的值把结果乘以一个系数。动态定标的信噪比最好,但会增加FFT循环次数。N2logN2log7.2 基础算术运算基础算术运算n加减运算加减运算n乘法运算乘法运算n除法运算除法运算n小数乘法小数乘法7.2.1 加减运算加减运算l在数字信号处理中,加减运算是常见的算术运算。在数字信号处理中,加减运算是常见的算术运算。一般使用一般使用16位或位或32位加减运算,数值分析、浮点位加减运算,数值分析、浮点运算和其它操作可能需要运算和其它操作可能需要32位以上的运算。位以上的运算。lC55x有直接完成有直接完成16位或位或32位加减运算的指令,位加减运算的
13、指令,但没有能直接完成多字加减运算的指令。要进行但没有能直接完成多字加减运算的指令。要进行多字加减运算,需要通过编程方法实现。多字加减运算,需要通过编程方法实现。l 以下指令可在单周期内完成以下指令可在单周期内完成32位加法运算:位加法运算:MOV40 dbl(Lmem),ACxADD dbl(Lmem),ACxl 64位的高位的高32位加法要考虑低位加法要考虑低32位加法产生的进位,位加法产生的进位,使用以下指令:使用以下指令:ADD uns(Smem),CARRY,ACxl 以下指令可在单周期内完成以下指令可在单周期内完成32位减法运算:位减法运算:MOV40 dbl(Lmem),ACxS
14、UB dbl(Lmem),ACxl 64位的高位的高32位减法要考虑低位减法要考虑低32位减法产生的借位,位减法产生的借位,使用以下指令:使用以下指令:SUB uns(Smem),BORROW,ACx 例例7-1,64位加法运算。文件名为:位加法运算。文件名为:add64.asm。.mmregs.model call=c55_std.model mem=large;*;64位加法 指针分配;X3 X2 X1 X0 AR1 -X3(偶地址);+Y3 Y2 Y1 Y0 X2;-X1;W3 W2 W1 W0 X0;AR2 -Y3(偶地址);Y2;Y1;Y0;AR3 -W3(偶地址);W2;W1;W0
15、;*.sect.text.align 4.globalstart.symstart,start,36,2,0start:MOV#0100h,AR1 MOV#0104h,AR2 MOV#0108h,AR3L1:MOV40 dbl(*AR1(#2),AC0 ;AC0=X1 X0 ADD dbl(*AR2(#2),AC0 ;AC0=X1 X0+Y1 Y0 MOV AC0,dbl(*AR3(#2);保存W1 W0.MOV40 dbl(*AR1),AC0 ;AC0=X3 X2 ADD uns(*AR2(#1),CARRY,AC0;AC0=X3 X2+00 Y2+CARRY ADD*AR2 X3(偶地址)
16、;Y3 Y2 Y1 Y0 X2;-X1;W3 W2 W1 W0 X0;AR2-Y3(偶地址);Y2;Y1;Y0;AR3-W3(偶地址);W2;W1;W0;*.sect.text.align 4.globalstart.symstart,start,36,2,0start:MOV#0100h,AR1 MOV#0104h,AR2 MOV#0108h,AR3L1:MOV40 dbl(*AR1(#2),AC0 ;AC0=X1X0 SUB dbl(*AR2(#2),AC0 ;AC0=X1X0-Y1Y0 MOV AC0,dbl(*AR3(#2);保存W1W0.MOV40 dbl(*AR1),AC0 ;AC0=X3X2 SUB uns(*AR2(#1),BORROW,AC0;AC0=X3X2-00Y2-BORROW SUB*AR2 X1;Y1 Y0 32位操作数 X0;W3 W2 W1 W0 64位结果 AR1-Y1;Y0;入口条件:AR2-W0;SXMD=1 (允许符号扩展)W1;SATD=0 (不做饱和处理)W2;FRCT=0 (关小数模式)W3;限制条件:延迟链和输入序列必须指定为长字类型。;