前言
基础知识:
什么叫滤波器?
简单的说,就像筛米,留下你需要的米,滤掉不需要的米头。过滤的功能。
什么叫数字滤波器?
用数字芯片做的滤波器,而不是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.编码实现:
后续。