|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
请大侠帮我把下面的C程序用DM642翻译一下 |
作者:zx_jianke 栏目:DSP技术 |
2楼: | >>参与讨论 |
作者: zx_jianke 于 2006/9/24 21:58:00 发布:
程序如下 -- c转化成线性汇编有问题 语言: void FiltLpf( Word16 *Tv, Word16 *Buff, Word16 ScGn,Word16 Indx,Word16 Gain, Word16 Sfc ) { int i ; Word32 Acc0 ; //----6.7_1-------// for ( i = 0 ; i < SubFrLen ; i ++ ) { Acc0 = L_mult( Buff[PitchMax+(int)Sfc*SubFrLen+i], ScGn ) ; Acc0 = L_mac( Acc0, Buff[PitchMax+(int)Sfc*SubFrLen+(int)Indx+i], Gain ) ; Tv[(int)Sfc*SubFrLen+i] = round( Acc0 ) ; } 内联后的c /* for ( i = 0 ; i < SubFrLen ; i ++ ) { Acc0 = L_mult( Buff[PitchMax+(int)Sfc*SubFrLen+i], Pf.ScGn ) ; Acc0 = L_mac( Acc0, Buff[PitchMax+(int)Sfc*SubFrLen+(int)Pf.Indx+i], Pf.Gain ) ; Tv[(int)Sfc*SubFrLen+i] = round( Acc0 ) ; } for ( i = 0 ; i < SubFrLen ; i +=4 ) { Acc0 = _smpy( Buff[PitchMax+(int)Sfc*SubFrLen+i], Pf.ScGn ) ; Acc0 = _sadd(Acc0, _smpy(Buff[PitchMax+(int)Sfc*SubFrLen+(int)Pf.Indx+i], Pf.Gain)) ; Tv[(int)Sfc*SubFrLen+i] = _sadd( Acc0 ,0x8000L)>>16; Acc0 = _smpy( Buff[PitchMax+(int)Sfc*SubFrLen+i+1], Pf.ScGn ) ; Acc0 = _sadd(Acc0, _smpy(Buff[PitchMax+(int)Sfc*SubFrLen+(int)Pf.Indx+i+1], Pf.Gain)) ; Tv[(int)Sfc*SubFrLen+i+1] = _sadd( Acc0 ,0x8000L)>>16; Acc0 = _smpy( Buff[PitchMax+(int)Sfc*SubFrLen+i+2], Pf.ScGn ) ; Acc0 = _sadd(Acc0, _smpy(Buff[PitchMax+(int)Sfc*SubFrLen+(int)Pf.Indx+i+2], Pf.Gain)) ; Tv[(int)Sfc*SubFrLen+i+2] = _sadd( Acc0 ,0x8000L)>>16; Acc0 = _smpy( Buff[PitchMax+(int)Sfc*SubFrLen+i+3], Pf.ScGn ) ; Acc0 = _sadd(Acc0, _smpy(Buff[PitchMax+(int)Sfc*SubFrLen+(int)Pf.Indx+i+3], Pf.Gain)) ; Tv[(int)Sfc*SubFrLen+i+3] = _sadd( Acc0 ,0x8000L)>>16; }*/ return; } 线性汇编: .GLOBAL _FiltLpf _FiltLpf: .cproc Tv,Buff,PfScGn,PfIndex,PfGain,Sfc .reg cntr,con1,con2,con3,sfc1,add1,add2,buff1,buff2,t1:t2,t3:t4,a0,a1,a2,a3,b0,b1,b2,b3 ;zero cntr ;zero con1 ;zero con2 mvk 15,cntr mvk 145,con1 mvk 60, con2 zero con3 mvkl 0x8000,con3 mpy Sfc,con2,sfc1 ;sfc*60 add con1,sfc1,add1 ;145+sfc*60 add add1,PfIndex,add2 ;145+sfc*60+PfIndex add Buff,add1,buff1 add Buff,add2,buff2 ;lddw *buff2++,t3:t4 ;读取64位的数据 loop: .trip 15 lddw *buff1++,t1:t2 ;读取64位的数据(t2为低位) lddw *buff2++,t3:t4 ;读取64位的数据 smpyhl t2,PfScGn,a1 smpyhl t1,PfScGn,a3 smpy t2,PfScGn,a0 smpy t1,PfScGn,a2 smpyhl t4,PfGain,b1 smpyhl t3,PfGain,b3 smpy t4,PfGain,b0 smpy t3,PfGain,b2 sadd a1,b1,a1 sadd a3,b3,a3 sadd a0,b0,a0 sadd a2,b2,a2 sadd a1,con3,a1 sadd a0,con3,a0 sadd a2,con3,a2 sadd a3,con3,a3 ;shr a1,16,a1 ;shr a0,16,a0 ;shr a2,16,a2 ;shr a3,16,a3 ;packh2 a1,a0,a0 ;packh2 a3,a2,a1 packh2 a1,a0,a0 packh2 a3,a2,a1 stdw a1:a0,*sfc1++ [cntr] sub cntr,1,cntr [cntr] B loop .endproc |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |