Board logo

标题: 【炒冷饭】STM32实现IIR滤波器,可用matlab生成的头文件 [打印本页]

作者: reporter    时间: 2013-8-26 17:26     标题: 【炒冷饭】STM32实现IIR滤波器,可用matlab生成的头文件

<table cellspacing="0" cellpadding="0"><tr><td class="t_f" id="postmessage_6908690">
<i class="pstatus"> 本帖最后由 monkeynav 于 2013-8-21 18:09 编辑 </i><br />
<br />
原帖刊载于ourdev:http://www.amobbs.com/thread-4165021-1-1.html<br />
原帖代码搞错,也无法编辑,很多人又找不到后面的更正,为了不误导更多人,就在这里重新发一遍。<br />
<br />
这里提供用于AVR和STM32的IIR滤波器代码下载,保证可用,不需要额外修改:<br />
<br />
------------------------------------------------------------------------------------------------------------------------------------------------------<br />
<br />
放假实在无聊,即将到来的高三非常恐怖,先偷闲一把。<br />
<br />
matlab的fdatool是好东西,不过很多人不知道该怎么使用它生成的C头文件。<br />
<br />
该程序已经用于心电采集实验<br />
<br />
<br />
<br />
<br />
不多说,切入正题<br />
<br />
这里有个fdatool设计的IIR高通滤波器,采样率400Hz时截止频率1Hz。<br />
设计定型之后,要做些调整。<br />
<br />
以下说明中的英文名词有些可能对不上fdatool界面上的原文,请大家意会吧<br />
<br />
第一步:<br />
点击菜单中的Edit-&gt;Convert Structure 选择Direct Form I ,SOS,(必须是Direct Form I,II不行)<br />
一般情况下,按照默认设置,fdatool设计都是由二阶部分串联组成的。<br />
这种结构的滤波器稳定性比一个section的要好很多,其他方面的性能也好些。<br />
如果不是的话,点击Convert to second order sections。<br />
这时,滤波器的结构(structure)应该显示为 Direct Form I,second order sections<br />
<br />
第二步:<br />
选择quantize filter,精度选择single precision floating point (单精度浮点)<br />
之所以不用定点是因为噪声太大,也不容易稳定。<br />
点击菜单中的Targets -&gt; generate c header ,选择export as:single precision floating point (单精度浮点)<br />
填写变量名称时,把NUM改成IIR_B,DEN改成IIR_A,其他不用动,保存为iir_coefs.h<br />
<br />
保存好的文件如下:<br />
//一大堆注释<br />
//然后:<br />
/* General type conversion for MATLAB generated C-code*/<br />
#include &quot;tmwtypes.h&quot;<br />
/*<br />
* Expected path to tmwtypes.h<br />
* C:\Program Files\MATLAB\R2010a\extern\include\tmwtypes.h<br />
*/<br />
/*<br />
* Warning - Filter coefficients were truncated to fit specified data type.<br />
* The resulting response may not match generated theoretical response.<br />
* Use the Filter Design &amp; Analysis Tool to design accurate<br />
* single-precision filter coefficients.<br />
*/<br />
#define MWSPT_NSEC 9<br />
const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };<br />
const real32_T IIR_B[MWSPT_NSEC][3] = {<br />
{<br />
0.8641357422,    0,    0<br />
},<br />
{<br />
      1,     -2,    1<br />
},<br />
{<br />
0.9949035645,    0,    0<br />
},<br />
{<br />
      1, -1.999938965,    1<br />
},<br />
{<br />
0.9985351563,    0,    0<br />
},<br />
{<br />
      1,  -1.99987793,    1<br />
},<br />
{<br />
0.9996337891,    0,    0<br />
},<br />
{<br />
     1,  -1.99987793,    1<br />
},<br />
{<br />
      1,    0,    0<br />
}<br />
};<br />
const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };<br />
const real32_T IIR_A[MWSPT_NSEC][3] = {<br />
{<br />
      1,    0,    0<br />
},<br />
{<br />
      1, -1.938049316, 0.9401855469<br />
},<br />
{<br />
      1,    0,    0<br />
},<br />
{<br />
      1, -1.989501953, 0.9900512695<br />
},<br />
{<br />
      1,    0,    0<br />
},<br />
{<br />
      1, -1.996887207, 0.9971923828<br />
},<br />
{<br />
      1,    0,    0<br />
},<br />
{<br />
      1, -1.999084473, 0.9993286133<br />
},<br />
{<br />
      1,    0,    0<br />
}<br />
};<br />
<br />
<br />
第三步:<br />
打开iir_coefs.h把MWSPT_NSEC替换成IIR_NSEC, <br />
NL、DL数组删除掉,real32_T改成float ,<br />
其中有一个#include &quot;twmtypes.h&quot;,不要它了,删掉<br />
改完的文件如下:<br />
<br />
#define IIR_NSEC 9<br />
//原来叫做MWSPT_NSEC<br />
<br />
<br />
const float IIR_B[IIR_NSEC][3] = {<br />
//为什么改为float很明显了吧<br />
{<br />
  0.8641357422,    0,    0<br />
},<br />
{<br />
      1,    -2,    1<br />
},<br />
{<br />
  0.9949035645,    0,    0<br />
},<br />
{<br />
      1,-1.999938965,    1<br />
},<br />
{<br />
  0.9985351563,    0,    0<br />
},<br />
{<br />
      1,  -1.99987793,    1<br />
},<br />
{<br />
0.9996337891,    0,    0<br />
},<br />
{<br />
      1,  -1.99987793,    1<br />
},<br />
{<br />
      1,    0,    0<br />
}<br />
};<br />
const float IIR_A[IIR_NSEC][3] = {<br />
{<br />
      1,    0,    0<br />
},<br />
{<br />
      1,-1.938049316,0.9401855469<br />
},<br />
{<br />
      1,    0,    0<br />
},<br />
{<br />
      1,-1.989501953,0.9900512695<br />
},<br />
{<br />
      1,    0,    0<br />
},<br />
{<br />
      1,-1.996887207,0.9971923828<br />
},<br />
{<br />
      1,    0,    0<br />
},<br />
{<br />
      1,-1.999084473,0.9993286133<br />
},<br />
{<br />
      1,    0,    0<br />
}<br />
};<br />
<br />
<br />
保存文件,然后使用以下代码进行滤波<br />
这段代码是根据Direct Form I 2阶IIR滤波的差分方程编写的<br />
a0*y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] -a2*y[n-2];<br />
<br />
<br />
#include &quot;../platform.h&quot;<br />
//#include &quot;iir_coefs.float.flat.h&quot;<br />
//#include &quot;iir_coefs.float.sharp.h&quot;<br />
#include &quot;iir_coefs_pass@2Hz_stop@0.8Hz.h&quot;<br />
#include &quot;iir_filter.h&quot;<br />
static float y[IIR_NSEC][3];<br />
static float x[IIR_NSEC+1][3];<br />
//IIR_NSEC阶直接型II IIR滤波器<br />
//IIR_NSEC个二阶biquad串联<br />
int16 iir_filter(int16 in)<br />
{<br />
  uint16 i;<br />
  <br />
  x[0][0] = in;<br />
  <br />
  for(i=0;i&lt;IIR_NSEC;i++)<br />
  {<br />
  <br />
  //y<i>[0] = x<i>[0]*IIR_B<i>[0] +x<i>[1]*IIR_B<i>[1] +x<i>[2]*IIR_B<i>[2]-y<i>[1]*IIR_A<i>[1]-y<i>[2]*IIR_A<i>[2];<br />
    y<i>[0] = 0;<br />
    <br />
    if(IIR_B<i>[0] == 1) y<i>[0]+=x<i>[0];<br />
    else if(IIR_B<i>[0] == -1) y<i>[0]-=x<i>[0];<br />
    else if(IIR_B<i>[0] == -2) y<i>[0]=y<i>[0]-x<i>[0]-x<i>[0];<br />
    else if(IIR_B<i>[0] == 0);  <br />
    else y<i>[0] += x<i>[0]*IIR_B<i>[0];<br />
    <br />
    if(IIR_B<i>[1] == 1) y<i>[0]+=x<i>[1];<br />
    else if(IIR_B<i>[1] == -1) y<i>[0]-=x<i>[1];<br />
    else if(IIR_B<i>[1] == -2) y<i>[0]=y<i>[0]-x<i>[1]-x<i>[1];<br />
    else if(IIR_B<i>[1] == 0);<br />
    else y<i>[0] += x<i>[1]*IIR_B<i>[1];<br />
    <br />
    if(IIR_B<i>[2] == 1) y<i>[0]+=x<i>[2];<br />
    else if(IIR_B<i>[2] == -1) y<i>[0]-=x<i>[2];<br />
    else if(IIR_B<i>[2] == -2) y<i>[0]=y<i>[0]-x<i>[2]-x<i>[2];<br />
    else if(IIR_B<i>[2] == 0);<br />
    else y<i>[0] += x<i>[2]*IIR_B<i>[2];<br />
    <br />
    if(IIR_A<i>[1] == 1) y<i>[0]-=y<i>[1];<br />
    else if(IIR_A<i>[1] == -1) y<i>[0]+=y<i>[1];<br />
    else if(IIR_A<i>[1] == -2) y<i>[0]=y<i>[0]+y<i>[1]+y<i>[1];<br />
    else if(IIR_A<i>[1] == 0);<br />
    else y<i>[0] -= y<i>[1]*IIR_A<i>[1];<br />
    <br />
    if(IIR_A<i>[2] == 1) y<i>[0]-=y<i>[2];<br />
    else if(IIR_A<i>[2] == -1) y<i>[0]+=y<i>[2];<br />
    else if(IIR_A<i>[2] == -2) y<i>[0]=y<i>[0]+y<i>[2]+y<i>[2];<br />
    else if(IIR_A<i>[2] == 0);<br />
    else y<i>[0] -= y<i>[2]*IIR_A<i>[2];<br />
    <br />
    if(IIR_A<i>[0] != 1) y<i>[0] /= IIR_A<i>[0];<br />
    <br />
    y<i>[2]=y<i>[1];y<i>[1]=y<i>[0];<br />
    x<i>[2]=x<i>[1];x<i>[1]=x<i>[0];<br />
    <br />
    x[i+1][0] = y<i>[0];<br />
  }<br />
  <br />
  if( x[IIR_NSEC][0]&gt;32767)x[IIR_NSEC][0]=32767;<br />
  if( x[IIR_NSEC][0]&lt;-32768) x[IIR_NSEC][0]=-32768;<br />
  return((int16)x[IIR_NSEC][0]);  <br />
  <br />
}<br />
//复位滤波器<br />
void iir_reset(void)<br />
{<br />
  uint16 i,j;<br />
  <br />
  for(i=0;i&lt;IIR_NSEC+1;i++)<br />
  {<br />
   for(j=0;j&lt;3;j++)<br />
   {<br />
    x<i>[j]=0;<br />
   }<br />
  }<br />
  <br />
  for(i=0;i&lt;IIR_NSEC;i++)<br />
  {<br />
   for(j=0;j&lt;3;j++)<br />
   {<br />
    y<i>[j]=0;<br />
   }<br />
  }<br />
}<br />
<br />
<br />
//iir_filter.h<br />
#ifndef _IIR_FILTER_H__<br />
#define _IIR_FILTER_H__<br />
int16 iir_filter(int16 x);<br />
void iir_reset(void);<br />
#endif<br />
<br />
<br />
使用方法:<br />
首先写好iir_coefs.h,然后调用iir_filter.c对数据流进行滤波<br />
一个伪代码例子:<br />
while(运行中)<br />
{<br />
保存到SD卡(iir_filter(读取ADC采样值()));<br />
}<br />
<br />
这个函数比STM32 DSP库中的函数要好很多,DSP库中的2个IIR滤波函数都不能连续处理数据流。<br />
记得在开始滤波之前重置滤波器<br />
iir_reset();<br />
<br />
</td></tr></table>


