ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:107.99KB ,
资源ID:8035991      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-8035991.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DSP常见算法的实现Word文档下载推荐.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

DSP常见算法的实现Word文档下载推荐.docx

1、,逐一迭代就能够获得采样间隔为T的正弦序列了。从迭代公式可以更清楚地看出,这种方法存在误差累积。再来看级数逼近法,首先需要寻找一个合适的自变量取值区间和寻找相应的系数。从正弦函数的对称性可知,只需要计算取值在内的函数就可以推断出所有取值范围内的函数。接下来寻找系数,对于可以作如下变换,那么y的取值范围在内,而sin_new( )与sin( )同构,所以在下面的分析中将sin_new( )替代sin( ),提到的正弦函数即指sin_new( )。若汇编编程时采用的数据为Q15格式,那么取值与实际的弧度的对应关系如下图所示。图3- 算法取值与弧度的对应关系在内,正弦函数的修正级数(五次)展开如下式

2、:根据上式,可以写出正弦函数的生成程序。 ;compute polynomial stlm A, T ;T=x stm #SinePolyCoeff, AR2 ld *AR2+, 16, A ;AH=c5 ld *AR2+, 16, B ;BH=c4 poly *AR2+ ;A=c5*x+c4A=c5*x2+c4*x+c3A=c5*x3+c4*x2+c3*x+c2A=c5*x4+c4*x3+c3*x2+c2*x+c1 mpya A sfta A, 3 ;adjust AH to Q15SinePolyCoeff: ;in Q12 format .word 0x1cce ; 1.800293 (

3、coef for x5 = c5) .word 0x08b7 ; 0.5446778 (coef for x4 = c4) .word 0xaacc ; -5.325196 (coef for x3 = c3) .word 0x0053 ; 0.02026367 (coef for x2 = c2) .word 0x3240 ; 3.140625 (coef for x1 = c1)在编程过程中,使用到了POLY语句,它能够使多项式的计算简洁快速地完成。该函数的结果可以通过实验X来验证。2. FIR滤波器的实现FIR滤波器由于具有线性相位而且延迟能够确定,因而在信号处理中广泛应用。FIR的基本

4、模型如下图所示。图3- FIR模型其数学表达式为,根据该表达式可以给出一种最为直接的实现形式。直接形式中采用线性地址来存放数据,如图3- 所示。图3- 直接形式程序中可以采用MACD来实现程序如下:ld *(Input), Astl A, *(x_n)stm #x_n_Nm1, AR2mpy *AR2-, #h_Nm1, Brpt #N-2macd *AR2-, h_Nm2, B程序首先将新的数据放置在xn处,然后对状态缓存由下而上计算,在循环语句中每执行一次状态变量自动向下移动一级,即自动更新。它的计算量基本为N个时钟周期。当然,数据存放还可以采用循环缓存。另外,由于FIR的系数存在对称性,

5、其结构如图3- 所示。那么可以利用这个特点,实现更为快速的计算。图3- 对称结构的FIR为计算方便将状态变量分别存放在两个缓存区间内,一块命名为Buffer_new,存放图3- 上半部分的数据,另一块命名为Buffer_old,存放图3- 下半部分的数据。它们都当循环缓存使用,大小为FIR阶数的一半,即N/2(常数SIZE)。根据上述原理编写的汇编程序如下: stm #Buffer_new, AR2 stm #Buffer_old, AR3 stm #SIZE, BK stm # -1, AR0fir_loop:read input ld *(Input), A stl A, *AR2filt

6、ering add *AR2+0%, *AR3+0%, A rptz B, #SIZE-1 firs *AR2+0%, *AR3+0%, FIR_Coeff sth B, *(Output) ;store output mar *+AR2(2)% mar *AR3+% mvdd *AR2, *AR3+0% ;update buffer b fir_loop为方便理解,在图3- 中,将状态变量更新的过程标明,左边的是Buffer_new,右边的是Buffer_old。开始时,指针AR2和AR3分别指向Buffer_new和Buffer_old中的x0与x-19,将最“新”的数据存进Buffer_

