FPGAVerilog设计FIR滤波器
FPGA/Verilog 设计FIR滤波器
⽂章⽬录
前⾔
这应该是第⼀次的FPGA(DSP⽅向)的实战(也算不上)分享.也算是⼩班教学的其中⼀节课吧.
话不多说,先给⼤家介绍⼀下这次要⼲啥先:学过信号与系统的可以直接跳过基础知识…
系统环境:
matlab2018a
quartus16.0
Multisim
VScode
ubuntu18.04
INTEL-EP4CE15F23C8
设计⽬标
设计⼀个10阶的FIR低通滤波器,滤波器的通带截⽌频率是2MHz,阻带截⽌频率是4MHz.
基础知识
数字滤波器
滤波器是⼀种对信号有处理作⽤的器件或电路,其主要作⽤是让有⽤信号尽可能⽆衰减地通过,对⽆⽤信号尽可能⼤地衰减.⽽数字滤波器就是⼀个按预定的有限精度算法实现的,将输⼊的数字信号转换为所要求的输出数字信号的线性时不变系统.
如果对上⾯加粗的莫得认识的话,那你就直接想成是⽤数字电路实现的滤波器得了.
FIR滤波器
FIR(Finite Impulse Response,FIR)滤波器,中⽂名叫有限冲激响应滤波器,在讲冲激响应之前,我们
不妨预习/回顾⼀下信号与系统:
就是⼀个输⼊信号,经过⼀个系统,每个系统会有他对应的系统函数来处理输⼊信号,最后得到输出信号.对常见的滤波器来说,他们的理想系统函数往往是这些:
1. 低通滤波器(红线部分),也是这篇blog要实现的东西
2. others
注意看横坐标,我们可以看到,输⼊信号是时域进来的,但是系统函数是频域来的.⽽他们的命名也是跟频率有关系的.这个时候我们就需要⽤到傅⾥叶变换了,⾄于详情,请看:
我们可以看到频域上的乘积就是时域上的卷积:
⽤Z变换来就是:
突然想起并不是在教DSP,所以我们了解到这⾥就够了,也就是说,我们只要把h(k)求出来,然后知道他可以有滤波的效果就完事了.
这⾥⽤的是FIR的横向结构:
我们可以看到主要有三个部分,第⼀部分是对输⼊信号的延时,第⼆部分是输⼊信号和抽头系数的相乘,第三部分是相乘结果的累加.这也是fpga 的基本结构假设
具体实现
matlab-获取FIR 抽头系数
y (n )=x (n )h (n )=h (k )x (n −k =0∑N k )
H (z )=h (n )z n =0∑N −1
−n
在matlab命令⾏窗⼝打⼊filterDesigner(善⽤tab键):
⼤家⼤概可以看见⾯板下⾯有很多东西,分别是:
1. 指定滤波器类型,是IIR还是FIR,⽤什么算法⽣成fprintf作用
2. 滤波器阶数,是特定阶数还是⾃动⽣成最⼩阶数的
3. 采样频率,信号频率,截⽌频率
4. 衰减倍数
当中的折衷关系不是这⾥的重点,根据设计要求,最后要改成这样:
记得按下⽅的design filter.
右上的图就是系统函数的形状了.
接下来点[file]->[Export]导出,快捷键ctrl+E,直接导出到workspace就可以了
然后在命令⾏窗⼝打:round(Num*512),意思是放⼤512倍并取整,⽅便我们后⾯在fpga中做定点数乘法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。