IIR滤波器因为其非线性相位,不稳定,设计复杂等缺点往往很少应用,但是在FPGA资源紧张或者需要一些特殊应用时,使用IIR滤波器就显得有必要了。但是网上除了杜勇老师的IIR滤波器教程之外,很少再有关于IIR滤波器的详细教程,杜勇老师的教程使用MATLAB的滤波器设计函数来设计IIR滤波器,然后自行编写HDL来实现IIR滤波器,这样虽然能清晰的了解IIR滤波器的具体实现方法和结构,但是却不便于快速设计,并且在面对阶数稍高的IIR滤波器时,设计就显得十分复杂。

因此本文总结了使用MATLAB的fdatool滤波器设计工具直接生成IIR滤波器的verilog模块代码的操作流程,演示了生成低通滤波器,去直流滤波器,峰值滤波器的操作过程,生成的代码无需任何修改可以直接综合,经过仿真和上板实测可以正常使用。

IIR滤波器的特点:

特点1:非线性相位

令一个理想方波通过一个IIR和FIR低通滤波器后:



上方是IIR滤波器滤波后的方波,可见明显的振铃效应,是方波的各个频率成分在通过滤波器后相位不一致导致的。

下方是FIR(滑动平均滤波器),可见方波的形状保持完好,只是边缘变缓。

特点2:不稳定,可能自激或者在某个频率不稳定

特点3:资源消耗少,同等滤波要求下,同样的全并行架构,IIR滤波器消耗的资源可能比FIR少10倍以上。

接下来以低通滤波器为例,讲解如何使用MATLAB的FDATOOL设计一个输入和输出都为12bit定点数的IIR滤波器,并且直接生成该滤波器的HDL(verilog)

第一步:设置基本滤波器参数



此处滤波器结构选择chevbyshev II型,这种结构的滤波器具有较快的转折速度(迅速截止),同时保证了通带内平缓,特点是阻带不平缓。

匹配方法选择完全匹配通带

频率选择归一化,通带边缘为0.05,阻带边缘为0.07,阻带抑制设置为50dB,对于一般的应用来说,50dB的抑制已经足够了,增加抑制比会增加滤波器阶数,增加资源消耗。

点击设计滤波器后,设计出一个9阶5节的IIR滤波器,其架构默认为直接II型架构。这里要选择转换为直接I型架构:



原因是在测试过程中,虽然直接II型消耗的硬件资源更少,但是直接II型对量化精度更加敏感,在同等量化精度下的滤波效果总是不如直接I型,所以此处选择直接I型。

第二步:量化滤波器



滤波器算法选择定点,系数字长选择13bit,这个13bit是逐渐尝试出来的,如果使用12bit及更低的量化位数,可以发现量化后的滤波器和原滤波器有较大差别,而如果选择更高的量化位数,对滤波器的精度没有明显改善,还会增加硬件资源消耗。



下一步选择输入输出的字长,此处也选择13bit,原因是在测试过程中,如果选择12bit,由于IIR滤波器的增益可能会大于1,导致在外部12bit满幅度数据输入时,滤波器输出范围就会大于12bit,此时滤波器一定会溢出,使滤波器输出结果完全错误,因此要把滤波器输入输出都设置为比外部输入的数据多1bit,这样即使外部输入12bit满幅度信号,对于滤波器来说也只是自身满幅度的一半,就避免了溢出的发生。

同时也要注意:“避免溢出”这个选项要取消勾选,然后设置输入输出的小数长度也和字长一样,也就是13bit,如果采用fdatool的默认设置,滤波器输出的位宽会不正确,可能会导致幅度过大或者过小,所以此处必须要全部手动设置。



对于滤波器内部选项的设置,这里也要全部进行手动修改而不能使用默认值,

对于舍入模式的设置,此处选择“向下”

乘积和累加模式默认为全精度,但是全精度太消耗硬件资源,此处选择保留MSB,乘积和累加字长设置为系数字长+输入字长=13bit+13bit=26bit,经过测试,这样设置在实际使用中不会发生溢出。

勾选在累加前转换信号

Num. state字长设置为和系数字长13bit相同即可

