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

本文分析了AMR_NBcodec中的语音合成滤波运算,并对其进行了程序级的详细解析。每帧分为四个子帧,每个子帧包含40个样本。滤波过程涉及大量乘法运算,每帧约1760次,存在数据饱和溢出风险。
最近在做各种各样的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,那运算量更大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值