7、new(步骤1)。利用FIRS实现FIR,结果放在BH中。计算结束后,AR2和AR3分别指向x-1和x-18(步骤2)。然后调整AR2,让它指向Buffer_new中最“老”的数据x-9 (步骤3);调整AR3,让它指向Buffer_old中最“老”的数据x-19(步骤4)。接下来进行数据更新,将Buffer_new中最“老”的数据放进Buffer_old中,成为最“新”的数据。最后AR2指向x-9的位置,这个位置将在下次计算时放置新的输入;AR3指向x-18,即Buffer_old中最“老”的数据,便于下次计算(步骤5)。图3- 对称结构的FIR实现中状态变量的更新利用对称结构的实现在计算量

8、上有了减少,大约为N/2个时钟周期。当然,利用上述结构必须注意安排好数据的位置,以保证能进行正常的循环寻址。3. IIR滤波器的实现IIR滤波器也是数字信号处理的主要工具之一,但由于它不具备线性相位,而且无法准确知道其延迟,所以使用较FIR少。下面,来观察一下IIR的结构,其数学表达式如下:从其数学公式可以看出,我们可以仿照在FIR处理来直接实现。定义两段缓存分别对应于x 和y ,然后采用类似于FIR的计算方式,采用MACD语句,便能很快地完成IIR滤波。在直接实现中同时需要保存x 和y ,当其阶数较大时,会占用比较大的数据空间。为此,我们来考察IIR的另一种结构。如图3- ,在这种结构中存储

9、的状态变量为d ,所以存储空间大大地减少了。图3- IIR的另一种结构通过对FIR和IIR算法的分析,一方面向读者介绍这些基本处理中的设计技巧,另一方面也提醒读者在算法实现过程中应充分考察算法本身的特点,以求利用它们获得高效的运算和存储空间的节省。4. FFT的实现在信号处理中,为突出信号的特征,经常在时域和频域之间作变换,而傅立叶变换是这当中最为典型的。基2的快速傅立叶变换有比特翻转排序和蝶形运算组成,前者在3.x节已经作了介绍,这里着重介绍蝶形运算的实现。蝶形运算是快速傅立叶变换中设计得极为精巧的部分,它充分揭示了傅立叶变换系数间内在的关系,而且还能实现同址计算,如图所示。完成一次蝶形运算

10、需要一次复数的乘法和两次复数的加法。图3- 蝶形运算的示意图对于时间抽取的FFT而言,在其第一级是乘法的系数为(也就是1),那么这个复数的乘法就名存实亡了,因而在计算FFT时,第一级可以直接用复数的加法实现。第一级的程序如下:* stage 1 * stm #0, BK ld #-1, ASM stm #FFT_Data, PX stm #FFT_Data+K_DATA_IDX_1, QX ld *PX, 16, A ;AH=PX.x stm #K_FFT_SIZE/2-1, BRC rptbd stage1end-1 stm #K_DATA_IDX_1+1, AR0 sub *QX, 16,

11、 A, B ;BH=PX.x-QX.x add *QX, 16, A ;AH=PX.x+QX.x sth A, ASM, *PX+ st B, *QX+| ld *PX, A ;AH=PX.yBH=PX.y-QX.yAH=PX.y+QX.y sth A, ASM, *PX+0 st B, *QX+0%| ld *PX, Astage1end:在代码中,为方便与图3- 对应,使用.asg伪指令将寄存器的名字替换成示意图中的表达方式,PX和QX分别指向蝶形运算的数据的地址。可见所有的操作完全是由加减实现的。在第二级中乘法的系数为和(即+1和-j),那么乘法操作只是影响参数的符号,在复数的加减运算时

12、只要弄清与-j相乘造成的结果,所有的操作仍然可以只用加减法来实现。第二级的实现代码如下:* Stage 2 * stm #FFT_Data+K_DATA_IDX_2, QX ld *PX, 16, A ; stm #K_FFT_SIZE/4-1, BRC rptbd stage2end-1 stm #K_DATA_IDX_2+1, AR0 1st butterfly sth B, ASM, *QX+ 2nd butterfly mar *QX+ add *PX, *QX, A ;AH=PX.x+QX.y sub *PX, *QX-, B ;BH=PX.x-QX.y sub *PX, *QX,

