IIR滤波器的FPGA实现中出现直流分量(波形不停下移)问题的原因和解决方法

本文主要是介绍IIR滤波器的FPGA实现中出现直流分量(波形不停下移)问题的原因和解决方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      最近用FPGA实现一个带通IIR滤波器,采用matlab的fdatool设计得到滤波器的系数,然后根据杜勇的《数字滤波器的matlab与FPGA实现》中介绍的方法进行零点和极点系数量化,采用的结构是直接I型IIR滤波器。刚开始用modelsim进行的功能仿真得到的结果是这样的。

      刚开始看起来效果还可以,因为我只让它对2000个点滤波,这些点输入完后滤波就仿真就结束了。

      后来,放了一段时间后,对更多的点滤波,突然发现出问题了,如下图所示。

      滤波器还是原来的滤波器,系数也没变,滤的波也没变,只是长度加长了,但是可以看到滤波后的波形不停下移,像是滤波结果减了一个具体的数值一样。刚开始以为是对原始数据加长时用的粘贴复制,导致每段数据的开头的数据都是0,导致了这个问题,但是后来完美镶嵌后还是这样。

      后面把滤完波的数据送到matlab中

      蓝色虚线是原始混合信号,橙黄色实线是滤波后信号。   

      20Hz的200Hz的混合信号,带通滤完波后,200Hz的信号得到抑制,但是在0Hz附近出现了信号,也就是说带通滤波后出现了直流,也就导致了在modelsim中出现波形下移的情况。

     那么问题找了,如何解决呢?

     https://blog.csdn.net/hunterlew/article/details/50710129

     在这篇博客中,我发现了博主提到的一个问题和我的情况很相似

  我们最后的除法是用移位处理代替的,这样就存在一个问题,移位运算相当于MATLAB中的floor,也就是向下取整,此时就存在比较大的误差,于是我赶紧去测了下最开始两个相邻波形的峰值差,与极点系数非常接近,于是赶紧用四舍五入的方法试了下,FPGA的四舍五入方法见这里:http://bbs.21ic.com/icview-2626038-1-1.html

为了防止原网页丢失,这里给复制出来了,

floor, round和saturation是进行bit位削减时常用的方法,floor 和round用于削减低位,saturation用于削减高位。floor和round的区别在于,floor是将低位直接丢掉,而round则是在丢掉低位前先进行四舍五入。round和saturation的使用范例如下:

假设有一个32bit有符号数a[31:0], 其低10bit为小数部分,高22bit为整数部分。如果现在我们需要用一个16bit的整数来尽可能精确地表示a[31:0]。则需要截去全部的小数部分和高6位的整数部分,具体步骤如下:

step1. 用round去掉小数部分并进行四舍五入。

  1. assign add_bit          = a[31] ? (a[9] & (|a[8:0]) ) : a[9];
  2. assign temp[22:0] = {a[31],a[31:10]} + add_bit;

复制代码

分析:第一句判断是否需要进位。设要舍弃部分的值为d, (-1.0<d<1.0)。当a为正,即a[31] = 0时,若a[9]=1, 则说明d>0.5,故可以产生进位。当a为负,即a[31] = 1时,由于负数用补码表示,若直接舍弃d则意味着round up, 即向高位进位。然而,当0>d>-0.5时,不需要进位,而对于补码表示的负数而言,add_bit=1即表示不产生进行。另外,0>d>-0.5即a[9] & (|a[8:0]),因为 - 0.5的补码是10_0000_0000, d>-0.5即a[8:0]不全为0。考虑到四舍五入时可能产生进位,故需要扩展1bit的符号位。

step2. 用saturation去掉temp[22:0]的高7位从而得到16bit的最终结果。

  1. assign res[15:0] = (&temp[22:15]) | !(|temp[22:15]) ? temp[15:0] : {temp[22], {15 { !temp[22] } } }

复制代码

分析:首先判断temp[22:15]是否为全0或全1,若是,则说明其全部为符号位,我们只需要保留temp[15]作为符号位,其余高位bit可以直接丢掉。若temp[22:15]既不是全0又不是全1,则说明temp[22:15]包含数据位,即此时temp[22:0]的值已经超出了16bit有符号数所能表示的最大,此时必然会引入精度丢失问题,为了尽可能提高精度,只能将res[15:0]设置为其所能表示的最大值0x7FFF(temp[22] = 0)或0x8000(temp[22] = 1)。

 

     于是我根据自己的需要,对数据进行了四舍五入处理:

   之后进行了功能仿真,此时令人愉快的图形终于出来了,问题得到了解决

这篇关于IIR滤波器的FPGA实现中出现直流分量(波形不停下移)问题的原因和解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/289568

相关文章

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Go 1.23中Timer无buffer的实现方式详解

《Go1.23中Timer无buffer的实现方式详解》在Go1.23中,Timer的实现通常是通过time包提供的time.Timer类型来实现的,本文主要介绍了Go1.23中Timer无buff... 目录Timer 的基本实现无缓冲区的实现自定义无缓冲 Timer 实现更复杂的 Timer 实现总结在

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、