<h3>本帖子中包含更多资源</h3>
<p>您需要 登录 才可以下载或查看,没有帐号?注册 </p>
作者: reporter    时间: 2013-8-30 09:23     标题: 【炒冷饭】STM32实现IIR滤波器,可用matlab生成的头文件

本帖最后由 monkeynav 于 2013-8-21 18:09 编辑

原帖刊载于ourdev:http://www.amobbs.com/thread-4165021-1-1.html
原帖代码搞错,也无法编辑,很多人又找不到后面的更正,为了不误导更多人,就在这里重新发一遍。

这里提供用于AVR和STM32的IIR滤波器代码下载,保证可用,不需要额外修改:

------------------------------------------------------------------------------------------------------------------------------------------------------

放假实在无聊,即将到来的高三非常恐怖,先偷闲一把。

matlab的fdatool是好东西,不过很多人不知道该怎么使用它生成的C头文件。

该程序已经用于心电采集实验




不多说,切入正题

这里有个fdatool设计的IIR高通滤波器,采样率400Hz时截止频率1Hz。
设计定型之后,要做些调整。

以下说明中的英文名词有些可能对不上fdatool界面上的原文,请大家意会吧

第一步:
点击菜单中的Edit-&gt;Convert Structure 选择Direct Form I ,SOS,(必须是Direct Form I,II不行)
一般情况下,按照默认设置,fdatool设计都是由二阶部分串联组成的。
这种结构的滤波器稳定性比一个section的要好很多,其他方面的性能也好些。
如果不是的话,点击Convert to second order sections。
这时,滤波器的结构(structure)应该显示为 Direct Form I,second order sections