Den. state字长要比系数字长更长,此处设置为14bit即可(部分滤波器需要更长,例如椭圆滤波器此处要设置为比系数字长多3到6bit)

分子和分母小数长度都设置为系数长度13bit即可

设计完成后点击应用,然后查看滤波器是否稳定,幅频响应曲线是否和原滤波器相差太大,如果无误可以进行下一步。

溢出模式选择绕回,选择绕回模式不会额外消耗硬件资源,但是如果滤波器内发生溢出,输出滤波结果会完全错误,如果选择饱和,则会额外消耗硬件资源,但是可以保证在有少量溢出时输出结果不会受到大的影响。

第三步:生成滤波器HDL



点击目标(R)选择生成HDL



弹出窗口后,选择语言为verilog,设置滤波器模块名称和生成路径

Coefficient multipliers(乘法方法)有三个方法:

1:Factored-CSD 因子化移位乘加法,通过在系数的质因数上进行移位和加法运算来替代乘法运算,这种方法不消耗dsp资源,消耗的组合逻辑资源比CSD方法还要少,但是运行速度最慢。

2:CSD 普通的移位乘加法,不消耗dsp资源,消耗较多组合逻辑资源,运行速度较慢。

3:Multiplier 乘法器,在代码中直接使用*号来计算乘法,可能会被综合器直接综合为dsp块,会消耗dsp资源,消耗的组合逻辑资源最少,运行速度最快。

与FIR滤波器的对比:

采用同样的设计要求:使用等波纹法设计一个FIR滤波器如下:



可以看到在同样的设计要求下,FIR滤波器至少需要170阶才能达到与IIR滤波器同样的效果,而170阶滤波器在使用全并行架构实现时,至少需要170/2+1=86个DSP块才行。

实例2:生成去直流滤波器(高通滤波器)

需要滤除直流时,往往使用滑动平均高通滤波器(原始值减去滑动平均低通后的值就是高通滤波器结果),但是滑动平均滤波器虽然相比其它fir滤波器已经十分节省资源,但是在阶数较高时还是要消耗较多的ram资源用于缓存窗口数据,因此在不需要线性相位时,可以采用IIR滤波器来简单的达到滤除直流的效果,fdatool设置如下:



响应类型选择陷波,设计方法选择IIR梳状,指定阶数为2,这样刚好会在0频率和Nyquist频率处有零点,可以达到滤除直流的效果。

频率设定选择归一化,设置Q值为50,幅值设定里,设置Apass为0.1。Q值和Apass这两个参数影响的是滤波器的高通转折频率,可根据实际情况自行调整。

其余设置与上文的低通滤波器均相同。

设置完后生成滤波器,生成滤波器为2阶IIR滤波器,而观察其-3dB点,可得其归一化截止频率为0.0016,也就是说如果使用该滤波器进行音频去直流滤波,在44.1kHz采样率下,其截止频率为44.1kHz/2*0.0016=35Hz,已经完全足够使用。

而如果使用滑动平均高通滤波器,大约需要1024阶才能达到这个性能(滑动平均滤波器的截止频率为第一个零点频率的一半):



1024阶滑动平均高通滤波器的幅频响应曲线,可见-3dB点在0.014归一化频率左右。

实例3:生成单峰值滤波器

与陷波滤波器相对的就是峰值滤波器,而单峰值滤波器往往用于在频谱中筛选点频信号,也就是只取出一个频率分量,而抑制其它所有频率分量,可以视为带通滤波器的简化版本。

例如TI杯电赛2023年H题信号分离装置,想要无漂移的结果,最简单的方法就是滤波法:需要分别提取出两个叠加在一起的点频信号,此处使用单峰值滤波器再合适不过,因为单峰值滤波器很容易做到极其狭窄的频率响应,并且消耗的硬件资源极少,而其峰值点的频率和其工作的时钟频率有固定比例关系(这也是所有数字滤波器的特点),也就是说只要改变峰值滤波器的时钟频率,就能改变其峰值频率,从而能自由选择在频谱上筛选哪个频率。

Fdatool设置如下:



