热搜词

FPGA之FIR滤波器

发表于 2024-9-19 01:27:13 | 显示全部楼层 |阅读模式
43 0
本帖最后由 CholeShan 于 2024-10-8 15:20 编辑

  在FPGA上设计FIR滤波器是一个涉及数字信号处理的常见任务。FIR滤波器因其简单且易于实现的特性,在许多应用中都非常有用。

  FIR滤波器的实质就是输入序列与系统脉冲响应的卷积,即:



  其中,N为滤波器的阶数,也即抽头数;x(n)为第n个输入序列;h(n)为FIR滤波器的第n级抽头系数。
  FIR滤波器基本结构如下:


(这里乘上z^-1相当于给x(n)延迟了1个时钟周期)

  用FPGA实现FRI滤波器的两种结构
1、串行结构

  串行结构的FIR滤波器需要非常多的时钟周期才能获得一个序列值得滤波结果,因此处理速度非常慢,适用于滤波阶数比较低或者处理速度要求低的场景。


2、并行结构


  在串行结构的基础上,增加乘法器和加法器的数量,得到并行的FIR滤波器结构如下,可以同时进行多个系数的乘法和加法运算,增快FIR运算速度。由于FIR滤波器系数h(n)具有对称性,即h(N-1)=h(0),因此可以先进行1次加法,再进行乘法运算,最后再将所有的乘法运算结果进行相加,这样可以减少乘法器一半的使用数量。

  以下为一个5阶FIR滤波器的例子,假设已知抽头系数且系数对称:

//verilog
module fir_filter_5th_order (   
input wire clk,   
input wire rst_n,   
input wire signed [15:0] x, // 假设输入信号是16位的   
output reg signed [31:0] y );

    parameter COEFF0 = 16'd1; // 示例系数
    parameter COEFF1 = 16'd2;
    parameter COEFF2 = 16'd3;

    reg signed [15:0] data0, data1, data2, data3, data4;

    always @(posedge clk or negedge rst_n) begin   
        if (!rst_n) begin        
            data0 <= 0;        
            data1 <= 0;        
            data2 <= 0;        
            data3 <= 0;        
            data4 <= 0;        
            y <= 0;   
        end
        else begin        
            data4 <= data3;        
            data3 <= data2;        
            data2 <= data1;        
            data1 <= data0;        
            data0 <= x;

            y <= ({{16{data0[15]}},data0} + {{16{data4[15]}},data4}) * COEFF0 +({{16{data1[15]}},data1} + {{16{data3[15]}},data3}) * COEFF1 +{{16{data1[15]}},data1} * COEFF2;   
        end
    end
endmodule


全部评论

暂无评论,期待您打破宁静

您需要登录后才可以回帖 登录 | 立即注册
发表评论
发布