R88 发表于 2014-7-25 12:44:16

F-I-R滤波器的计算仿真

看了2天资料,时间太短,有不对的地方见谅,首先定义自己滤波器的参数:设计一个低通滤波器,通带边缘频率100HZ,阻带边缘频率1K,阻带衰减60db,采用频率2K。之后呢就需要用matlab计算参数了,这里有两种办法,一种是直接编程实现,一种是利用工具FDATool实现,首先利用第一种方法实现:
首先是选择窗口函数,各个窗口函数的基本参数如下:

这里我们选择海明窗。计算截止频率:2pi*[(100+1K)/2]/2K=0.55pi,这里的截止频率是数字频率,定义如下:

理想低通滤波器的响应为h1(n)=sin(0.55pin)/n/pi.
窗函数的长度在上面看出是8pi/N,低通滤波器的过度带宽为2pi*900/2K=0.9pi,两者相等,得N=8.8,取9.窗函数为:
w(n)=0.54+0.46cos2pin/(N-1)
所以最终加窗之后的响应为h(n)=h1(n)*w(n),|n|<=4;下面在matlab中实现参数的计算:



下面利用FDATool实现:

看出跟第一种方法计算的系数是一样的。
计算完系数之后可用simulink看一下是否正常,我搭了一个,输入为500HZ,8000HZ的正弦波,但是软件不熟悉,可能那块没设对,不符合现象,有熟悉的看看哪里不对:

下面通过CCS软件验证这个低通系数:
程序如下:

#include"math.h"

#define FIRNUMBER 9
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF10000
#define PI 3.1415926

float InputWave();
float FIR();

float fHn={0.003712875589426, -0.02014261495238, -0.02635165187265,   0.2699186217774,
0.5457255389164,   0.2699186217774, -0.02635165187265, -0.02014261495238,
0.003712875589426};
float fXn={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn,fOut;
int nIn,nOut;
/***************************************************************
函数名:main(void)
入口参数:空
出口参数:空
说明:主函数
**************************************************************/
main(void)
{
    nIn=0; nOut=0;
        f2PI=2*PI;
        fSignal1=0.0;
        fSignal2=PI*0.1;
        fStepSignal1=2*PI/30;
        fStepSignal2=2*PI*1.4;
        while ( 1 )
        {
                fInput=InputWave();//得到输入信号
                fIn=fInput;      //保存在fIn
                nIn++; nIn%=256;
                fOutput=FIR();       //FIR滤波
                fOut=fOutput;   //保存在fOut
                nOut++;
                if ( nOut>=256 )
                {
                        nOut=0;               
                }
        }
}        
/**************************************************************
函数名:float InputWave()
入口参数:空
出口参数:fXn
说明:波形输入函数
*************************************************************/
float InputWave()
{
        for ( i=FIRNUMBER-1;i>0;i-- )
        fXn=fXn;
        fXn=sin(fSignal1)+cos(fSignal2)/6.0;
        //fXn[]数组右移,并对数组第一个元素赋值
        fSignal1+=fStepSignal1;
        if ( fSignal1>=f2PI )        fSignal1-=f2PI;
        //计算fSignal1,并使其保证在0到2PI内
        fSignal2+=fStepSignal2;
        if ( fSignal2>=f2PI )        fSignal2-=f2PI;
        //计算fSignal2,并使其保证在0到2PI内
        return(fXn);
}
/**************************************************************
函数名:float FIR()
入口参数:空
出口参数:fSum
说明:FIR滤波函数
**************************************************************/
float FIR()
{
        float fSum;
        fSum=0 ;//fSum初始化为0
        for ( i=0;i<FIRNUMBER;i++ )
        {
                fSum+=(fXn*fHn);
        }
        return(fSum); //返回fSum
}
是在网上找的程序,FIR函数就是滤波函数,InputWave是目标信号叠加噪声信号之后,没太仔细看叠加噪声的频率,不过低通肯定能使噪声平滑,看下面的仿真结果:


还有一点win7 64位安装不了CCS 3.3,即使安装上了有些东西也用不了,原因如下:http://www.seeddsp.com/service/bbs/archiver/?tid-46863.html
还有我的rts.lib这个文件怎么找不到呢,不过我没添加上面的仿真也没问题:

R88 发表于 2014-7-25 12:45:34

有时间的回答上面的2个问题吧:
1,simulink仿真不正确的原因?
2,rts.lib文件怎么找不到呢?
页: [1]
查看完整版本: F-I-R滤波器的计算仿真