分析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) 编辑 收藏