第二步:
选择quantize filter,精度选择single precision floating point (单精度浮点)
之所以不用定点是因为噪声太大,也不容易稳定。
点击菜单中的Targets -&gt; generate c header ,选择export as:single precision floating point (单精度浮点)
填写变量名称时,把NUM改成IIR_B,DEN改成IIR_A,其他不用动,保存为iir_coefs.h

保存好的文件如下:
//一大堆注释
//然后:
/* General type conversion for MATLAB generated C-code*/
#include &quot;tmwtypes.h&quot;
/*
* Expected path to tmwtypes.h
* C:\Program Files\MATLAB\R2010a\extern\include\tmwtypes.h
*/
/*
* Warning - Filter coefficients were truncated to fit specified data type.
* The resulting response may not match generated theoretical response.
* Use the Filter Design &amp; Analysis Tool to design accurate
* single-precision filter coefficients.
*/
#define MWSPT_NSEC 9
const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };
const real32_T IIR_B[MWSPT_NSEC][3] = {
{
0.8641357422,    0,    0
},
{
      1,     -2,    1
},
{
0.9949035645,    0,    0
},
{
      1, -1.999938965,    1
},
{
0.9985351563,    0,    0
},
{
      1,  -1.99987793,    1
},
{
0.9996337891,    0,    0
},
{
     1,  -1.99987793,    1
},
{
      1,    0,    0
}
};
const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };
const real32_T IIR_A[MWSPT_NSEC][3] = {
{
      1,    0,    0
},
{
      1, -1.938049316, 0.9401855469
},
{
      1,    0,    0
},
{
      1, -1.989501953, 0.9900512695
},
{
      1,    0,    0
},
{
      1, -1.996887207, 0.9971923828
},
{
      1,    0,    0
},
{
      1, -1.999084473, 0.9993286133
},
{
      1,    0,    0
}
};


