您的位置:首页 > 其它

准备学习和研究FIR和IIR 算法优化方法

2008-04-22 21:02 423 查看
最近在做各种各样的speech codec 算法学习和相关代码优化工作,通过做profile分析,发现主要的计算量除了一些基本数据运算操作外,FIR和IIR 滤波运算耗时最多。

就拿AMR_NB codec 中的语音合成滤波运算就相当耗时。下面就是一小段程序分析一下运算量:

static Word32 Syn_filt( Word32 a[], Word32 x[], Word32 y[], Word32 lg, Word32 mem[]

, Word32 update )

{/*合成滤波器重构语音*/

Word32 tmp[50]; /* malloc is slow */

Word32 s, a0, overflow = 0;

Word32 *yy, *yy_limit;

/* Copy mem[] to yy[] */

memcpy( tmp, mem, 40 );

yy = tmp + M;

yy_limit = yy + lg;

a0 = a[0];

/* Do the filtering. */

while ( yy < yy_limit )

{

s = *x++ * a0;

s -= yy[-1] * a[1];

s -= yy[-2] * a[2];

s -= yy[-3] * a[3];

s -= yy[-4] * a[4];

s -= yy[-5] * a[5];

s -= yy[-6] * a[6];

s -= yy[-7] * a[7];

s -= yy[-8] * a[8];

s -= yy[-9] * a[9];

s -= yy[-10] * a[10];

if ( labs( s ) < 0x7ffffff )

*yy = ( s + 0x800L ) >> 12;

else if ( s > 0 )

{

*yy = 32767;

overflow = 1;

}

else

{

*yy = -32768;

overflow = 1;

}

yy++;

}

memcpy( y, &tmp[M], lg <<2 );

/* Update of memory if update==1 */

if ( update )

{

memcpy( mem, &y[lg - M], 40 );

}

return overflow;

}

AMR one frame divide into four subframe, each subframe have 40 samples,也就是lg=40. 上面的程序已做了一些简化(为了防止数据饱和溢出,上面的运算应该要做防饱和操作), 但简化后,运算量还是很多的。

一帧的乘法运算量:4*40*11= 1760次,如这样乘法都做饱和保护操作L_mul,那运算量更大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