|
看了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 SAMPLEF 10000
- #define PI 3.1415926
- float InputWave();
- float FIR();
- float fHn[FIRNUMBER]={0.003712875589426, -0.02014261495238, -0.02635165187265, 0.2699186217774,
- 0.5457255389164, 0.2699186217774, -0.02635165187265, -0.02014261495238,
- 0.003712875589426};
- float fXn[FIRNUMBER]={ 0.0 };
- float fInput,fOutput;
- float fSignal1,fSignal2;
- float fStepSignal1,fStepSignal2;
- float f2PI;
- int i;
- float fIn[256],fOut[256];
- 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[nIn]=fInput; //保存在fIn[nIn]
- nIn++; nIn%=256;
- fOutput=FIR(); //FIR滤波
- fOut[nOut]=fOutput; //保存在fOut[nOut]
- nOut++;
- if ( nOut>=256 )
- {
- nOut=0;
- }
- }
- }
- /**************************************************************
- 函数名:float InputWave()
- 入口参数:空
- 出口参数:fXn[0]
- 说明:波形输入函数
- *************************************************************/
- float InputWave()
- {
- for ( i=FIRNUMBER-1;i>0;i-- )
- fXn[i]=fXn[i-1];
- fXn[0]=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[0]);
- }
- /**************************************************************
- 函数名:float FIR()
- 入口参数:空
- 出口参数:fSum
- 说明:FIR滤波函数
- **************************************************************/
- float FIR()
- {
- float fSum;
- fSum=0 ;//fSum初始化为0
- for ( i=0;i<FIRNUMBER;i++ )
- {
- fSum+=(fXn[i]*fHn[i]);
- }
- return(fSum); //返回fSum
- }
复制代码
是在网上找的程序,FIR函数就是滤波函数,InputWave是目标信号叠加噪声信号之后,没太仔细看叠加噪声的频率,不过低通肯定能使噪声平滑,看下面的仿真结果:
还有一点win7 64位安装不了CCS 3.3,即使安装上了有些东西也用不了,原因如下:http://www.seeddsp.com/service/bbs/archiver/?tid-46863.html
还有我的rts.lib这个文件怎么找不到呢,不过我没添加上面的仿真也没问题:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|