第三步:
打开iir_coefs.h把MWSPT_NSEC替换成IIR_NSEC,
NL、DL数组删除掉,real32_T改成float ,
其中有一个#include &quot;twmtypes.h&quot;,不要它了,删掉
改完的文件如下:

#define IIR_NSEC 9
//原来叫做MWSPT_NSEC


const float IIR_B[IIR_NSEC][3] = {
//为什么改为float很明显了吧
{
  0.8641357422,    0,    0
},
{
      1,    -2,    1
},
{
  0.9949035645,    0,    0
},
{
      1,-1.999938965,    1
},
{
  0.9985351563,    0,    0
},
{
      1,  -1.99987793,    1
},
{
0.9996337891,    0,    0
},
{
      1,  -1.99987793,    1
},
{
      1,    0,    0
}
};
const float IIR_A[IIR_NSEC][3] = {
{
      1,    0,    0
},
{
      1,-1.938049316,0.9401855469
},
{
      1,    0,    0
},
{
      1,-1.989501953,0.9900512695
},
{
      1,    0,    0
},
{
      1,-1.996887207,0.9971923828
},
{
      1,    0,    0
},
{
      1,-1.999084473,0.9993286133
},
{
      1,    0,    0
}
};


保存文件,然后使用以下代码进行滤波
这段代码是根据Direct Form I 2阶IIR滤波的差分方程编写的
a0*y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] -a2*y[n-2];


#include &quot;../platform.h&quot;
//#include &quot;iir_coefs.float.flat.h&quot;
//#include &quot;iir_coefs.float.sharp.h&quot;
#include &quot;iir_coefs_pass@2Hz_stop@0.8Hz.h&quot;
#include &quot;iir_filter.h&quot;
static float y[IIR_NSEC][3];
static float x[IIR_NSEC+1][3];
//IIR_NSEC阶直接型II IIR滤波器
//IIR_NSEC个二阶biquad串联
int16 iir_filter(int16 in)
{
  uint16 i;
  
  x[0][0] = in;
  
  for(i=0;i&lt;IIR_NSEC;i++)
  {
  
  //y[0] = x[0]*IIR_B[0] +x[1]*IIR_B[1] +x[2]*IIR_B[2]-y[1]*IIR_A[1]-y[2]*IIR_A[2];
    y[0] = 0;
   
    if(IIR_B[0] == 1) y[0]+=x[0];
    else if(IIR_B[0] == -1) y[0]-=x[0];
    else if(IIR_B[0] == -2) y[0]=y[0]-x[0]-x[0];
    else if(IIR_B[0] == 0);  
    else y[0] += x[0]*IIR_B[0];
   
    if(IIR_B[1] == 1) y[0]+=x[1];
    else if(IIR_B[1] == -1) y[0]-=x[1];
    else if(IIR_B[1] == -2) y[0]=y[0]-x[1]-x[1];
    else if(IIR_B[1] == 0);
    else y[0] += x[1]*IIR_B[1];
   
    if(IIR_B[2] == 1) y[0]+=x[2];
    else if(IIR_B[2] == -1) y[0]-=x[2];
    else if(IIR_B[2] == -2) y[0]=y[0]-x[2]-x[2];
    else if(IIR_B[2] == 0);
    else y[0] += x[2]*IIR_B[2];
   
    if(IIR_A[1] == 1) y[0]-=y[1];
    else if(IIR_A[1] == -1) y[0]+=y[1];
    else if(IIR_A[1] == -2) y[0]=y[0]+y[1]+y[1];
    else if(IIR_A[1] == 0);
    else y[0] -= y[1]*IIR_A[1];
   
    if(IIR_A[2] == 1) y[0]-=y[2];
    else if(IIR_A[2] == -1) y[0]+=y[2];
    else if(IIR_A[2] == -2) y[0]=y[0]+y[2]+y[2];
    else if(IIR_A[2] == 0);
    else y[0] -= y[2]*IIR_A[2];
   
    if(IIR_A[0] != 1) y[0] /= IIR_A[0];
   
    y[2]=y[1];y[1]=y[0];
    x[2]=x[1];x[1]=x[0];
   
    x[i+1][0] = y[0];
  }
  
  if( x[IIR_NSEC][0]&gt;32767)x[IIR_NSEC][0]=32767;
  if( x[IIR_NSEC][0]&lt;-32768) x[IIR_NSEC][0]=-32768;
  return((int16)x[IIR_NSEC][0]);  
  
}
//复位滤波器
void iir_reset(void)
{
  uint16 i,j;
  
  for(i=0;i&lt;IIR_NSEC+1;i++)
  {
   for(j=0;j&lt;3;j++)
   {
    x[j]=0;
   }
  }
  
  for(i=0;i&lt;IIR_NSEC;i++)
  {
   for(j=0;j&lt;3;j++)
   {
    y[j]=0;
   }
  }
}


