就拿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,那运算量更大。