13、A ;AH=PX.y-QX.x st B, *QX| ld *QX+, B ;BH=QX.x st A, *PX| add *PX+0%, A ;AH=PX.y+QX.x st A, *QX+0%stage2end:第二级与第一级相同,计算中不包含乘法。从第三级开始,乘法系数的特征就没有第一、第二级那样好了,所以只能直接采用图3- 的方法来计算,代码如下。* Stage 3 through Stage logN * stm #K_TWID_TBL_SIZE, BK st #K_TWID_IDX_3, *(d_twid_idx) stm #K_TWID_IDX_3, AR0 stm #Cos,

14、WR stm #Sin, 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: ld *(d_data_idx), A add *(PX), A stlm A, QX mvdk *(d_grps_cnt), GROUP_COUNTERgroup: mvmd BUTTERFLY_COUNTER, BRC rptbd butterflyend-1 ld *WR,

15、T ; T := WR mpy *QX+, A ; A := QR*WR | QX-QI macr *WI+0%, *QX-, A ;= QR*WR+QI*WI | QX-QR add *PX, 16, A, B ; B := (QR*WR+QI*WI)+PR st B, *PX ; PR:=(QR*WR+QI*WI)+PR)/2| sub *PX+, B ; B=PR-(QR*WR+QI*WI) ; | PX-PI st B, *QX ; QR= (PR-(QR*WR+QI*WI)/2| mpy *QX+, A ;= QR*WI T=WI masr *QX, *WR+0%, A ;= QR*

16、WI-QI*WR= (QR*WI-QI*WR)+PI st B, *QX+ ; QI=(QR*WI-QI*WR)+PI)/2| sub *PX, B ; B=PI-(QR*WI-QI*WR) ld *WR, T ; st B, *PX+ ; PI= (PI-(QR*WI-QI*WR)/2PRbutterflyend:; Update pointers for next group pshm AR0 mvdk *(d_data_idx), AR0 mar *PX+0 mar *QX+0 banzd group, *GROUP_COUNTER- popm AR0 mar *QX- Update c

17、ounters and indices for next stage sub #1, A, B stlm B, BUTTERFLY_COUNTER stl A, 1, *(d_data_idx) ld *(d_grps_cnt), A stl A, ASM, *(d_grps_cnt) ld *(d_twid_idx), A stl A, ASM, *(d_twid_idx) mvdk *(d_twid_idx), AR0 banz stage, *STAGE_COUNTER-fft_end:在FFT的程序编制中可以发现,在很多高级语言编程中忽略的地方,对于汇编编程时却需要仔细分析,对于能够减

18、少计算量的部分应分割出来,并单独编写处理程序,以获得更好的计算性能。通过对上面几种常见算法的分析,可以明白在算法实现应注意一下几个要点:一,数据的精度,对于不同的实现方法能够达到的数据精度是不相同的,必须根据实际要求,综合地考虑结果的数据精度、计算速度和占用存储空间等因素后,才能确定最终的实现方法。二,实现的手段,基于同一个目的可以采用不同的手段实现,它们在存储空间分配和计算量上都存在着差别,应根据算法在计算速度上的要求,选择合适的手段。当使用一些经过精心设计的高效结构时,汇编程序的可读性大大下降了,应注意作好技术文档,详细地解释实现的具体细节,便于维护和改进。三,分别处理,对于一些在高级语言编程中不存在差别的处理过程,在汇编编程时应仔细分析,当发现其中存在某些能够更充分运用DSP硬件结构的环节,可以考虑打破原有的软件结构,把这些过程独立出来,采用高效的方法来处理。当然,在实际编程中,使用到的技巧远远不只这些,还需要编程人员在实践中不断的摸索、尝试和总结。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2