//iir_filter.h
#ifndef _IIR_FILTER_H__
#define _IIR_FILTER_H__
int16 iir_filter(int16 x);
void iir_reset(void);
#endif


使用方法:
首先写好iir_coefs.h,然后调用iir_filter.c对数据流进行滤波
一个伪代码例子:
while(运行中)
{
保存到SD卡(iir_filter(读取ADC采样值()));
}

这个函数比STM32 DSP库中的函数要好很多,DSP库中的2个IIR滤波函数都不能连续处理数据流。
记得在开始滤波之前重置滤波器
iir_reset();




本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
作者: reporter    时间: 2013-9-4 11:04     标题: 【炒冷饭】STM32实现IIR滤波器,可用matlab生成的头文件

本帖最后由 monkeynav 于 2013-8-21 18:09 编辑

原帖刊载于ourdev:http://www.amobbs.com/thread-4165021-1-1.html
原帖代码搞错,也无法编辑,很多人又找不到后面的更正,为了不误导更多人,就在这里重新发一遍。

这里提供用于AVR和STM32的IIR滤波器代码下载,保证可用,不需要额外修改:

------------------------------------------------------------------------------------------------------------------------------------------------------

放假实在无聊,即将到来的高三非常恐怖,先偷闲一把。

matlab的fdatool是好东西,不过很多人不知道该怎么使用它生成的C头文件。

该程序已经用于心电采集实验




不多说,切入正题

这里有个fdatool设计的IIR高通滤波器,采样率400Hz时截止频率1Hz。
设计定型之后,要做些调整。

以下说明中的英文名词有些可能对不上fdatool界面上的原文,请大家意会吧

第一步:
点击菜单中的Edit-&amp;gt;Convert Structure 选择Direct Form I ,SOS,(必须是Direct Form I,&amp;nbsp;&amp;nbsp;II不行)
一般情况下,按照默认设置,fdatool设计都是由二阶部分串联组成的。
这种结构的滤波器稳定性比一个section的要好很多,其他方面的性能也好些。
如果不是的话,点击Convert to second order sections。
这时,滤波器的结构(structure)应该显示为 Direct Form I,second order sections

第二步:
选择quantize filter,精度选择single precision floating point (单精度浮点)
之所以不用定点是因为噪声太大,也不容易稳定。
点击菜单中的Targets -&amp;gt; generate c header ,选择export as:single precision floating point (单精度浮点)
填写变量名称时,把NUM改成IIR_B,DEN改成IIR_A,其他不用动,保存为iir_coefs.h

