新闻  |   论坛  |   博客  |   在线研讨会
手把手教你用matlab生成STM32官方IIR滤波器的系数(二)
powermod | 2014-11-18 09:27:12    阅读:13492   发布文章

本节主要介绍如何使用matlab2008生成IIR数字滤波器系数。

一、在matlab上设计一个高通滤波

打开matlab程序之后,在命令行窗口输入“fdatool”,弹出滤波器设计对话框如图6

图6.matlab中fdatool滤波器设计

为了便于分析,我们先从设计一个简单的一级2阶高通滤波器开始,按照下图中的步骤进行。

1.Design Method用于选择IIR滤波器还是FIR滤波器,这里我们选择IIR滤波器,类型选择Chebyshev Type I,当然你也可以选择其他类型,不同类型的频率响应不同,选择后默认的滤波器结构是直接II型,如图7中的蓝色框所示。

2.ResponseType用于选择低通、高通、带通以及陷波,选择高通滤波“Highpass”,这里我们选择高通滤波用于滤出300HZ以下的工频频率。

3.Fiter Order 选择阶数,为了使用STM32官方库给的程序,这里需要填入偶数,为了简单起见,先选择一个2阶滤波器做实验。

4.Frequency Specifications用于设置采样频率以及截止频率,这里填入8000以及300,也就是采样率是8KHz,300Hz以下的频率都不能通过。

5.点击“Design Filter”,matlab将生成一个按照以上参数设计的滤波器,点击图中数字6的图标,可以在坐标框中看到该滤波器的幅频响应,正如图中所示,频率在300Hz以下的信号将被滤除。

图7.设计高通IIR滤波器

 

二、导出系数

设计完毕一个高通滤波器之后,这个模型就已经在matlab内部保存起来了。接下来就需要将模型的参数导出来以供stm32f1使用,在导出数据之前,先看一下用matlab将该数据模型实例化之后是什么样子。

按照图中数字标号进行,第一步点击左边小图标,第二步“Build model using basic elements”这一项打钩,右边四个灰色的项将自动打钩,默认不要修改,最后点击“Realize Model”,matlab将自动把滤波器的数学模型通过仿真的形式展现出来,在弹出的窗口中双击模型,双击之后将在新窗口中展示该模型的内部结构,为了便于观察分析,这里我将模型的各个模块进行了位置调整,并将各放大器的增益都用数字表示出来了。

图8.将滤波器实例化

图9.生成的仿真模型

 

图10.模型内部结构

由该图可以看出,这是一个典型的一级二阶直接II型结构的滤波器,若是我们在前面的fdatool中选择4阶以上的滤波器,那么这个模型内部将会有更多的二阶结构级联。

导出C语言的滤波器系数

接下来我们看一下滤波器数据模型的系数到底是如何对应到图10中所示结构的系数的。

在fdatool中点击”Targets”菜单下的”Generate C Header”,弹出下面的对话框,图中”Data type use in export”选项用于选择导出的数据类型,比如双精度浮点、单精度浮点、16位无符号定点、32位有符号定点等等,这里我们先导出为双精度浮点,定点计算比较麻烦,在以后的教程中再举例说明。

图11.基于C系数的导出

 

选好之后直接点击”Gererate”,弹出一个对话框让你填写保存数据文件的文件名,这里默认为”fdacoefs.txt”。在我们保存的目录下打开fdacoefs.txt文件,打开后出现以下代码

#define MWSPT_NSEC 3 //NL、DL数组中元素的个数

const int NL[MWSPT_NSEC] = { 1,3,1 };//定义分子数组NUM[MWSPT_NSEC][3]有效数据的个数,比如{ 1,3,1 }就表示数组NUM[][]中第一行第一个数据有效,第二行三个数据全都有效,第三行第一个数据有效,以此类推。

const real64_T NUM[MWSPT_NSEC][3] = {

  { //第一个数有效,对应图12中输入的增益系数s(1),图中用蓝色圈框住。

     0.0398344010957,                 0,                 0 

  },

  { //三个数都有效,对应图12中右侧系数b,图中用蓝色圈框住

                   1,                -2,                 1 

  },

  { //第一个数有效,对应图12中输出的增益系数,图中用金色表示

      19.79025967934,                 0,                 0 

  }

};

const int DL[MWSPT_NSEC] = { 1,3,1 };//定义分母数组DEN[MWSPT_NSEC][3]有效数据的个数,比如{ 1,3,1 }就表示数组DEN[][]中第一行第一个数据有效,第二行三个数据全都有效,第三行第一个数据有效,以此类推。

const real64_T DEN[MWSPT_NSEC][3] = {

  {

                   1,                 0,                 0 

  },

  { //三个数都有效,对应图12中左侧系数a,图中用红色圈框住

                   1,   -1.746571017897,   0.7915263152984 

  },

  {

                   1,                 0,                 0 

  }

};

图12.滤波器系数

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客