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这个文件怎么找不到呢,不过我没添加上面的仿真也没问题:
有时间的回答上面的2个问题吧:
1,simulink仿真不正确的原因?
2,rts.lib文件怎么找不到呢?
页:
[1]