保存好的文件如下:
//一大堆注释
//然后:
/* General type conversion for MATLAB generated C-code&amp;nbsp;&amp;nbsp;*/
#include &amp;quot;tmwtypes.h&amp;quot;
/*
* Expected path to tmwtypes.h
* C:\Program Files\MATLAB\R2010a\extern\include\tmwtypes.h
*/
/*
* Warning - Filter coefficients were truncated to fit specified data type.&amp;nbsp;&amp;nbsp;
*&amp;nbsp; &amp;nbsp;The resulting response may not match generated theoretical response.
*&amp;nbsp; &amp;nbsp;Use the Filter Design &amp;amp; Analysis Tool to design accurate
*&amp;nbsp; &amp;nbsp;single-precision filter coefficients.
*/
#define MWSPT_NSEC 9
const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };
const real32_T IIR_B[MWSPT_NSEC][3] = {
{
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0.8641357422,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; -2,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0.9949035645,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.999938965,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0.9985351563,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp; -1.99987793,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
{
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0.9996337891,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1,&amp;nbsp; &amp;nbsp; -1.99987793,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}
};
const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };
const real32_T IIR_A[MWSPT_NSEC][3] = {
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.938049316,&amp;nbsp; &amp;nbsp;0.9401855469
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.989501953,&amp;nbsp; &amp;nbsp;0.9900512695
&amp;nbsp;&amp;nbsp;},
{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.996887207,&amp;nbsp; &amp;nbsp;0.9971923828
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.999084473,&amp;nbsp; &amp;nbsp;0.9993286133
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}
};


第三步:
打开iir_coefs.h把MWSPT_NSEC替换成IIR_NSEC,
NL、DL数组删除掉,real32_T改成float ,
其中有一个#include &amp;quot;twmtypes.h&amp;quot;,不要它了,删掉
改完的文件如下:

#define IIR_NSEC 9
&amp;nbsp;&amp;nbsp;//原来叫做MWSPT_NSEC


const float IIR_B[IIR_NSEC][3] = {
&amp;nbsp;&amp;nbsp;//为什么改为float很明显了吧
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp; 0.8641357422,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;-2,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp; 0.9949035645,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.999938965,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
{
&amp;nbsp; &amp;nbsp; 0.9985351563,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp; -1.99987793,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;0.9996337891,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp; -1.99987793,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}
};
const float IIR_A[IIR_NSEC][3] = {
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.938049316,&amp;nbsp;&amp;nbsp;0.9401855469
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.989501953,&amp;nbsp;&amp;nbsp;0.9900512695
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.996887207,&amp;nbsp;&amp;nbsp;0.9971923828
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.999084473,&amp;nbsp;&amp;nbsp;0.9993286133
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}
};


保存文件,然后使用以下代码进行滤波
这段代码是根据Direct Form I 2阶IIR滤波的差分方程编写的
a0*y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] -a2*y[n-2];


