matlab IIr C语言实现

第一步:
点击菜单中的Edit->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 -> 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 "tmwtypes.h"
/* 
* 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 & 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 "twmtypes.h",不要它了,删掉
改完的文件如下:
#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];
//iir_filter.c
#include "datatype.h"
#include "iir_filter.h"
#include "iir_coefs.h"
static float y[IIR_NSEC][3];
static float x[IIR_NSEC+1][3];
int16 iir_filter(int16 in)
{
      uint16 i;
      x[0][0] = in;
      for(i=0;i<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] /= 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]>32767)  x[IIR_NSEC][0]=32767;
      if( x[IIR_NSEC][0]<-32768) x[IIR_NSEC][0]=-32768;
      return  ((int16)x[IIR_NSEC][0]);   
   
}
//复位滤波器
void iir_reset(void)
{
    uint16 i,j;
    for(i=0;i<IIR_NSEC+1;i++)
    {
      for(j=0;j<3;j++)
      {
          x[j]=0;
      }
    }
  
    for(i=0;i<IIR_NSEC;i++)
    {
      for(j=0;j<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();
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,针对你的问题,我可以给你一些关于 MatlabIIR 滤波器实现的基本内容和步骤。 IIR 滤波器是一种基于反馈的滤波器,具有实现简单、计算效率高等特点,广泛应用于信号处理领域。在 Matlab 中,可以使用 Simulink 仿真和 C 语言实现 IIR 滤波器。 Simulink 仿真实现: 1. 打开 Matlab 软件,在命令窗口输入 simulink 打开 Simulink 窗口。 2. 在 Simulink 窗口中,选择 Simulink 库中的 Signal Processing Toolbox,找到 IIR Filter 模块,并将其拖放到 Simulink 窗口中。 3. 在 IIR Filter 模块的参数设置中,设置滤波器类型、采样率、通带截止频率、阻带截止频率等参数。也可以在窗口中输入滤波器的传递函数或差分方程。 4. 在输入信号和输出信号之间连接信号线。 5. 点击运行按钮即可进行仿真。 C 语言实现: 1. 打开 Matlab 软件,在命令窗口输入 filterDesigner 打开滤波器设计工具。 2. 在滤波器设计工具中,选择 IIR 滤波器类型,并设置滤波器的参数,例如通带截止频率、阻带截止频率、通带最大衰减等。 3. 点击 Generate Code 按钮生成 C 语言代码。 4. 将生成的代码复制到一个 C 语言项目中,并添加必要的头文件和库文件。 5. 在项目中输入需要滤波的数据,并调用 IIR 滤波器函数实现滤波。 以上就是 MatlabIIR 滤波器的 Simulink 仿真和 C 语言实现的基本步骤,希望能对你有所帮助。如果你还有其他问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值