|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
#define IO_BUF SHORT
#define IIR_FLOATING DOUBLE
#define IIR_L_N 16 //低通滤波器阶数为16
#define IIR_H_N 6 //高通滤波器阶数为6
//高通滤波器的A系数
const IIR_FLOATING IIR_H_A[IIR_L_N]={1,-4.998,9.9919,-9.9878,4.9919,-0.99797};//
//高通滤波器的B系数
const IIR_FLOATING IIR_H_B[IIR_L_N]={0.9990,-4.9949,9.9899,-9.9899,4.9949,-0.9990};//
void iir(IO_BUF *BUF,INT N_BUF, INT N,IIR_FLOATING *coef,INT INC,IIR_FLOATING *T_BUF)
{
INT i,j;
IIR_FLOATING out;
for(i=0;i<N_BUF;i=i+INC)
{
T_BUF[0]=(IIR_FLOATING)(*(BUF+i));
out=0.0;
for(j=0;j<(N*2-1);j++)
{
out+=T_BUF[j]*coef[j];
}
if(out>32767)
{
*(BUF+i)=32767;//float正数溢出
}
else if(out<-32768)
{
*(BUF+i)=-32768;//float负数溢出
}
else
{
*(BUF+i)=(IO_BUF)out;
}
//移动输入x1 x2...和y1 y2...
for(j=N-1;j>0;j--)
{
T_BUF[j]=T_BUF[j-1];
}
for(j=(N*2-2);j>N;j--)
{
T_BUF[j]=T_BUF[j-1];
}
T_BUF[N]=out;
}
}
void CIIRView::OnIirFilter()
{
IIR_FLOATING coef[IIR_H_N*2];
for(int i=0;i<IIR_H_N;i++)
{
coef=IIR_H_B;
}
for(i=IIR_H_N;i<IIR_H_N*2-1;i++)
{
coef=0-IIR_H_A[i-IIR_H_N+1];
}
IIR_FLOATING T_BUF[IIR_H_N*2];
for(i=0;i<IIR_H_N*2;i++)
{
T_BUF=0.0;
}
iir(BUF,500, IIR_H_N,coef,1, T_BUF);
}
在iir实现过程中,老是出现(out>32767)和(out<-32768),造成滤波实现不了,请问专家们,
上面实现是matlab求出的[b,a]系数问题,还是iir函数差分方程的实现问题?请指教,多谢了! |
|