响应类型选择峰值,设计方法选择IIR单峰值。

频率设定选择归一化,设置峰值频率为0.1,设置Q值为150,幅值设定里,设置Apass为1。Q值和Apass这两个参数影响的是滤波器的“尖锐程度”,也就是选择性,可根据实际情况自行调整。

其余设置与上文相同,但是注意单峰值滤波器需要更高的量化精度,此处设置为16位如下。







设置完后生成滤波器,生成滤波器为2阶IIR滤波器,可以看到在0.1归一化频率处有峰值,在对数坐标下可能不太明显,设置为线性坐标并观察相位:



可见幅频响应非常尖锐,而相位响应在小于0.1归一化频率时为180deg,大于0.1归一化频率时为-180deg。

峰值滤波器和陷波滤波器一样只能由IIR滤波器实现,如果使用FIR滤波器搭建一个性能相近的带通滤波器,阶数需要达到几千,所需的硬件资源是不可承受的。

仿真结果:

对本文的三个IIR滤波器进行仿真,滤波器输入信号由dds产生频率递增的正弦波并且叠加一个直流分量。



Iir_lpf_o为低通滤波器输出,可见滤除了高频分量并且保留了直流分量

iir_remove_dc_o为去直流滤波器输出,滤除了直流,保留了高频分量

iir_signle_peak_o为单峰值滤波器输出,在一个频率点上的输出幅值最大

可见三个滤波器均工作良好。

综合后结果:

使用vivado2025.1,综合与实现策略均使用默认策略,在xc7z020上实现后的资源消耗如下:

其余未列出的资源消耗为0



可见滤波器均没有使用dsp资源,而是使用了较多的LUT资源。

提示:

滤波器级数太大并不会带来很高的收益,反而可能更加不稳定,所以如果生成的滤波器在测试的时候不稳定,可以尝试一下把阻带转折平缓一点,降低阻带抑制,或者提升Den. state字长(在滤波器量化面板的滤波器内部选项),可能会得到更好的效果。

Matlab生成的HDL代码中,组合逻辑链路很长,而且勾选了添加流水线也优化不了多少,所以运行频率很低,建议使用时不要超过50MHz时钟速率

写在最后:本文只是记录作者使用FDATOOL工具所总结出来的经验汇总,并没有经过严格的论证和证明,因此必然存在诸多错误和疏漏,还请见谅。

利用MATLAB的FDATOOL工具生成IIR滤波器的verilog代码的更多相关文章

  1. 根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码

    根据wsdl,apache cxf的wsdl2java工具生成客户端.服务端代码 apache cxf的wsdl2java工具的简单使用: 使用步骤如下: 一.下载apache cxf的包,如apac ...

  2. 利用代码生成工具生成基于ABP框架的代码

    在前面随笔,我介绍了整个ABP优化过框架的分层模型,包括尽量简化整个ABP框架的各个层的关系,以及纳入一些基类的辅助处理,使得我们对应业务分层类或者接口尽可能减少代码,并具有生产环境所需要的基类接口, ...

  3. 用JDK自带的工具生成客户端调用Webservice的代码

    JAVA下客户端调用Webservice代码简直是让人心生畏惧,今日尝试,做记录如下,参考网上的众多解决方案,下面这种方式是比较简单的. 在jdk的bin目录下有一个wsimport.exe的工具,使 ...

  4. javadoc 工具生成开发API文档

    =====================先来一点成就感===================== package com.springMybatis.dao; import com.springMy ...

  5. IIR滤波器设计(调用MATLAB IIR函数来实现)

    转载请注明文章来源 – http://blog.csdn.net/v_hyx ,请勿用于任何商业用途         对于滤波器设计,以前虽然学过相关的理论(现代数字信号处理和DSP设计),但一直不求 ...

  6. IIR滤波器软件实现(Matlab+C++)

    使用C++来写一个IIR滤波器 我们首先要在MATLAB中设计一个IIR滤波器,并生成一个头文件,这个头文件中反映了IIR滤波器的频率响应特性 理论支持 IIR滤波叫做递归滤波器,它是一种具有反馈的滤 ...

  7. 利用Matlab生成一个网格化的三维球面(生成直角坐标)

    利用Matlab生成一个网格化的三维球面,分别对径向方向.经度方向和纬度方向进行网格化,代码如下: %生成一个笛卡尔坐标系下球面网格的x,y,z坐标 %r为球面距离 %nJingdu,nWeidu分别 ...

  8. 【转】利用matlab生成随机数函数

    原文地址:利用matlab生成随机数函数 rand(n):生成0到1之间的n阶随机数方阵  rand(m,n):生成0到1之间的m×n的随机数矩阵 (现成的函数) betarnd:贝塔分布的随机数生成 ...

  9. C# 利用VS自带的WSDL工具生成WebService服务类

    C# 利用VS自带的WSDL工具生成WebService服务类   WebService有两种使用方式,一种是直接通过添加服务引用,另一种则是通过WSDL生成. 添加服务引用大家基本都用过,这里就不讲 ...

  10. 利用JDK自带工具keyTool生成安全证书

    前言:说一下最近做的工作,主要利用iText给网页中生成好的html报表转化为pdf格式的文件,并且在其中加入水印,数字签名等等,这部分主要介绍安全证书的目的就是为了做数字签名部分用的. 下面利用jd ...

