matlab生成c使用自定义头文件,C语言使用matlab生成的滤波器头文件

matlab的fdatool是好东西,不过很多人不知道该怎么使用它生成的C头文件。 这里有个fdatool设计的IIR高通滤波器,采样率400Hz时截止频率1Hz。 设计定型之后,要做些调整。 以下说明中的英文名词有些可能对不上fdatool界面上的原文,请大家意会吧 第一步: 点击菜单中的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;i32767)  x[IIR_NSEC][0]=32767;       if( x[IIR_NSEC][0]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值