该篇是FPGA数字信号处理的第六篇,2-5篇介绍了DSP系统中极其常用的FIR滤波器。本文将简单介绍另一种数字滤波器——IIR滤波器的原理,详细介绍使用Verilog HDL设计直接型IIR滤波器的方法,下一篇会介绍如何用Verilog HDL设计级联型IIR滤波器。

数字滤波器

数字滤波器从实现结构上划分,有FIR和IIR两种。FIR的特点是:线性相位、消耗资源多;IIR的特点是:非线性相位、消耗资源少。由于FIR系统的线性相位特点,设计中绝大多数情况都采用FIR滤波器。

线性相位系统的意义,这里的线性相位指的是在设计者关心的通带范围内,LTI系统满足线性相位要求:
(1)从延时的角度看:保证了输入信号的相位响应是线性的,即保证了输入信号的延时特性。
(2)从相位的角度看:输入的各频率成分的信号之间,相对相位是固定的。通过线性相位系统后,相对相位关系保持不变。

对于关心相位的系统,比如调制解调系统,需要使用FIR滤波器;对于只关心频率成分的系统,比如只是提取某一频率分量,为了节省资源,使用IIR滤波器即可。

IIR滤波器

IIR滤波器的系统函数与差分方程如下所示:

由差分方程可知IIR滤波器存在反馈,因此在FPGA设计时要考虑到有限字长效应带来的影响。差分方程中包括两个部分:输入信号x(n)的M节延时网络,相当于FIR的网络结构,实现系统的零点;输出信号y(n)的N节延时网络,作为系统的反馈,实现系统的极点。

直接由差分方程得到的IIR滤波器称为直接I型结构,如下图所示,左边为零点部分,右边为极点部分:

如果由IIR的系统函数出发,视作两个系统的级联,并且合并公共的延时支路,得到的IIR滤波器称为直接II型结构,如下图所示:

很明显,直接I型结构需要2N个延时单元;直接II型结构仅需要N个延时单元,使用FPGA设计时采用直接II型结构可以节省一些资源。IIR滤波器还有级联型和并联型两种结构,在下一篇的设计中再做介绍。

IIR滤波器在本质上是以模拟滤波器的设计理论为基础的,包括巴特沃斯滤波器、切比雪夫滤波器(I型和II型)、椭圆滤波器等。先设计好模拟滤波器,然后按一定的规则转换成数字滤波器,这种设计方法称为“原型转换设计法”,另外还有“直接设计法”。这两种方法都很繁琐,因此在工程中会借助MATLAB工具来设计IIR滤波器。

MATLAB设计

MATLAB提供了基于原型转换设计法的butter、cheby1、cheby2、ellip函数,分别对应巴特沃斯滤波器、切比雪夫I型/II型滤波器、椭圆滤波器;在频域采用最小均方法设计的yulewalk函数;以及两个应用程序包“Filter Builder”和“Filter Design&Analysis”,后者通常也被称作FDATOOL。现在最受欢迎的设计方式恐怕就是使用FDATOOL工具,功能强大、界面便捷。之前用于设计FIR滤波器,这两个工具也可以用于设计IIR滤波器。

本系列主要是讲述FPGA设计,不详细讨论上述函数及工具的使用,具体情况可以的MATLAB的help中查询。(Ps:博主目前的几个系列都处于开篇阶段,篇幅不多,暂未成体系,目前不再开新坑,等后期应该会出一个“MATLAB数字信号处理系列”)

FPGA设计

从MATLAB到FPGA最重要的工作便是滤波器系数的量化。在MATLAB中将滤波器系数量化为指定位宽,会改变滤波器的频率特性,尤其IIR滤波器存在反馈结构,量化效应和运算时的有限字长效应的影响比FIR滤波器大很多,因此需要做好仿真,确定量化后的系数也能满足IIR的设计需求。

设计一个切比雪夫II型滤波器cheby(7,60,0.5),进行12bit量化,量化前和量化后的系数如下表所示:

使用MATLAB多设计几个滤波器,就会发现一定的规律:(1).b和a两个向量的长度相同。(2).向量b(输入信号x(n)的延迟)具有对称性。(3).向量a的第一个元素总为1,即y(n)的系数总是1。

