本帖最后由 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
|