#include &amp;quot;../platform.h&amp;quot;
//#include &amp;quot;iir_coefs.float.flat.h&amp;quot;
//#include &amp;quot;iir_coefs.float.sharp.h&amp;quot;
#include &amp;quot;iir_coefs_pass@2Hz_stop@0.8Hz.h&amp;quot;
#include &amp;quot;iir_filter.h&amp;quot;
static float y[IIR_NSEC][3];
static float x[IIR_NSEC+1][3];
//IIR_NSEC阶直接型II IIR滤波器
//IIR_NSEC个二阶biquad串联
int16 iir_filter(int16 in)
{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;uint16 i;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;x[0][0] = in;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;for(i=0;i&amp;lt;IIR_NSEC;i++)
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;y[0] = x[0]*IIR_B[0] +x[1]*IIR_B[1] +x[2]*IIR_B[2]-y[1]*IIR_A[1]-y[2]*IIR_A[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; y[0] = 0;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_B[0] == 1) y[0]+=x[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[0] == -1) y[0]-=x[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[0] == -2) y[0]=y[0]-x[0]-x[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[0] == 0);&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] += x[0]*IIR_B[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_B[1] == 1) y[0]+=x[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[1] == -1) y[0]-=x[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[1] == -2) y[0]=y[0]-x[1]-x[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[1] == 0);&amp;nbsp;&amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] += x[1]*IIR_B[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_B[2] == 1) y[0]+=x[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[2] == -1) y[0]-=x[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[2] == -2) y[0]=y[0]-x[2]-x[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[2] == 0);
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] += x[2]*IIR_B[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_A[1] == 1) y[0]-=y[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[1] == -1) y[0]+=y[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[1] == -2) y[0]=y[0]+y[1]+y[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[1] == 0);
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] -= y[1]*IIR_A[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_A[2] == 1) y[0]-=y[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[2] == -1) y[0]+=y[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[2] == -2) y[0]=y[0]+y[2]+y[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[2] == 0);
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] -= y[2]*IIR_A[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_A[0] != 1) y[0] /= IIR_A[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; y[2]=y[1];y[1]=y[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; x[2]=x[1];x[1]=x[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; x[i+1][0] = y[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if( x[IIR_NSEC][0]&amp;gt;32767)&amp;nbsp;&amp;nbsp;x[IIR_NSEC][0]=32767;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if( x[IIR_NSEC][0]&amp;lt;-32768) x[IIR_NSEC][0]=-32768;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;return&amp;nbsp;&amp;nbsp;((int16)x[IIR_NSEC][0]);&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
}
//复位滤波器
void iir_reset(void)
{
&amp;nbsp; &amp;nbsp; uint16 i,j;
&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;IIR_NSEC+1;i++)
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; for(j=0;j&amp;lt;3;j++)
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; x[j]=0;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;IIR_NSEC;i++)
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; for(j=0;j&amp;lt;3;j++)
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; y[j]=0;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
}


//iir_filter.h
#ifndef _IIR_FILTER_H__
#define _IIR_FILTER_H__
int16 iir_filter(int16 x);
void iir_reset(void);
#endif


使用方法:
首先写好iir_coefs.h,然后调用iir_filter.c对数据流进行滤波
一个伪代码例子:
while(运行中)
{
保存到SD卡(iir_filter(读取ADC采样值()));
}

这个函数比STM32 DSP库中的函数要好很多,DSP库中的2个IIR滤波函数都不能连续处理数据流。
记得在开始滤波之前重置滤波器
iir_reset();




本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
作者: reporter    时间: 2013-9-4 11:04     标题: 【炒冷饭】STM32实现IIR滤波器,可用matlab生成的头文件

本帖最后由 monkeynav 于 2013-8-21 18:09 编辑

原帖刊载于ourdev:http://www.amobbs.com/thread-4165021-1-1.html
原帖代码搞错,也无法编辑,很多人又找不到后面的更正,为了不误导更多人,就在这里重新发一遍。

这里提供用于AVR和STM32的IIR滤波器代码下载,保证可用,不需要额外修改:

------------------------------------------------------------------------------------------------------------------------------------------------------

放假实在无聊,即将到来的高三非常恐怖,先偷闲一把。

matlab的fdatool是好东西,不过很多人不知道该怎么使用它生成的C头文件。

该程序已经用于心电采集实验




不多说,切入正题

这里有个fdatool设计的IIR高通滤波器,采样率400Hz时截止频率1Hz。
设计定型之后,要做些调整。

以下说明中的英文名词有些可能对不上fdatool界面上的原文,请大家意会吧

第一步:
点击菜单中的Edit-&amp;gt;Convert Structure 选择Direct Form I ,SOS,(必须是Direct Form I,&amp;nbsp;&amp;nbsp;II不行)
一般情况下,按照默认设置,fdatool设计都是由二阶部分串联组成的。
这种结构的滤波器稳定性比一个section的要好很多,其他方面的性能也好些。
如果不是的话,点击Convert to second order sections。
这时,滤波器的结构(structure)应该显示为 Direct Form I,second order sections

第二步:
选择quantize filter,精度选择single precision floating point (单精度浮点)
之所以不用定点是因为噪声太大,也不容易稳定。
点击菜单中的Targets -&amp;gt; generate c header ,选择export as:single precision floating point (单精度浮点)
填写变量名称时,把NUM改成IIR_B,DEN改成IIR_A,其他不用动,保存为iir_coefs.h

保存好的文件如下:
//一大堆注释
//然后:
/* General type conversion for MATLAB generated C-code&amp;nbsp;&amp;nbsp;*/
#include &amp;quot;tmwtypes.h&amp;quot;
/*
* Expected path to tmwtypes.h
* C:\Program Files\MATLAB\R2010a\extern\include\tmwtypes.h
*/
/*
* Warning - Filter coefficients were truncated to fit specified data type.&amp;nbsp;&amp;nbsp;
*&amp;nbsp; &amp;nbsp;The resulting response may not match generated theoretical response.
*&amp;nbsp; &amp;nbsp;Use the Filter Design &amp;amp; Analysis Tool to design accurate
*&amp;nbsp; &amp;nbsp;single-precision filter coefficients.
*/
#define MWSPT_NSEC 9
const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };
const real32_T IIR_B[MWSPT_NSEC][3] = {
{
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0.8641357422,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; -2,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0.9949035645,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.999938965,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0.9985351563,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp; -1.99987793,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
{
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0.9996337891,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1,&amp;nbsp; &amp;nbsp; -1.99987793,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}
};
const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };
const real32_T IIR_A[MWSPT_NSEC][3] = {
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.938049316,&amp;nbsp; &amp;nbsp;0.9401855469
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.989501953,&amp;nbsp; &amp;nbsp;0.9900512695
&amp;nbsp;&amp;nbsp;},
{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.996887207,&amp;nbsp; &amp;nbsp;0.9971923828
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;-1.999084473,&amp;nbsp; &amp;nbsp;0.9993286133
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}
};


第三步:
打开iir_coefs.h把MWSPT_NSEC替换成IIR_NSEC,
NL、DL数组删除掉,real32_T改成float ,
其中有一个#include &amp;quot;twmtypes.h&amp;quot;,不要它了,删掉
改完的文件如下:

