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了。

【opus源码分析】celt_fir5函数_fir