【opus源码分析】celt_fir5函数

celt_fir5函数是一个内部函数,用于计算FIR的

代码如下

/**
* x 是输入信号
* num 是FIR系数,在opus里这里是autocorrelation系数
* y 是输出信号
* N 是x输入信号的长度
* mem是用于计算的数组,它用于依次储存x[i-1],x[i-2],x[i-3],x[i-4]的值
*/
static void celt_fir5(const opus_val16 *x,
         const opus_val16 *num,
         opus_val16 *y,
         int N,
         opus_val16 *mem)
{
   int i;
   opus_val16 num0, num1, num2, num3, num4;
   opus_val32 mem0, mem1, mem2, mem3, mem4;
   num0=num[0];
   num1=num[1];
   num2=num[2];
   num3=num[3];
   num4=num[4];
   mem0=mem[0];
   mem1=mem[1];
   mem2=mem[2];
   mem3=mem[3];
   mem4=mem[4];
   for (i=0;i<N;i++)
   {
      opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
      sum = MAC16_16(sum,num0,mem0);
      sum = MAC16_16(sum,num1,mem1);
      sum = MAC16_16(sum,num2,mem2);
      sum = MAC16_16(sum,num3,mem3);
      sum = MAC16_16(sum,num4,mem4);
      mem4 = mem3;
      mem3 = mem2;
      mem2 = mem1;
      mem1 = mem0;
      mem0 = x[i];
      y[i] = ROUND16(sum, SIG_SHIFT);
   }
   mem[0]=mem0;
   mem[1]=mem1;
   mem[2]=mem2;
   mem[3]=mem3;
   mem[4]=mem4;
}

这个算法看不懂的可以自己用笔在纸上画一下,这样会清晰一点。
实际上就是在按照FIR的公式在做运算。 源码中的num就是b系数;mem就是x[n-1]到x[n-N],只不过这里的N是5所以函数名称就叫fir5了。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值