2004|0

6802

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

基于DSP的FIR滤波器设计与实现 [复制链接]

一、摘要
  采用DSP做FIR算法


二、实验平台
  Matlab7.1 + CCS3.1


三、实验内容
  根据要求设计低通FIR滤波器。


  要求:通带边缘频率10KHz,阻带边缘频率22KHz,阻带衰减75dB,采样频率50KHz。


四、实验步骤
3.1  参数计算
窗函数选定:阻带衰减75dB,选择blackman窗


截止频率:2pi*(10+(22-10)/2)/50 = 0.64pi


窗函数长度:blackman窗的过渡带宽为5.98,单位为2pi/N,而要设计的低通滤波器的过渡带宽为2pi*12/50=0.48pi,二者相等,得N=24.9,取25。


3.2  滤波器的脉冲响应
理想低通滤波器脉冲响应:


h1[n] = sin(nΩ1)/n/pi = sin(0.64pi*n)/n/pi


窗函数为:


w[n] = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24)


则滤波器脉冲响应为:


h[n] = h1*w[n]    |n|<=12


h[n] = 0              |n|>12


3.3  滤波器的差分方程
根据滤波器的脉冲响应计算出h[n],然后将脉冲响应值移位为因果序列


这里计算h[n]的值,采用Matlab计算,有2种方法。


一种是用程序,代码如下:


Window=blackman(25);


b=fir1(24,0.64,Window);


freqz(b,1)


系数如下:


h1 =





  Columns 1 through 8





    0.000    0.000   0.001   -0.002   -0.002   0.010    -0.009   -0.018





  Columns 9 through 16





   0.049    -0.020   -0.110    0.280    0.640   0.280   -0.110    -0.020   





  Columns 17 through 24





   0.049    -0.018    -0.009   0.010    -0.002   -0.002   0.001    0.000





Columns 25





   0.000





另外一种是通过FDATool工具箱设置参数之后生成滤波器(这里设置滤波器的阶数时,设置为24),之后得到滤波器的系数。系数值同上。


最后,得到滤波器的差分方程:


y[n] =   0.001x[n-2] - 0.002x[n-3] - 0.002x[n-4] + 0.01x[n-5] - 0.009x[n-6] - 0.018[n-7]


    + 0.049x[n-8] -0.02x[n-9] - 0.11x[n-10] + 0.28x[n-11] + 0.64x[n-12] + 0.28x[n-13]


    - 0.11[n-14] - 0.02x[n-15] + 0.049x[n-16] - 0.018x[n-17] - 0.009x[n-18] + 0.1x[n-19]


    - 0.002x[n-20] - 0.002x[n-21] + 0.001x[n-22]


3.4  DSP实现
根据滤波器系数,编写DSP实现的程序,下面是采用CCS软件仿真的形式,验证FIR滤波器的效果。





//#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
//#include "DSP281x_Examples.h"   // DSP281x Examples Include File
#include "f2812a.h"
#include"math.h"





#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF  10000
#define PI 3.1415926





float InputWave();
float FIR();





float fHn[FIRNUMBER]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,
                       -0.018,0.049,-0.02,0.11,0.28,0.64,0.28,
                       -0.11,-0.02,0.049,-0.018,-0.009,0.01,
                       -0.002,-0.002,0.001,0.0,0.0
                     };
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)
{
   
   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;
  nIn++; nIn%=256;
  fOutput=FIR();
  fOut[nOut]=fOutput;
  nOut++;
  if ( nOut>=256 )
  {
   nOut=0;  /* 请在此句上设置软件断点 */
  }
}
}  







float InputWave()
{
for ( i=FIRNUMBER-1;i>0;i-- )
  fXn=fXn[i-1];
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;
fSignal1+=fStepSignal1;
if ( fSignal1>=f2PI ) fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if ( fSignal2>=f2PI ) fSignal2-=f2PI;
return(fXn[0]);
}






float FIR()
{
float fSum;
fSum=0;
for ( i=0;i
{
  fSum+=(fXn*fHn);
}
return(fSum);
}


3.5  仿真结果





左上角的波形,为混叠有高频噪声的输入波形;右上角的是该波形的频谱。


  左下角的波形,为经过FIR低通滤波器之后的输出波形;右下角的是该波形的频谱。


由实验结果可知,FIR滤波器能起到很好的滤波效果。

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表