#define IIR_NSEC 9
&amp;nbsp;&amp;nbsp;//原来叫做MWSPT_NSEC


const float IIR_B[IIR_NSEC][3] = {
&amp;nbsp;&amp;nbsp;//为什么改为float很明显了吧
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp; 0.8641357422,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;-2,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp; 0.9949035645,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.999938965,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
{
&amp;nbsp; &amp;nbsp; 0.9985351563,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp; -1.99987793,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;0.9996337891,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp; -1.99987793,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;1
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}
};
const float IIR_A[IIR_NSEC][3] = {
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.938049316,&amp;nbsp;&amp;nbsp;0.9401855469
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.989501953,&amp;nbsp;&amp;nbsp;0.9900512695
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.996887207,&amp;nbsp;&amp;nbsp;0.9971923828
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp;&amp;nbsp;-1.999084473,&amp;nbsp;&amp;nbsp;0.9993286133
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 1,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;}
};


保存文件,然后使用以下代码进行滤波
这段代码是根据Direct Form I 2阶IIR滤波的差分方程编写的
a0*y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] -a2*y[n-2];


#include &amp;quot;../platform.h&amp;quot;
//#include &amp;quot;iir_coefs.float.flat.h&amp;quot;
//#include &amp;quot;iir_coefs.float.sharp.h&amp;quot;
#include &amp;quot;iir_coefs_pass@2Hz_stop@0.8Hz.h&amp;quot;
#include &amp;quot;iir_filter.h&amp;quot;
static float y[IIR_NSEC][3];
static float x[IIR_NSEC+1][3];
//IIR_NSEC阶直接型II IIR滤波器
//IIR_NSEC个二阶biquad串联
int16 iir_filter(int16 in)
{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;uint16 i;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;x[0][0] = in;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;for(i=0;i&amp;lt;IIR_NSEC;i++)
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;y[0] = x[0]*IIR_B[0] +x[1]*IIR_B[1] +x[2]*IIR_B[2]-y[1]*IIR_A[1]-y[2]*IIR_A[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; y[0] = 0;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_B[0] == 1) y[0]+=x[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[0] == -1) y[0]-=x[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[0] == -2) y[0]=y[0]-x[0]-x[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[0] == 0);&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] += x[0]*IIR_B[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_B[1] == 1) y[0]+=x[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[1] == -1) y[0]-=x[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[1] == -2) y[0]=y[0]-x[1]-x[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[1] == 0);&amp;nbsp;&amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] += x[1]*IIR_B[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_B[2] == 1) y[0]+=x[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[2] == -1) y[0]-=x[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[2] == -2) y[0]=y[0]-x[2]-x[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_B[2] == 0);
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] += x[2]*IIR_B[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_A[1] == 1) y[0]-=y[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[1] == -1) y[0]+=y[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[1] == -2) y[0]=y[0]+y[1]+y[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[1] == 0);
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] -= y[1]*IIR_A[1];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_A[2] == 1) y[0]-=y[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[2] == -1) y[0]+=y[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[2] == -2) y[0]=y[0]+y[2]+y[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else if(IIR_A[2] == 0);
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; else y[0] -= y[2]*IIR_A[2];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(IIR_A[0] != 1) y[0] /= IIR_A[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; y[2]=y[1];y[1]=y[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; x[2]=x[1];x[1]=x[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; x[i+1][0] = y[0];
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if( x[IIR_NSEC][0]&amp;gt;32767)&amp;nbsp;&amp;nbsp;x[IIR_NSEC][0]=32767;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if( x[IIR_NSEC][0]&amp;lt;-32768) x[IIR_NSEC][0]=-32768;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;return&amp;nbsp;&amp;nbsp;((int16)x[IIR_NSEC][0]);&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
}
//复位滤波器
void iir_reset(void)
{
&amp;nbsp; &amp;nbsp; uint16 i,j;
&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;IIR_NSEC+1;i++)
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; for(j=0;j&amp;lt;3;j++)
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; x[j]=0;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp;
&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;IIR_NSEC;i++)
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; for(j=0;j&amp;lt;3;j++)
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; y[j]=0;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
}


//iir_filter.h
#ifndef _IIR_FILTER_H__
#define _IIR_FILTER_H__
int16 iir_filter(int16 x);
void iir_reset(void);
#endif


使用方法:
首先写好iir_coefs.h,然后调用iir_filter.c对数据流进行滤波
一个伪代码例子:
while(运行中)
{
保存到SD卡(iir_filter(读取ADC采样值()));
}

这个函数比STM32 DSP库中的函数要好很多,DSP库中的2个IIR滤波函数都不能连续处理数据流。
记得在开始滤波之前重置滤波器
iir_reset();




本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0