大侠好,欢迎来到 FPGA 技术江湖,江湖偌大,相见即是缘分。大侠可以关注 FPGA 技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。“煮酒言欢”进入 IC 技术圈,这里有近 100 个 IC 技术公众号。
今天和大侠简单聊一聊基于 matlab FPGA verilog 的 FIR 滤波器设计,话不多说,上货。
本次设计实现 8 阶滤波器,9 个系数,由于系数的对称性,h(0)=h(8),h1(1)=h(7),h(2)=h(6),h(3)=h(5),h(4)为中间单独一个系数。根据公式:
实现框图:
推导出当系数 N 为偶数时,例如 N=4:y(n)=h(0)*{x(0)+x(n-3)}+h(1)*{x(n-1)+x(n-2)}
当系数 N 为奇数时,例如 N=5:
y(n)=h(0)*{x(0)+x(n-1)}+h(1)*{x(n-1)+x(n-3)}+h(2)*x(n-2)
1、用 matlab 生成和量化滤波器系数
设置参数后,点击“Design Filter”按钮,“file”—“export”,把滤波器系数导出到 workspace,如下图:
执行命令:Num=Num’ ,把滤波器系数拷贝到文件 COFFICIENT.dat中。
量化系数:在 matlab 中运行 quantization.m
2、说明
用 matlab 程序 sin_1MHz_gen.m 生成正弦波波形表,改变变量 f0 = 1.5e6 可以生成不同频率的波形。把第一个周期的波形数据存入signal_1m.dat 文件中,存入的数据个数为 Fs/Fo 的最小正整数之比的分子,比如 Fs=25MHz,Fo=0.3MHz,Fs/Fo=250/3(Fs=25/24MHz),则存入文件 signal_1m.dat 的波形数据个数为开头的 250 个数据。相应的 signal_gen0.v 中的语句 if(i0<50)相应的改为 if(i0<250)。仿真时 signal_1m.dat 放在仿真目录下
3、滤波器的 multisim 仿真
运行 matlab,用 sin_1MHz_gen.m 产生 5MHz(f0 =5e6)正弦波信号,Fs/Fo=5,把数据 hex_sin_data 的前 5 个数据存入 signal_1m.dat 文件,相应的 signal_gen0.v 中的语句 if(i0<50)相应的改为 if(i0<5)。
仿真的波形如下图(fir 滤波器的输入输出信号):
运行 matlab,用 sin_1MHz_gen.m 产生 1MHz(f0 =1e6)正弦波信号,Fs/Fo=25,把数据 hex_sin_data 的前 5 个数据存入 signal_1m.dat 文件,相应的 signal_gen0.v 中的语句 if(i0<5)相应的改为 if(i0<25)。
仿真的波形如下图(fir 滤波器的输入输出信号):
由此可见 FIR 对带外信号起到衰减的作用。
部分代码:
END
作者:The last one
来源:FPGA技术江湖
相关文章推荐
- 一篇文章搞懂软核(MicroBlaze)的固化和启动
- 很能体现 FPGA 硬件思维的一道面试题
- 基于 FPGA 及深度学习的人脸检测系统设计
- 多平台 FPGA 工程快速移植与构建
- 开源 ISP(Infinite-ISP)介绍
更多 FPGA 干货请关注 FPGA 的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。