随机推荐

  1. MySQL SQL语句书写顺序和执行顺序

    目录 SQL语句书写顺序和执行顺序 MySql执行顺序理解 实例 知识扩展 on和where的区别 limit 分页 结束语 Reference SQL语句书写顺序和执行顺序 (7) SELECT ( ...

  2. Fiddler破解钉钉禁止点赞 钉钉点赞一下转换1*10^7+个赞

    破解钉钉禁止点赞 点一下1*10^7+个赞 说明:本文未经授权禁止转载 紧急upd 3.14号之后无法点超过一个赞,所以修改数据包时(unlock.html)的数字无法设置那么大,只能设置为1.当然, ...

  3. 「Log」2023.8.11 小记

    序幕 从今天开始记小记. 七点到校了,先小摆一会,然后整理博客. 听 MiTiS 的电音,开始写题. \(\color{blueviolet}{P1829\ [国家集训队]\ Crash的数字表格\ ...

  4. 使用 TRL 训练Reward Model奖励模型

    训练过程 在此示例中,将微调"distilroberta-base"模型. 该formatting_func函数将指令与所选和拒绝的响应相结合,创建两个新字符串.这些字符串被标记化 ...

  5. 现在的AI工具还能写剧本杀了?

    本文由 ChatMoney团队出品 近年来,剧本杀作为一种新兴社交游戏,收到了越来越多人的喜爱,它不仅需要玩家们发挥自身演技,还需运用逻辑思维推理,分析所获得的线索,找出案件真凶.然而你是否想过,你在 ...

  6. Linux服务器开放端口号

    Linux服务器开放端口号(6379) 1.查看端口状态,比如redis 6379 firewall-cmd --zone=public --query-port=6379/tcp 2.如果是no-表 ...

  7. AI把任意文章生成ppt的工具

    讯飞智文 https://zhiwen.xfyun.cn/ 可以结合 https://notebooklm.google.com/ 把视频生成PPT

  8. 如何基于three.js(webgl)引擎架构,实现3D医院、3D园区导航,3D科室路径导航

    一.前言 在这个日新月异的科技时代,技术的价值不仅在于推动社会的进步,更在于如何更好地服务于人民.医院三维导航系统项目,正是技术服务于人民理念的生动体现,真正从患者出发,解决患者在复杂的医院园区找科室 ...

  9. Collections工具类详解

     Java提供了一个操作Set List Map 的工具类Collections . 里面有大量方法对集合元素进行排序,查询修改等操作. 还能把集合设为不可变. 对集合对象实现线程同步控制.同步控制 ...

  10. 你应该懂得AI大模型(十二)之 QLoRA

    一.显存和算力 1. 基本概念 显存 (Memory) 定义:GPU 用于临时存储数据的高速内存,类似于计算机的 RAM. 作用: 存储模型权重.中间激活值.梯度和优化器状态. 数据在显存与 GPU ...