张春 发表于 2024-9-10 12:24:41

【FPGA数字信号处置惩罚】- FIR串行滤波器

理解和把握 FIR 串行滤波器是踏入数字信号处置惩罚领域的重要一步。
那么,什么是 FIR 串行滤波器?它是如何工作的?又有着怎样的神奇之处呢?让我们一起揭开它的神秘面纱。
一、FIR 滤波器简介

FIR 滤波器,全称为有限脉冲响应(Finite Impulse Response)滤波器,是数字信号处置惩罚体系中最基本的元件之一。
https://img-blog.csdnimg.cn/fcec021ef4674ed78106ea128b57fd39.jpg​
 与其他滤波器相比,FIR 滤波器具有独特的优势。它可以在保证恣意幅频特性的同时具有严格的线性相频特性,这意味着它可以或许在对信号进行滤波处置惩罚时,不会对信号的相位产生扭曲,从而保证了信号的准确性。
别的,FIR 滤波器的单位抽样响应是有限长的,这使得滤波器是稳定的体系,不会像某些无限脉冲响应滤波器那样大概出现不稳定的情况。
二、FIR滤波器的工作原理

FIR滤波器的焦点在于输入信号与单位冲击响应函数的卷积运算。
​https://img-blog.csdnimg.cn/7fcc2a807b824ee3bf0cca67c3cbd70e.jpg
 简单来说,就是将输入信号与滤波器的系数进行逐点相乘,然后将乘积结果累加起来,得到输出信号。
https://img-blog.csdnimg.cn/6b5d35a594974a2cb14f04782dde7a17.png
 在并行布局中,同一个时候,每个输入数据都与对应的滤波器系数相乘,并同时将上一个时候各项乘法的结果进行求和,这样就能得到滤波结果,每个周期输出一个数据,也就是说滤波盘算处置惩罚频率与输入信号采样频率一样,但消耗的资源会随着滤波器阶数而增长。
https://img-blog.csdnimg.cn/0458ba2157f3410492a597e3b62a673d.webp​
 在串行布局中,只需要一个乘法器即可,可以节省资源,为了满足输入信号采样频率下同步输出滤波结果,也就是在一个输入信号周期内,需要完成所有盘算,以是对于一个N阶FIR滤波器,思量到对称系数的特性只要做N/2个乘法运算,也就是盘算处置惩罚频率是输入信号采样频率的N/2倍。
https://img-blog.csdnimg.cn/d194ef6cf85644f584ee1ec5e0b66d4b.jpg​
 三、FPGA代码实现

 
module fir_serial
(
input rst,
input clk,
input data_in,
output data_out
);

reg add_a, add_b;
wire add_s;

reg coe; //12bit量化滤波器系数
wire Mout;

reg cnt;
reg data_reg;
integer i;

reg sum;
reg data_out_temp;

always @ (posedge clk or posedge rst)
if (rst) cnt <= 'd0;
else cnt <= cnt + 1'b1;

always @ (posedge clk or posedge rst)
if (rst) begin //清0
data_reg <= 'd0;
for (i=0; i<15; i=i+1'b1)
data_reg <= 'd0;
end else begin
if (cnt == 'd7) begin
for (i=0; i<15; i=i+1'b1) //移位
data_reg <= data_reg;
data_reg <= data_in;
end
end

always @ (posedge clk or posedge rst)
if (rst) begin
add_a <= 'd0; add_b <= 'd0; coe <= 'd0;
end
else begin
case (cnt)
'd0: begin
add_a <= {data_reg, data_reg};
add_b <= {data_reg, data_reg};
coe <= 12'h000;
end
'd1: begin
add_a <= {data_reg, data_reg};
add_b <= {data_reg, data_reg};
coe <= 12'hffd;
end
'd2: begin
add_a <= {data_reg, data_reg};
add_b <= {data_reg, data_reg};
coe <= 12'h00f;
end
default: begin //第四个周期
add_a <= {data_reg, data_reg};
add_b <= {data_reg, data_reg};
coe <= 12'h02e;
end
endcase
end


assign add_s = add_a + add_b;
mult_gen_0 mult_inst
(
.CLK (clk),
.A (coe),
.B (add_s),
.P (Mout)
);
always @ (posedge clk or posedge rst)
if (rst) begin
sum <= 'd0; data_out_temp <= 'd0;
end
else begin
if (cnt == 'd2) begin
data_out_temp <= sum; sum <= {{4{Mout}}, Mout};
end else
sum <= sum + {{4{Mout}}, Mout};
end

assign data_out = data_out_temp;
endmodule
​假如需要更多学习资料和源码,想要学习FPGA实战入门进阶,请阅读下面这篇文章:
 
FPGA入门真的难吗?少走弯路,少踩坑。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【FPGA数字信号处置惩罚】- FIR串行滤波器