第四次作业——好像很容易的FIR滤波器

前奏一波

为什么说好像很容易呢?因为这个题是L老师出的 因为这个题很多前面复杂的步骤都已经给出了,比如滤波器的系数,本来是要用MATLAB生成的,但是因为是集成电路的竞赛,所以应该不涉及MATLAB的运用,所以直接给了,这就减少了很多工作量(尤其是考虑到本人是MATLAB渣渣,真的一点都不喜欢这个软件(因为当年dsp恶心到了?))然后,这个题就只剩下了设计一个滤波器。

而设计一个FIR滤波器,就比较好说了。网上一堆现成代码但是我还是自己写了,当然,接触新东西总要借鉴别人的嘛。

题目分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
而且给了这么多提示,好像也没什么可分析的,就是设计FIR滤波器。

FIR滤波器

FIR滤波器的全称是Finite Impulse Respond Filter。中文全称是有限脉冲响应滤波器,它也叫做非递归型滤波器。

它的作用和所有的滤波器一样,通过算法来使某刻的值处在一个更为准确的值,这句话看着很绕,但是在后面的三种算法的介绍中,应该可以理解我在这里说的这句话的含义。(它比‘通过算法来去除杂波’这句话,更清楚明白)。

实现数字滤波,就必须要有数字信号,所以这里要通过A/D转换,来使得模拟信号变为数值,才好带入算法中计算,然后用D/A转换,输出模拟信号。

FIR滤波器特点:

  • 没有反馈回路,稳定性强。即FIR滤波器只需要有当前数据,和历史输入数据,不需要历史滤波输出数据的参与(这是它与IIR最大的区别了,后面许多差别也就是因为这个而来的)。因为滤波的输出本来就是一个舍入值,若带入下一次的计算中,就会在这个舍入值(非精准值)基础上再一次的舍入,进行N次,会产生微小的寄生振荡。
  • 算法计算完成后与原先数据有线性的相位差,更容易将计算后的信号相位还原成原相位(通过左右平移的方式直接修正)。
  • 相对于IIR数字滤波器,在相同性能指标下,阶次(就是后面所说的N次选点)较高,对CPU的消耗更大。

关于原理的分析,感觉这个大佬分析的很到位:
https://www.cnblogs.com/Jamesjiang/p/8986632.html

还有这个:
https://blog.csdn.net/u014783685/article/details/74466107

我就是借鉴上面的代码,稍加改造做的。稍加改造的意思就是,因为老师给的系数足足有21个,直接写太麻烦了,我就改成了for循环。

初步结果

在这里插入图片描述
乍一看好像非常正确,可是看我标蓝的地方,吓一跳,数特别大啊。然后我就突然想起来题目里说的采样值和系数都是小数。

我抓紧去网上搜了搜verilog的小数运算,结果是Verilog的小数运算是定点运算,就是储存的时候是按照整数,计算结果出来的时候要自己手动“加上”小数点。

参考https://blog.csdn.net/maxwell2ic/article/details/81076475

但是,我有一个疑问,这里采样值是小数,绝对值小于1,但是又说系数都是十六位小数,这样的话,得到的乘法结果岂不是小于一,就算是加起来,也是小于一的(经过试验),这样的话,在结果后除以2^24得到的结果fir_out全都是0,因为小于一被取整了。

去问肥子同学结果他说,“啥小数?” ……好吧,明天再看看。

还有一个问题

突然发现FIR滤波器的系数是对称的,这样的话,就可以节省一半的乘法器,当时DSP学过的,但是我dsp学的太烂了(唉……)

一会儿再改

一个大佬做的FIR滤波器https://zhuanlan.zhihu.com/p/114436585

第二天

今天中午花了一中午在研究符号数上了……结果呢,没研究出来啥,反而是根本不需要考虑这个东西……

好吧,昨天的疑惑也得到了解答:

  • 关于小数的问题:不需要真的取小数,因为题目里说了是fir_out为九位有符号数,所以直接在得到的sum里面取前九位就可以了……是不是很简单……据肥子说,出来的fir_out的值只是参考而已,并不是真实的。我想是不是,就是小数位的数用整数表示了,毕竟modelsim总是直接把小数取整。
  • 关于FIR滤波器的对称问题:这个比较好改,就是n 和 20-n 合并相加再一起乘以系数。
  • 还有就是我发现,$signed()这个东西,必须括号里面是数,不能是等式,不然波形就像蝙蝠一样,太恐怖了,尤其是今年看来,超级恶心。

到这里可以说是结束了,波形对了!(早就对了),疑惑没了!
再放一次图!
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB与FPGA数字信号处理系列(6)——verilog实现并行FIR滤波器。在数字信号处理中,FIR滤波器是一种常用的滤波器类型,它可以通过对信号进行加权求和的方式来实现滤波操作。Verilog是一种硬件描述语言,可以用于FPGA的设计与实现。在这个系列中,我们将介绍如何使用Verilog语言在FPGA上实现并行FIR滤波器。 在Verilog中实现并行FIR滤波器的关键是将滤波操作并行化,以提高滤波器的运算速度。首先,我们需要将滤波器的系数转化为二进制形式,并存储在FPGA的寄存器中。然后,我们可以使用Verilog语言编写并行的加法器和乘法器模块,来对输入信号和滤波器系数进行并行运算。最后,将并行运算的结果进行累加,即可得到滤波器的输出信号。 在MATLAB中,我们可以通过FIR滤波器的设计工具箱来设计滤波器的系数,并将其导出为二进制文件。然后,我们可以使用Verilog语言编写FIR滤波器的硬件描述,包括并行加法器、乘法器和寄存器操作等。最后,我们可以使用FPGA开发工具将Verilog代码综合为FPGA可执行的比特流文件,用于加载到FPGA中进行并行FIR滤波器的实现。 通过这个方式,我们可以在FPGA上实现高性能的并行FIR滤波器,以满足对于实时性能要求较高的数字信号处理应用。这种并行实现方式能够充分利用FPGA的并行计算能力,提高FIR滤波器的运算速度,同时也为数字信号处理系统的设计与实现提供了一种有效的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值