第7讲 TMS320C55x 算法编程_第1页
第7讲 TMS320C55x 算法编程_第2页
第7讲 TMS320C55x 算法编程_第3页
第7讲 TMS320C55x 算法编程_第4页
第7讲 TMS320C55x 算法编程_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

定标与溢出处理FIR滤波器IIR滤波器快速傅里叶变换(FFT),第7讲DSP算法编程,7.1定标与溢出处理,数的定标溢出的处理方法常用信号处理算法中的定标方法,7.1.1数的定标,小数定标的概念设定一个16位数的小数点处于该数中的哪一位可以表示不同大小和不同精度的小数Q表示法表7-1列出了一个16位数的16种Q表示及它们所能表示的十进制数值范围,表7-1Q表示及数值范围,不同的Q所表示的数不仅范围不同,而且精度也不相同Q越大,数值范围越小,但精度越高Q越小,数值范围越大,但精度就越低例如,Q0的数值范围是-32768到+32767,其精度为1;Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051,对定点数而言,数值范围与精度是一对矛盾。一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。在实际的定点算法中,应该根据具体问题进行折衷处理,以达到最佳效果。,在C55x中,16位整数采用补码形式表示。每个采用Qi定标的16位数用1个符号位、i个小数位和15-i个整数位来表示。,表7-2同样的数在不同定标方式下所表示的具体数值,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。,7.1.2溢出的处理方法,如果算术运算结果超出寄存器所能表示的最大数就会出现溢出因为16位定点DSP的动态范围有限,所以在使用时必须注意动态范围以防溢出溢出还与输入信号的特性和运算法则有关,1.溢出,C55x有以下几种硬件特性可以处理溢出:保护位C55x的每个累加器都有8个保护位(3932位),允许连续256次乘加操作而累加器不溢出溢出标志位C55x的每个累加器都有相关的溢出标志位,当累加器操作结果出现溢出时,这个标志位就会置位,2.C55x的溢出处理机制,饱和方式位SATD和SATASATD控制D单元的操作,SATA控制A单元的操作。如果SATD=1,当D单元发生溢出时,对D单元的结果进行饱和处理。不管饱和方式位的值是什么,当累加器发生溢出时,相应的溢出标志位都会被置位A单元没有溢出标志位,但如果SATA=1,发生溢出时,结果也会进行饱和处理,饱和处理是用最近的边界值代替溢出结果。例如,16位寄存器的范围是8000h(最小负数)7FFFh(最大正数),饱和处理就是用7FFFh代替比7FFFh大的结果;用8000h代替比8000h小的结果。,饱和。饱和是一种处理溢出的方法,但是饱和会剪掉部分输出信号,可能会引起信号失真和引起系统非线性。输入定标。分析所要使用的系统,假定最坏的情况,然后对输入信号定标,以防止溢出。但是这种方法会极大地降低输出信号的精确度。固定定标。假定最坏的情况,对中间结果定标。这种方法可以防止溢出,同时增加了系统的信噪比。动态定标。可以监测中间结果的范围,只在需要的时候对中间结果定标。这种方法可以防止溢出但会增加计算量。,3.溢出的处理方法,7.1.3常用信号处理算法中的定标方法,FIR滤波器的定标方法在FIR滤波器中处理溢出的最好方法是设计时使滤波器的增益小于1,这样就不需要对输入信号定标。这种方法和累加器的保护位结合起来,可以有效地防止溢出。由于对信号处理的负面影响,在FIR滤波器中不使用固定定标和输入定标。如果不考虑计算量,在FIR滤波器中可以使用动态定标。对一些类型的音频信号,饱和处理也是一种常用的方法。,IIR滤波器的定标方法IIR滤波器的定点实现推荐使用多个二阶基本节级联组成,这样可以减小高阶滤波器频率响应灵敏度。由于滤波器系数的量化引入误差,因此避免溢出对IIR滤波器非常重要。可以通过把中间结果保存在处理器累加器来避免节间数据溢出。为防止在第k阶内部发生数据溢出,需要用增益系数对滤波器的单位脉冲响应(前馈通道)定标。动态标定方法。在每个阶段滤波器内部状态都被减半,以提高指令周期换取为代价提高了结果的精度。,FFT的定标方法,在FFT操作里,每次蝶形运算后数据平均增加一位。输入定标需要移位(FFT长度为N),这会导致在计算FFT之前就衰减6dB。在固定定标中,每级蝶形运算输出除以2,这是最常用的FFT定标方法,因为它简单而且有比较好的信噪比。但是,对于大的FFT,这种定标可能会使信息丢失。另一种方法是动态定标,即在输出溢出时再除以2。在这种情况下,会在这个过程中指定一个变量,每定标一次变量的值加1,计算结束后根据变量的值把结果乘以一个系数。动态定标的信噪比最好,但会增加FFT循环次数。,7.3FIR滤波器,数字滤波器是DSP的基本应用,有2种基本类型:有限冲激响应滤波器FIR无限冲激滤波器IIR一般来说,如果需要线性相位则选择用FIR滤波器,对于相位要求不敏感的场合可以选用IIR滤波器。本节主要讨论FIR滤波器的DSP实现方法,有关IIR滤波器的实现将在下一节中介绍。,7.3.1FIR滤波器的基本结构,一个FIR滤波器的输出序列和输入序列之间的关系,满足差分方程:传递函数为,FIR滤波器的结构:FIR滤波器的单位冲激响应是一个有限长序列。若为实数,且满足偶对称或奇对称的条件,则FIR滤波器具有线性相位特性。偶对称线性相位FIR滤波器的差分方程为:,7.3.2FIR滤波器的C语言编程实现,例7-9,直接型FIR滤波器的C语言编程实现。,/*fir.c该程序用于实现FIR滤波器*L滤波器的阶数*bi滤波器的系数,i=0,1,L-1*xi输入信号向量,i=0,1,L-1;x0对应于当前值,x1对应于上一采样值*x_in输入信号的当前值*y_out输出信号的当前值*/,floatfir(floatx_in,float*x,float*b,intL)floaty_out;inti;/*-*/*把上一个采样时间的输入信号向量延迟一个单元,得到当前采样时间的输入信号向量*/for(i=L-1;i0;i-)xi=xi-1;x0=x_in;/*-*/*完成FIR滤波*/y_out=0.0;for(i=0;iL;i+)y_out=y_out+bi*xi;returny_out;,直接型FIR滤波器的实现涉及到两个基本操作,一个是输入信号向量与滤波器系数向量的内积计算,另一个是输入信号向量的更新处理。在每个采样周期信号缓冲器都要更新一次,最老的采样被抛弃,而其他的信号则向缓冲器的右方移动一个单元,一个新的采样被插入存储单元,并被标记。如果这个操作过程不用DSP硬件完成,那么它需要很多的时间。,7.3.3FIR滤波器的汇编语言编程实现,处理信号缓冲器的最有效方法,是把信号采样加载到循环缓冲器中。在循环缓冲器中,采取数据保持固定、反时针方向移动地址的方式,代替保持缓冲器地址固定且正方向移动数据。信号采样的起点由指针x(n)指定,其它诸采样则沿着顺时针方向,从起点开始依次顺序加载。,图7-4FIR滤波器的循环缓冲区,(a)信号循环缓冲区(b)系数循环缓冲区,例7-10,FIR滤波器的C55x汇编语言实现。,(1)主程序fir_test.c/*fir_test.c*/#includemath.h#defineL64/*NumberofFIRfiltercoefficients*/#defineFs8000/*8000Hzsamplingfrequency*/#defineT1/Fs#definef1800/*800Hzfrequency*/#definef21800/*1800Hzfrequency*/#definef33300/*3300Hzfrequency*/#definePI3.1415926#definew1(2*PI*f1*T)/*2*pi*f1/Fs*/#definew2(2*PI*f2*T)/*2*pi*f2/Fs*/#definew3(2*PI*f3*T)/*2*pi*f3/Fs*/#definea10.333/*Magnitudeforwave1*/#definea20.333/*Magnitudeforwave2*/#definea30.333/*Magnitudeforwave3*/,externintfir(int*,int*,unsignedint,int);/*Low-passFIRfiltercoefficients*/intcoeffL=-26,-13,14,36,31,-8,-58,-71,-15,83,139,76,-90,-231,-194,50,331,383,78,-405,-654,-347,403,1024,863,-228,-1577,-1972,-453,2910,6836,9470,9470,6836,2910,-453,-1972,-1577,-228,863,1024,403,-347,-654,-405,78,383,331,50,-194,-231,-90,76,139,83,-15,-71,-58,-8,31,36,14,-13,-26;intinL;/*inputbuffer*/intoutL;/*Outputbuffer*/,main()unsignedinti;floatsignal;unsignedintn=0;intindex=0;for(i=0;iL;i+)ini=0;outi=0;while(1)signal=a1*cos(float)w1*n);signal+=a2*cos(float)w2*n);signal+=a3*cos(float)w3*n);n+;inindex=(int)(0 x7fff*signal)+0.5);outindex=fir(in,coeff,L,index);index-;if(index=-1)index=L-1;,(2)汇编语言整数fir滤波器函数:fir.asm,;fir.asm该程序用于实现FIR滤波器,可被C语言程序调用;intfir(int*,int*,unsignedint,int);参数0:AR0输入信号缓冲区指针;参数1:AR1-FIR滤波器系数向量指针;参数2:T0-FIR滤波器的阶数L;参数3:T1-输入信号当前值在循环缓冲区的序数;返回值:T0-输出信号当前值.def_fir_firpshmST1_55;现场ST1,ST2和ST3入栈pshmST2_55pshmST3_55or#0 x340,mmap(ST1_55);设置FRCT,SXMD,SATDbsetSMUL;置位SMUL,movmmap(AR0),BSA01;AR0=输入信号循环缓冲区的起始地址movmmap(AR1),BSA23;AR1=滤波器系数循环缓冲区的起始地址movmmap(T0),BK03;设置循环缓冲区大小or#0 x5,mmap(ST2_55);AR0和AR2为循环缓冲区指针movT1,AR0;AR0从index偏移量开始mov#0,AR2;AR2从0偏移量开始sub#2,T0;T0=L-2movT0,CSR;设置外部循环次数为L-1mpym*AR0+,*AR2+,AC0;执行第一次运算|rptCSR;启动循环macm*AR0+,*AR2+,AC0movhi(AC0),T0;用Q15格式存放结果popmST3_55;恢复ST1,ST2和ST3popmST2_55popmST1_55ret.end,7.4IIR滤波器,IIR滤波器的优点:结构简单,运算量小,可以用较少的阶数获得很高的选择性。IIR滤波器的缺点:具有相位特性差,存在稳定性问题。高阶IIR滤波器经常以串联或并联二阶环节的形式予以实现。,7.4.1二阶IIR滤波器的结构,二阶IIR滤波器,又称为二阶基本节,分为直接型、标准型和变换型。二阶IIR滤波器传递函数为:,图7-5二阶IIR滤波器的直接型的实现,图7-6的信号流图,图7-7二阶IIR滤波器的直接型的实现,由于直接型对于给定的传递函数具有最小可能的延迟数、加法器数和乘法器数,所以被称为标准型。,7.4.2高阶IIR滤波器的结构,高阶IIR滤波器的差分方程和系统函数分别为:,图7-8高阶IIR滤波器的直接型实现(L=M+1),图7-9高阶IIR滤波器的串联型结构,图7-10第k个二阶节,对于,有,其中,,注意:,7.4.3IIR滤波器的C语言实现,例7-11,采用二维数组编写的IIR滤波器C语言程序。,temp=xin;/*xin为IIR滤波器的输入*/for(k=0;k1;/*子FFT中的蝶形运算数目*/WL-1.re=cos(PI/LE1);WL-1.im=-sin(PI/LE1);/*-*/generator(xin,N);,for(;)for(i=0;iN;i+)/*构造输入信号样本*/Xi.re=xini;Xi.im=0;/*复制到参考缓冲器*/re1i=Xi.re;im1i=Xi.im;/*启动FFT*/bit_rev(X,M);/*以倒位次序排列X*/fft(X,M,W,1);/*执行FFT*/*计算功率谱,验证FFT结果*/for(i=0;i1;U.re=1.0;U.im=0.;,for(j=0;j=1;j+=k;if(ij)temp=Xj;Xj=Xi;Xi=temp;,(4)信号发生器函数:generator.c/*generator.c-该程序用于产生一组信号样本*/#includemath.h#definePI=3.14159

温馨提示

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

评论

0/150

提交评论