作者jeffchen106 (超哥)
看板MATLAB
标题[讨论] fdatool设计IIR滤波器
时间Tue Mar 12 14:37:40 2013
各位板友大家好:
我最近想设计一个cut-off frequency为0.5的Low pass filter,我使用了fdatool
IIR butterworth,设计出的滤波器为 Order=13, sections=7的 Direct-FormII
Second-Order Sections的滤波器。而产生出的C header file如下:
#define MWSPT_NSEC 15
const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1,3,1,3,1,2,1 };
const float NUM[MWSPT_NSEC][3] = { //分子的系数
{
0.001711965189, 0, 0 //Gain
},
{
1, 2, 1 //Numerator
},
{
0.001679621288, 0, 0 //Gain
},
{
1, 2, 1 //Numerator
},
{
0.001651172643, 0, 0
},
{
1, 2, 1
},
{
0.001627864782, 0, 0
},
{
1, 2, 1
},
{
0.001610610518, 0, 0
},
{
1, 2, 1
},
{
0.001600023941, 0, 0
},
{
1, 2, 1
},
{
0.03995568678, 0, 0
},
{
1, 1, 0
},
{
1, 0, 0
}
};
const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1,3,1,3,1,2,1 };
const float DEN[MWSPT_NSEC][3] = { //分母
{
1, 0, 0 //Gain
},
{
1, -1.973319173, 0.9801670909 //Denominator
},
{
1, 0, 0 //Gain
},
{
1, -1.93603766, 0.942756176 //Denominator
},
{
1, 0, 0
},
{
1, -1.903245926, 0.9098505974
},
{
1, 0, 0
},
{
1, -1.876379848, 0.8828913569
},
{
1, 0, 0
},
{
1, -1.856491446, 0.8629338741
},
{
1, 0, 0
},
{
1, -1.844288707, 0.8506888151
},
{
1, 0, 0
},
{
1, -0.9200886488, 0
},
{
1, 0, 0
}
};
我想问的是,像它有7个section,每个section为second order,是要将讯号经过七次的
section做系数运算,如y(k)=b1y(k-1)+a0x(k)+a1x(k-1),并在各section的系数运算前
还要经过Gain值的运算。如:
int16 iir_filter(int16 in)
{
uint16 i;
x[0][0] = in;
for(i=0;i<MWSPT_NSEC;i++)
{
y[0]= x[i][0]*NUM[i][0]+x[i][1]*NUM[i][1]
+x[i][2]*NUM[i][2]-y[1]*DEN[i][1]-y[2]*DEN[i][2];
y[0] /= DEN[i][0];
y[2]=y[1];y[1]=y[0];
x[i+1][2]=x[i][1];x[i+1][1]=x[i][0];
x[i+1][0] = y[0];
}
if( x[MWSPT_NSEC][0]>32767) x[MWSPT_NSEC][0]=32767;
if( x[MWSPT_NSEC][0]<-32768) x[MWSPT_NSEC][0]=-32768;
return ((int16)x[MWSPT_NSEC][0]);
}
请问是这样应用上去的吗?? 谢谢!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 120.126.41.105
※ 编辑: jeffchen106 来自: 120.126.41.105 (03/12 15:24)