声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2433|回复: 3

[编程技巧] matlab实现iir系数[b,a], 但差分方程实现有误!

[复制链接]
发表于 2006-10-31 12:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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函数差分方程的实现问题?请指教,多谢了!
回复
分享到:

使用道具 举报

发表于 2006-10-31 14:21 | 显示全部楼层
楼主有否在MATLAB中仿真IIR差分方程的滤波过程?
 楼主| 发表于 2006-10-31 17:35 | 显示全部楼层

回 songzy41

songzy41  你好!
matlab里面模拟过,我上面iir函数在matlab里面用filter函数模拟了,
信号没出现什么问题,是对的,所以我确信a和b值的正确性。
但是,用C实现差分方程就出现问题,请高手指教,多谢了。
发表于 2006-10-31 19:41 | 显示全部楼层
用filter函数模拟还不够,要用差分方程去仿真模拟,当差分方程仿真模拟成功了,可报留差分方程仿真模拟开始时的中间过程,然而在C语言运行时把开始的中间数据也显示出来(与MATLAB差分模拟时用相同的输入),把中间数据进行对比,这样能较快地调试C语言程序,也容易发现问题。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 20:42 , Processed in 0.061869 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表