码迷,mamicode.com
首页 > 其他好文 > 详细

16阶iir带通滤波器的FPGA实现

时间:2017-09-22 22:33:14      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:expec   eal   ica   roc   区别   默认   sig   mat   const   

前言

基础知识:

什么叫滤波器?

简单的说,就像筛米,留下你需要的米,滤掉不需要的米头。过滤的功能。

技术分享

什么叫数字滤波器?

用数字芯片做的滤波器,而不是rc搭的,输入是离散的序列,输出也是离散的序列;

快速了解时域频域:

https://zhuanlan.zhihu.com/p/19763358?from=singlemessage&isappinstalled=1

什么叫时域?

信号随时间的变化。

技术分享

什么叫频域?

 技术分享

 

 曾经有个通俗的解释是:弹钢琴,琴键1234等表示的就是频域,产生的各种音乐就是时域,你以为的万变其实是永恒的不变。

什么叫fir与iir滤波器?

FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。

“递归滤波器”。递归滤波器,也就是IIR数字滤波器,顾名思义,具有反馈。 

fir和iir有啥区别?

 

fdatool中二阶节默认结构为:

技术分享

对于这个结构用图表示为:

技术分享

差分方程表示为:

技术分享

零极点表示为:零点就是差分方程的前面三项,极点就是后面两项。

技术分享

 

流程:

任务要求:

16阶二阶级联IIR数字滤波器设计,16bit有符号整数连续输入,采样率80khz,通带频率1k-8khz。

1.系数产生:通过matalb中的fdatool软件生成所需系数。(当然可以用各种函数生成,太难工科生表示要阵亡了,还是默默用fdatooll吧)

技术分享

技术分享

把需求放入fdatool中:生成的架构就是直接二型二阶节结构。

技术分享

 

技术分享

 零极点图:

技术分享

未量化的系数:

技术分享

未量化的系数导出:生成一个c文件。

技术分享

 技术分享

那么问题来了,这个c文件中的内容是啥子意思呢,一开始我也是一脸懵逼,而且网上的资料少之又少,文件如下所示,含义已注释:

  1 /*
  2  * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool
  3  *
  4  * Generated by MATLAB(R) 7.8 and the Signal Processing Toolbox 6.11.
  5  *
  6  * Generated on: 22-Sep-2017 20:23:35
  7  *
  8  */
  9 
 10 /*
 11  * Discrete-Time IIR Filter (real)
 12  * -------------------------------
 13  * Filter Structure    : Direct-Form II, Second-Order Sections
 14  * Number of Sections  : 8
 15  * Stable              : Yes
 16  * Linear Phase        : No
 17  */
 18 
 19 /* General type conversion for MATLAB generated C-code  */
 20 #include "tmwtypes.h"
 21 /* 
 22  * Expected path to tmwtypes.h 
 23  * D:\workfile\Matlab2009\extern\include\tmwtypes.h 
 24  */
 25 /*
 26  * Warning - Filter coefficients were truncated to fit specified data type.  
 27  *   The resulting response may not match generated theoretical response.
 28  *   Use the Filter Design & Analysis Tool to design accurate
 29  *   single-precision filter coefficients.
 30  */
 31 #define MWSPT_NSEC 17
 32 const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1 };
 33 //上面1313的玩意表示下面这个数组哪个项有效,1则表示第一项有效,3表示都有效;
 34 const real32_T NUM[MWSPT_NSEC][3] = {
 35   {
 36      0.1001105756,              0,              0  //第一个二阶节的增益;
 37   },
 38   {
 39                 1,   0.7806397676,              1 //第一个二阶节的零点;b0,b1,b2;
 40   },
 41   {
 42      0.1001105756,              0,              0 //第二个二阶节的增益;
 43   },
 44   {
 45                 1,   -1.999714136,              1 //第二个二阶节的零点;b0,b1,b2;
 46   },
 47   {
 48      0.3725369573,              0,              0 //以下就是类似的了;
 49   },
 50   {
 51                 1,  -0.9795594215,              1 
 52   },
 53   {
 54      0.3725369573,              0,              0 
 55   },
 56   {
 57                 1,    -1.99809742,              1 
 58   },
 59   {
 60      0.6452683806,              0,              0 
 61   },
 62   {
 63                 1,   -1.352879047,              1 
 64   },
 65   {
 66      0.6452683806,              0,              0 
 67   },
 68   {
 69                 1,   -1.996625185,              1 
 70   },
 71   {
 72      0.7896357179,              0,              0 
 73   },
 74   {
 75                 1,   -1.448690891,              1 
 76   },
 77   {
 78      0.7896357179,              0,              0 
 79   },
 80   {
 81                 1,   -1.995926261,              1 
 82   },
 83   {
 84                 1,              0,              0    //总的增益为1,上面8个分增益相乘最终为1;
 85   }
 86 };
 87 const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1 };
 88 const real32_T DEN[MWSPT_NSEC][3] = {
 89   {
 90                 1,              0,              0  //忽略项;
 91   },
 92   {
 93                 1,   -1.765431523,   0.8537048697 //第一个二阶节的极点;a0,a1,a2;
 94   },
 95   {
 96                 1,              0,              0 
 97   },
 98   {
 99                 1,   -1.893844962,    0.919323802  //以下类似;
100   },
101   {
102                 1,              0,              0 
103   },
104   {
105                 1,   -1.666594863,    0.877212882 
106   },
107   {
108                 1,              0,              0 
109   },
110   {
111                 1,   -1.959967136,   0.9707458019 
112   },
113   {
114                 1,              0,              0 
115   },
116   {
117                 1,   -1.614711642,   0.9346644878 
118   },
119   {
120                 1,              0,              0 
121   },
122   {
123                 1,   -1.982463837,   0.9896451831 
124   },
125   {
126                 1,              0,              0 
127   },
128   {
129                 1,   -1.603200555,   0.9806866646 
130   },
131   {
132                 1,              0,              0 
133   },
134   {
135                 1,   -1.991223216,   0.9973948002 
136   },
137   {
138                 1,              0,              0 
139   }
140 };

 

系数量化选项:系数量化你可以自己量化也可以让软件量化,不过它量化出来的数据零点并不是乘完增益后再进行量化的。最好还是乘完增益后再量化,所以还是自己用excel慢慢量化吧,眼泪掉下来。

技术分享

技术分享

 未量化excel表:

技术分享

excel中计算单元格方便到不行:零点乘完增益放大16384;极点直接放大16384;下图gain请无视。

新的b0=b0*gain1*16384;新的a0=a0*16384;放大16384倍方便FPGA实现除法截位。

技术分享

2.编码实现:

后续。

 

16阶iir带通滤波器的FPGA实现

标签:expec   eal   ica   roc   区别   默认   sig   mat   const   

原文地址:http://www.cnblogs.com/kingstacker/p/7577190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!