ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-12-04:滑动平均滤波器的verilog实现

2021-12-04 22:04:35  阅读:158  来源: 互联网

标签:滤波器 12 04 temp sum 2021 rst 滑动 reg


https://blog.csdn.net/qq_36248682/article/details/105666864
最方便实现的求均值方法便是滑动平均滤波器,之所以称之为滤波器是因为该算法本身有一种保留低频分量、滤除高频分量的特性。
如3点滑动平均滤波器的输出y(n)=[x(n-2)+x(n-1)+x(n)]/3。滑动平均滤波器的频率响应是1。
上述示例x(n)的每个取样点权值相同,都为1/3。也可以为每个取样点选择不同的权值,即为加权滑动平均滤波器 。

FPGA设计
在Quartus II开发环境下完成8点滑动平均滤波器的设计。模块接口如下(使用Verilog):

module Average_Filter
#(
parameter AVE_DATA_NUM = 5’d8,
parameter AVE_DATA_BIT = 5’d3
)
(
input i_rst_n,
input i_clk,
input [31:0]din,
output [31:0]dout
);

使用一组8个寄存器移位存储数据,即求平均值时共选取8个数据进行运算。代码如下:

reg [31:0] data_reg [AVE_DATA_NUM-1:0];

reg [7:0]temp_i;

always @ (posedge i_clk or negedge i_rst_n)
if(!i_rst_n)
for (temp_i=0; temp_i<AVE_DATA_NUM; temp_i=temp_i+1)
data_reg[temp_i] <= 'd0;
else
begin
data_reg[0] <= din;
for (temp_i=0; temp_i<AVE_DATA_NUM-1; temp_i=temp_i+1)
data_reg[temp_i+1] <= data_reg[temp_i];
end

对连续8个寄存器数据求和并计算均值

reg [31:0] sum;

always @ (posedge i_clk or negedge i_rst_n)
if (!i_rst_n)
sum <= 'd0;
else
sum <= sum + din - data_reg[AVE_DATA_NUM-1]; //将最老的数据换为最新的输入数据

assign dout = sum >> AVE_DATA_BIT; //右移3 等效为÷8

对于FPGA而言,除法 运算很消耗资源,可以采用移位的方法来代替,如上代码所示。

标签:滤波器,12,04,temp,sum,2021,rst,滑动,reg
来源: https://blog.csdn.net/weixin_48307970/article/details/121722579

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有