滤波器系数生成与代码编写

1.MATLAB滤波器设计

  使用filterDesigner打开滤波器设计界面,界面如下

  

  Fs:采样频率

  Fc:截止频率。

2.导出滤波器系数

  文件->导出,弹出导出界面如下

  

 3.在Workspace查看滤波器系数

  查看滤波器系数命令为

  [a,b] = tf(Hd);//Hd为变量名

4.生成滤波器模型

  

  目标:在哪个Simulink文件中生成filiter模块;

  实现模型:生成模型。

 5.代码示例

double b1[7] = {0.328603015244413,0,-0.985809045733238,0,0.985809045733238,0,-0.328603015244413};
double a1[7] = {1.0,5.081685231849039,11.479000532970600,14.588358090743688,10.988764421858018,4.656910559926142,0.877285250077527};
double b2[3] = {0.391335772501769,0.782671545003537,0.391335772501769};
double a2[3] = {1.0,0.369527377351241,0.195815712655833};

//带通滤波器程序

void ButtordBandpass(double in)
{
  int i;
  static double xBBuff[7] = {0,0,0,0,0,0,0};
  static double yBBuff[7] = {0,0,0,0,0,0,0};
  static int len = 0;
  for(i=6;i>0;i--)
  {
    xBBuff[i] = xBBuff[i-1];
    yBBuff[i] = yBBuff[i-1];
  }
  xBBuff[0] = in;
  yBBuff[0] = 0;
  for(i=1;i<7;i++)
  {
    yBBuff[0] = yBBuff[0] + b1[i]*xBBuff[i];
    yBBuff[0] = yBBuff[0] - a1[i]*yBBuff[i];
  }
  yBBuff[0] = yBBuff[0] + b1[0]*xBBuff[0];

}

//低通滤波器程序

void ButtordLowpass(double in)
{
  int i;
  static double xLBuff[3] = {0,0,0};
  static double yLBuff[3] = {0,0,0};
  static int len = 0;
  for(i=2;i>0;i--)
  {
    xLBuff[i] = xLBuff[i-1];
    yLBuff[i] = yLBuff[i-1];
  }
  xLBuff[0] = in;
  yLBuff[0] = 0;
  for(i=1;i<3;i++)
  {
    yLBuff[0] = yLBuff[0] + b2[i]*xLBuff[i]
    yLBuff[0] = yLBuff[0] - a2[i]*yLBuff[i];
  }
  yLBuff[0] = yLBuff[0] + b2[0]*xLBuff[0];

}

6.MATLAB验证

  设计一个截止频率为200Hz的低通滤波器,对比滤波器为simulink自带的巴特沃斯低通滤波器

  输入为频率为100Hz的正弦波,两者输出如下

  (1)simulink自带的巴特沃斯低通滤波器仿真结果

  

  幅值为7.067

  (2)根据生成的滤波器系数编写的滤波函数的滤波结果

  

  幅值为 9.703

  输入为频率为200Hz的正弦波,两者输出如下

  (1)simulink自带的巴特沃斯低通滤波器仿真结果

  

   幅值为2.418

  (2)根据生成的滤波器系数编写的滤波函数的滤波结果

    

   幅值为7.07

  输入为频率为500Hz的正弦波,两者输出如下

  (1)simulink自带的巴特沃斯低通滤波器仿真结果

  

  幅值为0.399

  (2)根据生成的滤波器系数编写的滤波函数的滤波结果

  

   幅值为1.557

  输入为频率为1000Hz的正弦波,两者输出如下

  (1)simulink自带的巴特沃斯低通滤波器仿真结果

  

   幅值为0.098

  (2)根据生成的滤波器系数编写的滤波函数的滤波结果

  

   幅值为0.374

7.调试心得

    在编写MATLAB代码时,由于变量定义为全局变量,又复制了好几个MATLAB Function模块,没想到不同模块间

  全局变量相互影响,所以显示结果错的离谱。

posted on 2022-05-27 23:17  斯特拉  阅读(370)  评论(0)    收藏  举报

导航