awk的学习笔记
awk(文本三剑客-行处理器+字段分割) 数据流的行处理工具。数据来自stdin或最后一个参数指定文… Continue Reading awk的学习笔记
感悟技术人生
awk(文本三剑客-行处理器+字段分割) 数据流的行处理工具。数据来自stdin或最后一个参数指定文… Continue Reading awk的学习笔记
IIR递归方程:

固定四阶IIR的C代码实现:
typedef struct
{
float SOSCoeffs[2*5]; //b0 b1 b2 a1 a2
float Gain[2]; //每个抽头的增益
float Dealy[2*2]; //延迟缓冲state z1 z2
}IIR_context_Td;
void biquad_filter_calc(IIR_context_Td *pCtx,int16_t *InData,int16_t *OutData,uint16_t InNum)
{
float *pGain = pCtx->Gain;
float Out,In;
//load param:
float zdelay11,zdelay12;
float b10,b11,b12,a11,a12;
zdelay11=pCtx->Dealy[0];
zdelay12=pCtx->Dealy[1];
b10=pCtx->SOSCoeffs[0];
b11=pCtx->SOSCoeffs[1];
b12=pCtx->SOSCoeffs[2];
a11=pCtx->SOSCoeffs[3];
a12=pCtx->SOSCoeffs[4];
float zdelay21,zdelay22;
float b20,b21,b22,a21,a22;
zdelay21=pCtx->Dealy[2];
zdelay22=pCtx->Dealy[3];
b20=pCtx->SOSCoeffs[5];
b21=pCtx->SOSCoeffs[6];
b22=pCtx->SOSCoeffs[7];
a21=pCtx->SOSCoeffs[8];
a22=pCtx->SOSCoeffs[9];
//calc:
while(InNum--)
{
In=(float)*InData++;
Out=In*b10+zdelay11;
zdelay11=In*b11+zdelay12+Out*a11;
zdelay12=In*b12+Out*a12;
Out= Out*pGain[0];
In=Out;
Out=In*b20+zdelay21;
zdelay21=In*b21+zdelay22+Out*a21;
zdelay22=In*b22+Out*a22;
Out= Out*pGain[1];
*OutData++ = (int16_t)Out;
}
//save param:
pCtx->Dealy[0]=zdelay11;
pCtx->Dealy[1]=zdelay12;
pCtx->Dealy[2]=zdelay21;
pCtx->Dealy[3]=zdelay22;
}
本文为原创文章,转载请注明出处!