宁静以致远
zgf的blog
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

留言簿(15)

随笔分类

随笔档案

文章档案

友情链接

资料收藏

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-29 文章-8 评论-93 Trackbacks-0
            分析AEC程序时认为运算量重点在滤波和更新滤波器系数部分。这两个部分也最早将浮点运算转换成了定点运算。而判断远端是否讲话部分程序很简单,只有三个浮点乘法,就没有换成定点运算。在花了一番功夫将滤波部分用汇编实现后才发现优化的时间占总比重很小,而时间大部分花在三个浮点乘法上。
            将代码一部分一部分的注释掉后统计时间差异。结果:  (总共43.88秒的语音数据)
                              有三个浮点的代码          全定点的c代码                滤波部分用汇编实现的代码
时间(毫秒)                 8010                                     2220                                   1772
             
            处理器是bf536  400MHz 。也就是说定点c代码只用了20MHz的处理器资源,速度足够了。
            虽然走了弯路,但用汇编实现关键代码也是有益的,仅滤波部分就省了25%的时间。
            bf536有两个乘法器,理论上可以加快速度一倍。实际上由于数据对齐问题只有一半的数据能使用汇编。下面是滤波部分的代码
//c代码
static int filt16_c(short *coe, short * buf, int tap)
{
 int j;
 int tmp = 0;
 for(j=0;j<tap;j++)  
    tmp += buf[j]*coe[j];
 return tmp;
}
//汇编代码
.global _filt16_asm;
.type _filt16_asm,STT_FUNC;
_filt16_asm :
 I0 = R0;
 P1 = R1;
 A1 = A0 = 0;
 R2 >>= 1;
 P0 = R2;
LSETUP(loop1, loop1) LC0 = P0; 
 R1 = [ P1++ ] || R0 = [ I0++ ];
loop1: A0 += R0.L * R1.L , A1 += R0.H * R1.H(IS) || R1 = [ P1++ ] || R0 = [ I0++ ];
 R0 = A0 , R1 = A1;
 R0 = R0 + R1;
 RTS;
.size _filt16_asm, .-_filt16_asm

posted on 2008-04-27 17:39 zgf的blog 阅读(677) 评论(2)  编辑 收藏
Comments
  • # re: 对浮点运算量估计不足走了歪路
    玻璃小屋
    Posted @ 2008-04-27 19:52

    你的这个平台的 C 编译器不会给出优化?有时候编译器的优化很强悍的。。
  • # re: 对浮点运算量估计不足走了歪路
    zgf
    Posted @ 2008-04-28 09:08
    gcc编译,全部是O2。 gcc的优化是很强悍,很多时候用汇编写了半天才发现还没有O2编译的速度快。但很多特殊汇编指令c不使用,并且c编译器只使用bf536中的一个乘法器,另一个浪费掉了。
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]