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

前言

基础知识:

什么叫滤波器?

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

什么叫数字滤波器?

用数字芯片做的滤波器,而不是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.编码实现:

后续。

时间: 2024-10-01 20:58:14

16阶iir带通滤波器的FPGA实现的相关文章

介绍一个高性能16串口转以太网模块(FPGA+W5500)

该网络转多串口模块可方便地实现网络设备与多个串口设备之间数据的透明传输. 这个方案采用的是FPGA+W5500.串口部分利用串口数据收发硬件加速器,充分利用Buff及FiFO资源,从而极大程度上的提高了16串口的数据调度能力.与此同时,网络部分采用ToE技术的W5500,从而极大程度上的降低了系统中断及数据收发资源损耗,节省系统资源.使得网络吞吐表现力非常突出. 简而言之,这个方案很好的结合了这两项技术,无论是串口还是网口的性能都得以最大化的体现.为客户提供了一个高效的多串口转网络方案.16串口

iir调试记录

1.目的 实现采样率fs=50MHz,通带为5MHz~15MHz,阻带衰减60dB的IIR带通滤波器 2.方案 采取直接型 3.详细设计 (1)确定滤波器的系数,系数和滤波器输出量化位宽 先根据要求的fs,fc1,fc2以及阻带衰减确定系数,当初如果设置截止频率f1=5MHz,f2 = 15MHz,实际的截止频率差很多,如图1.因此修改为f1 = 2.6MHz和f2 = 19.3MHz就能满足真正的通带为5MHz~15MHz,如图2满足要求后,再对系数量化.一定要确定好系数和输出数据的位宽,不满

转载论文关于fir滤波器的fpga实现

摘 要 本文讨论的FIR滤波器因其具有严格的线性相位特性而得到广泛的应用.在工程实践中,往往要求信号处理具有实时性和灵活性,本论文研究FIR的FPGA解决方案正体现了电子系统的微型化和单片化. 本论文主要讨论了以下的问题: 首先,以FIR滤波器的基本理论为依据,研究适应工程实际的数字滤波器的设计方法,确定了直接型网络结构.窗函数设计法的设计方案: 然后,讨论了FPGA的原理与结构特点,总结FPGA的设计流程与设计原则,并用Verilog HDL语言根据设计方案编写出FIR滤波器程序: 接着,采用

数字电路设计中DSP和FPGA的比较与选择

博主研究生所在的实验室是搞雷达的,项目所涉及的板卡都是DSP+FPGA架构的,至于原因,只知道FPGA是并行的,用来处理速度要求高,运算结构简单的大数据量过程或算法,比如接收处理天线各阵元采样的初始数据等:DSP是顺序的,用来处理数据量较低但运算量较大的算法,比如DBF算法.矩阵求逆算法等.看了下面的文章,有了更全面的理解. 原文地址:http://www.chinaaet.com/article/index.aspx?id=13921 摘  要: DSP和FPGA是目前数字电路设计采用的两种主

微弱信号二次谐波检测的FPGA的实现-总结

首先还是把握大的系统框架: 我要实现的部分不包括DA以及AD的转换,主要是将SSP接收到的数据送入到FIFO中,然后经过FIR带通滤波器的处理后对该信号计算幅值并做PSD,然后处理的信号经过积分够一方面送入到FIFO一方面进行均值滤波(实际上就是在一定的积分门时间内做累加操作).最后结果通过通信模块RS232 送入到上位机,此外信号源2经过缓冲放大然后AD转换后送入到FIFO,也是通过RS232送入到上位机. 二次谐波幅值计算 先计算二次谐波幅值. 二次谐波的计算主要利用的是正余弦信号的周期性:

【小梅哥FPGA进阶学习之旅】基于Altera FPGA 的DDR2+千兆以太网电路设计

DDR2电路设计 在高速大数据的应用中,高速大容量缓存是必不可少的硬件.当前在FPGA系统中使用较为广泛的高速大容量存储器有经典速度较低的单数据速率的SDRAM存储器,以及速度较高的双速率DDR.DDR2.DDR3型SDRAM存储器,DDR系列的存储器都需要FPGA芯片有对应的硬件电路结构支持.对于Altera Cyclone IV系列的FPGA,其最高支持到DDR2存储器(不支持DDR3存储器,到了Cyclone V系列的FPGA才支持DDR3存储器).芯航线AC6102开发板作为一个高速应用

转载 iir直接i型和直接ii型滤波器

1.IIR滤波器构造 之前在介绍FIR滤波器的时候,我们提到过,IIR滤波器的单位冲击响应是无限的!用差分方程来表达一个滤波器,应该是下式这个样子的. 这个式子是N次差分方程的表达式.我们明显可以看出,计算输出y(n)的时候,需要以前的输出值与输入值.换言之,这个可能表达式还有反馈环节.当为0的时候,这个滤波器由于没有反馈,其单位冲击响应是有限的,是FIR滤波器.当不为0是时候,是IIR滤波器. 2.直接I型IIR滤波器 就如同之前所说一样,我们考虑这样一个滤波器. 很明显,这是一个1阶才差分方

基于Matlab中FDATool工具箱的滤波器设计及相关文件的生成

一.摘要 除了采用编程的方法实现滤波器之外,Mat l ab中自带工具箱FDATool 也能很方便快速的实现滤波器的设计.另外FPGA.DS P等实现数字滤波器算法时,经常要用到滤波器系数,采用FDATool 工具箱也能快速的得到滤波器系数.二.实验平台 Matlab7.1三.实现步骤3.1 滤波器指标若需要设计一个16阶的FIR滤波器(h(0)=0),给定的参数如下:(1) 低通滤波器(2) 采样频率Fs 为48kHz ,滤波器Fc为10.8kHz(3) 输入序列位宽为9位(最高位为符号位)在

Markdown 指南

Markdown 是一种轻量级的「标记语言」,使用用特殊的 Markdown 文档处理器将 Markdown 语法翻译成预设的文档格式.标题大小等,一般用于展示时输出的是 HTML.这个教程可以让使用 Markdown 的新手快速熟悉语法和快捷键.本文基于 Ghost 的 Markdown 指南,兼容标准版 Markdown 编辑器和 Github Flavored Markdown. NOTE: 虽然 Markdown 标记语言不能够实现 HTML 语法上的全部功能,但你可以混合使用 HTML