FIR 低通滤波器 Verilog MATLAB 设计

名称:FIR 低通滤波器 Verilog MATLAB 设计

语言:Verilog

功能介绍

本设计实现一个 21 抽头线性相位 FIR 低通滤波器,采样频率为 100 kHz,通带截止频率为 20 kHz,阻带起始频率为 30 kHz。设计指标要求通带最大衰减不超过 1 dB、阻带衰减不低于 50 dB;MATLAB 设计结果的通带波动范围为 0.6484 dB、通带最大衰减为 0.3295 dB、阻带衰减为 53.7345 dB。 工程提供基础 FIR、对称系数优化及缩放饱和输出等 RTL 实现,并包含 MATLAB 系数设计与量化脚本,以及针对单音、通带、阻带和混合频率输入的仿真测试平台。对称版本利用 21 抽头系数的线性相位对称性,将样本成对相加后参与乘加;缩放版本则在 Q15 累加后进行算术右移,并将结果限制在 16 位有符号范围内。 设计流程覆盖滤波器指标建模、Q15 系数量化、RTL 定点实现和仿真检查。混合信号测试使用 10 kHz 通带分量与 35 kHz 阻带分量,便于检查滤波器对通带信号的保留能力和对阻带信号的抑制效果。

运行环境

硬件描述语言:Verilog。滤波器系数由 MATLAB 脚本设计并量化为 Q15 格式;仿真测试平台按项目提供的脚本与测试文件运行。

设计思路

设计采用线性相位 FIR 低通滤波器结构,目标指标为采样频率 100 kHz、通带截止频率 20 kHz、阻带起始频率 30 kHz,通带最大衰减不超过 1 dB、阻带衰减不低于 50 dB。MATLAB 使用 Parks-McClellan 等波纹方法搜索满足指标的最小阶数,得到 20 阶、21 抽头的滤波器;设计结果通带波动范围为 0.6484 dB,通带最大衰减为 0.3295 dB,阻带衰减为 53.7345 dB。 系数经 Q15 定点量化后写入 Verilog。RTL 通过移位寄存器保存输入采样历史,并对对称系数对应的样本先求和再乘系数,利用线性相位对称性减少乘法运算。累加结果保留为原始乘加值;另有缩放输出版本实现 Q15 右移恢复和 16 位饱和处理,适用于定点流式滤波。 验证方案通过仿真输入 10 kHz 通带正弦与 35 kHz 阻带正弦的叠加信号,观察滤波后通带分量保留、阻带分量抑制的情况,并在输入结束后补零冲洗延时线。

模块结构

设计由 MATLAB 系数设计脚本、FIR RTL 和仿真测试平台组成。RTL 顶层包括基础实现 `fir_top`、对称系数实现 `fir_top_symm` 和带 Q15 缩放及饱和输出的 `fir_top_scaled`。模块使用输入有效信号控制采样更新,通过移位寄存器保存历史数据,并以乘加累加形成滤波结果。测试平台覆盖基础、对称、单音、通带、阻带及混合频率场景。

演示视频

演示视频展示 FIR 低通滤波器的设计与仿真过程,包括通带与阻带混合信号输入及滤波输出效果。

仿真图/仿真说明/设计文档图片

仿真测试包含单音、通带、阻带及通带与阻带混合输入场景,并提供频率响应图、相位响应图和仿真结果文本,用于查看滤波器设计特性与测试输出。

FIR 低通滤波器 Verilog MATLAB 设计 设计文档图片 image1.png

FIR 低通滤波器 Verilog MATLAB 设计 设计文档图片 image2.png

FIR 低通滤波器 Verilog MATLAB 设计 设计文档图片 image3.png

FIR 低通滤波器 Verilog MATLAB 设计 设计文档图片 image4.png

FIR 低通滤波器 Verilog MATLAB 设计 设计文档图片 image5.png

部分代码

以下展示顶层模块 fir_top_symm 的部分代码,完整源码请下载压缩包查看。

module fir_top_symm #(
    parameter DATA_W = 16,     // 输入数据位宽
    parameter COEFF_W = 16,    // 系数位宽(Q15)
    parameter HALF_TAPS = 10,  // 对称系数对数,21 taps 时为 10 对
    parameter ACC_W = 40       // 累加器位宽
)(
    input  wire                         clk,        // 系统时钟
    input  wire                         rst_n,      // 低有效复位
    input  wire                         din_valid,  // 输入数据有效
    input  wire signed [DATA_W-1:0]     din,        // 输入采样数据
    output reg                          dout_valid, // 输出数据有效
    output reg  signed [ACC_W-1:0]      dout        // 原始乘加输出(未缩放)
);

    // 总抽头数固定为 21,对应当前设计结果
    localparam TAPS = 21;

    // 输入延时线
    reg signed [DATA_W-1:0] shift_reg [0:TAPS-1];

    // 仅保留前半部分对称系数
    reg signed [COEFF_W-1:0] coeff [0:HALF_TAPS-1];

    // 中心抽头系数(21 taps 为第 10 个)
    reg signed [COEFF_W-1:0] coeff_center;

    // 对称样本对相加结果,位宽比输入多 1 位以防止溢出
    reg signed [DATA_W:0] pair_sum;

    // 乘加累加器
    reg signed [ACC_W-1:0] acc;

    integer i;

    // 系数初始化
    // 利用线性相位 FIR 的对称性质,只需保存一半系数和中心系数
    initial begin
        coeff[0] = 16'sd197;
        coeff[1] = 16'sd130;
        coeff[2] = -16'sd578;
        coeff[3] = -16'sd883;
        coeff[4] = 16'sd403;
        coeff[5] = 16'sd1432;
        coeff[6] = -16'sd621;
        coeff[7] = -16'sd3096;
        coeff[8] = 16'sd661;
        coeff[9] = 16'sd10287;
        coeff_center = 16'sd15683;
    end

    // 对称优化版 FIR 主逻辑
    // 计算公式:
    // y[n] = h[10]*x[n-10] + Σ h[k]*(x[n-k] + x[n-20+k])
    // 这样可以把 21 个乘法器减少为 11 个乘法器
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            // 复位时清空延时线和输出
            for (i = 0; i < TAPS; i = i + 1)
                shift_reg[i] <= 'sd0;
            dout <= 'sd0;
            dout_valid <= 1'b0;
        end else begin
            if (din_valid) begin
                // 输入样本进入延时线
                shift_reg[0] <= din;
                for (i = 1; i < TAPS; i = i + 1)
                    shift_reg[i] <= shift_reg[i-1];

                // 先计算中心抽头贡献
                acc = shift_reg[10] * coeff_center;

                // 再计算对称样本对的乘加结果
                for (i = 0; i < HALF_TAPS; i = i + 1) begin
                    pair_sum = shift_reg[i] + shift_reg[TAPS-1-i];
                    acc = acc + pair_sum * coeff[i];
                end

                // 输出原始累加结果
                dout <= acc;
                dout_valid <= 1'b1;
            end else begin
                dout_valid <= 1'b0;
            end
        end
    end

endmodule

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » FIR 低通滤波器 Verilog MATLAB 设计

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员