值得注意的是,量化后的向量Qa的第一个元素已经不是1,即y(n)多了一个加权系数。IIR中存在反馈结构,输出部分应该除掉这个加权系数,才能保证后续的计算正确。参考IIR滤波器的差分方程和直接I型结构,FPGA整体设计框图如下图所示:

Verilog HDL设计

由于IIR滤波器在DSP系统中不常用,Quartus和Vivado都没有提供相关的IP核,因此只能自己进行Verilog设计。本文设计参考自杜勇老师的《数字滤波器的MATLAB与FPGA实现》。本设计将在Vivado环境下完成并仿真。

零点系数部分可以完全视作一个FIR滤波器结构,设计接口与代码完全相同;极点系数部分也可以视作一个FIR滤波器结构,区别在于:(1).对反馈回来的信号y(n)做延迟;(2).系数不对称,不能利用对称性减少乘法器。

上述两个模块设计可以参考“FPGA数字信号处理(二)并行FIR滤波器Verilog设计” https://blog.csdn.net/fpgadesigner/article/details/80594627,也可以下载文末的工程,本文不再赘述。

顶层模块实例化零点和极点两个子模块,并按照设计框图设计减法器和除法器,完成IIR滤波数据的反馈和输出:

`timescale 1ns/1ps
//-------------------------------------------------------
//   IIR滤波器顶层模块
//-------------------------------------------------------
module DirectIIR_liuqi
(input rst,                 //高电平有效复位信号input clk,                 //系统时钟2kHzinput signed [11:0] Din,   //采样数据输入2kHzoutput signed [11:0] Dout  //IIR滤波输出
);//-------------------------------------------------------
//   实例化零点系数模块、极点系数模块
//-------------------------------------------------------
wire signed [20:0] Xout;
wire signed [11:0] Yin;
wire signed [25:0] Yout;zero U0
(.rst   (rst),             .clk   (clk),              .Xin   (Din),  .Xout  (Xout)
);pole U1
(.rst   (rst),             .clk   (clk),              .Yin   (Yin),  .Yout  (Yout)
);//-------------------------------------------------------
//   反馈结构,右移实现除法
//-------------------------------------------------------
wire signed [25:0] Ysum = {{5{Xout[20]}},Xout} - Yout; //减法器
wire signed [25:0] Ydiv = {{9{Ysum[25]}},Ysum[25:9]};  //除法器
assign Yin = rst ? 'd0 : Ydiv[11:0];   //反馈
assign Dout = Yin;  //输出endmodule

输出部分需要进行截取,截取时可以先进行仿真,只保留一位符号位即可。综合没有问题之后,打开Vivado中的RTL ANALYSIS,直接型IIR滤波器系统原理图如下所示,与预期设计相同:

仿真与工程下载

使用MATLAB生成一个200khz+800kHz的混合频率信号,写入txt文件。编写Testbench读取txt文件对信号滤波,文件操作方法参考“Testbench编写指南(一)文件的读写操作”https://blog.csdn.net/fpgadesigner/article/details/80470972。

对正弦信号的滤波如下图所示:

明显看到经过500Hz低通滤波器滤波后,输入的200+800Hz信号只剩下200Hz的频率分量。
完整的Vivado工程(含testbench仿真)可以在这里下载:https://download.csdn.net/download/fpgadesigner/10471904

FPGA数字信号处理(六)直接型IIR滤波器Verilog设计相关推荐

  1. FPGA数字信号处理(七)级联型IIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第七篇,上一篇介绍了直接型IIR滤波器的原理,详细介绍使用Verilog HDL设计直接型IIR滤波器的方法.本文会介绍如何用Verilog HDL设计级联型IIR滤波器. ...

  2. FPGADesigner《FPGA数字信号处理系列》目录与传送门

    FPGA数字信号处理(1)数字混频(NCO与DDS的使用): https://blog.csdn.net/fpgadesigner/article/details/80512067 FPGA数字信号处 ...

  3. FPGA数字信号处理(十六)单级CIC滤波器Verilog设计

    该篇是FPGA数字信号处理的第16篇,选题为多速率信号处理系统中常用的CIC滤波器.本文将详细介绍使用Verilog HDL设计单级CIC滤波器的方法.接下来几篇会介绍多级CIC滤波器的Verilog ...

  4. FPGA数字信号处理(二)并行FIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第二篇,选题为DSP系统中极其常用的FIR滤波器.本文将简单介绍FIR滤波器的原理,详细介绍使用Verilog HDL设计并行FIR滤波器的流程和方法.接下来几篇会介绍串行 ...

  5. FPGA数字信号处理(三)串行FIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第三篇,选题为DSP系统中极其常用的FIR滤波器.本文将在上一篇"FPGA数字信号处理(二)并行FIR滤波器Verilog设计" https://blo ...

  6. FPGA数字信号处理(20)单级半带(HB)滤波器设计

    本篇是FPGA数字信号处理的第20篇,前面介绍了多速率信号处理系统中用到的多速率FIR滤波器.CIC滤波器,本文将介绍另一种常用的半带滤波器(Half-Band Filter)的相关知识及设计方法.本 ...

  7. FPGA数字信号处理(十五)多速率FIR滤波器

    该篇是FPGA数字信号处理的第15篇,选题为多速率信号处理系统中用到的多速率FIR滤波器.本文将简单介绍多速率信号处理系统的基本概念,以及使用Quartus和Vivado的IP核设计多速率FIR滤波器 ...

  8. FPGA数字信号处理(21)多级半带(HB)滤波器设计

    本篇是FPGA数字信号处理的第21篇,上一篇介绍了半带滤波器的相关知识以及单级半带滤波器的设计方法.单级半带滤波器只能实现2倍抽取,本文将介绍可实现2^N倍抽取的多级半带滤波器的设计方法. 多级半带滤 ...

  9. 数字信号处理(六)IIR数字滤波器的设计

    文章目录 数字滤波器 数字滤波器技术指标 数字低通滤波器的幅频响应曲线 IIR滤波器设计方法 IIR滤波器的函数模型设计法(间接法) 模拟低通滤波器的技术指标 模拟滤波器原型介绍 1.巴特沃斯模拟低通 ...

最新文章

  1. 内存缓存LruCache的简单使用
  2. Day 1 AR认知课 || AIRX三次方
  3. maven中snapshot快照库与maven-metadata.xml
  4. 微软白皮书发布:在IIS7.5中用Service Bus端点寄宿WCF服务
  5. smarty模板引擎
  6. Double值保留两位小数的四种方法
  7. 基于16QAM调制的OFDM系统仿真实现(MATLAB)
  8. 揭秘InputFormat:掌控Map Reduce任务执行的利器
  9. Unix编程之size_t、ssize_t
  10. 【毕设狗】【单片机毕业设计】基于单片机的空气质量检测-实物设计
  11. 统计数字liuseroj.picp.io
  12. 为什么人需要一个人静静--《孤独力》的读后感
  13. 非淡泊无以明志,非宁静无以致远
  14. 如何将拉勾网(智联招聘)的预览简历导出来
  15. 视觉设计中发现的11种光学错觉
  16. python中的命令,python学习——python中命令行
  17. ILog项目开发流程【一】
  18. 使用Python爬取网页图片
  19. css线性渐变linear-gradient 参数讲解以及示例
  20. 【大屏设计】数据大屏间距那点事-距离产生美

热门文章

  1. 深度复盘手机三雄:苹果、小米、华为,为何5G最后留下来的会是华为?
  2. 统计分析---多重共线性
  3. 银河系计算机运算,9个月漫长运算 计算机首次模拟银河系
  4. 北京银行聚焦零售转型 多点发力助推“京彩”缤纷
  5. ygbook和ptcms哪个好_杰奇CMS 和 PTCMS 有什么区别? 为什么很多人选择杰奇?
  6. 针对星空极速拨号无法宽带共享的解决方案
  7. 如何制作营养膳食计算器_如何创建随机膳食生成器
  8. Cannot open D:\XXX\XXX\venv\Scripts\pip-script.py
  9. 天气预报+老婆私人订制服务
  10. 互相关函数实现(c语言完整工程,利用cmake编译)