准备学习和研究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,那运算量更大。
就拿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,那运算量更大。
相关文章推荐
- 【深度干货】2017年深度学习优化算法研究亮点最新综述(附slide下载)
- 【深度干货】2017年深度学习优化算法研究亮点最新综述(附slide下载)
- 【深度干货】2017年深度学习优化算法研究亮点最新综述(附slide下载)
- 从修正Adam到理解泛化:概览2017年深度学习优化算法的最新研究进展
- 重磅 | 2017年深度学习优化算法研究亮点最新综述火热出炉
- 从修正Adam到理解泛化:概览2017年深度学习优化算法的最新研究进展
- 2017年深度学习--梯度下降 优化算法研究
- 【深度干货】2017年深度学习优化算法研究亮点最新综述(附slide下载)
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
- 每天学习一算法系列(19)(输入n,用最快的方法求该数列的第n 项)
- caffe学习 - solver的优化方法
- 优化的对比度增强算法用于有雾图像的清晰化处理(算法效果是我目前看到最为稳定的,且对天空具有天然的免疫力,极力推荐有需要的朋友研究)。
- CAFFE源码学习之优化方法solver
- 图像算法在DSP嵌入式移植中常用的优化方法
- 一文概览深度学习中的五大正则化方法和七大优化策略
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
- 吴恩达神经网络和深度学习课程自学笔记(六)之优化算法
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
- 深入学习SQL Server聚合函数算法优化技巧