滑动平均值滤波是指先在RAM中建立一个数据缓冲区,依顺序存放N个采样数据,每采进一个新数据,就将最早采集的那个数据丢掉,而后求包括新数据在内的N个数据的算术平均值或加权平均值。这样,每进行一次采样,就可计算出一个新的平均值,从而加快了数据处理的速度。

​滑动平均值滤波程序设计的关键是:每采样一次,移动一次数据块,然后求出新一组数据之和,再求平均值。滑动平均值滤波程序有两种,一种是滑动算术平均值滤波,一种是滑动加权平均值滤波。不管是算术平均值滤波,还是加权平均值滤波,都需连续采样N个数据,然后求算术平均值或加权平均值。

上述两段文字来自百度。这里做的是算术平均值滤波。以下代码来自openofdm的moving_avg.v文件,就是严格按照这个思路写的。

module moving_avg
#(parameter DATA_WIDTH = 32,parameter WINDOW_SHIFT = 4,parameter SIGNED = 0
)
(input clock,input enable,input reset,input signed [DATA_WIDTH-1:0] data_in,input input_strobe,output reg signed [DATA_WIDTH-1:0] data_out,output reg output_strobe
);localparam WINDOW_SIZE = 1<<WINDOW_SHIFT;
localparam SUM_WIDTH = DATA_WIDTH + WINDOW_SHIFT;reg signed [(SUM_WIDTH-1):0] running_sum;wire signed [DATA_WIDTH-1:0] old_data;
wire signed [DATA_WIDTH-1:0] new_data = data_in;wire signed [SUM_WIDTH-1:0] ext_old_data = {{WINDOW_SHIFT{old_data[DATA_WIDTH-1]}}, old_data};
wire signed [SUM_WIDTH-1:0] ext_new_data = {{WINDOW_SHIFT{new_data[DATA_WIDTH-1]}}, new_data};reg [WINDOW_SHIFT-1:0] addr;
reg full;ram_2port  #(.DWIDTH(DATA_WIDTH), .AWIDTH(WINDOW_SHIFT)) delay_line (.clka(clock),.ena(1),.wea(input_strobe),.addra(addr),.dia(data_in),.doa(),.clkb(clock),.enb(input_strobe),.web(0),.addrb(addr),.dib(32'hFFFF),.dob(old_data)
);integer i;
always @(posedge clock) beginif (reset) beginaddr <= 0;running_sum <= 0;full <= 0;data_out <= 0;end else if (enable) beginif (input_strobe) beginaddr <= addr + 1;data_out <= running_sum[SUM_WIDTH-1:WINDOW_SHIFT];if (addr == WINDOW_SIZE-1) beginfull <= 1;endif (full) beginrunning_sum <= running_sum + ext_new_data- ext_old_data;end else beginrunning_sum <= running_sum + ext_new_data;endoutput_strobe <= full;end else beginoutput_strobe <= 0;endend else beginoutput_strobe <= 0;end
end
endmodule

这里我们sum记录了ram里面的所存的前WORD_SIZE-1个数值的算术和。当到达这些位数之后,每输入一位就有一位溢出(或者说被移除),溢出的序号正好等于输入的那个序号,好让位该空间用于存储。可见这里要求ram_2port读的延迟必须是一个周期,写的延迟呢,应该是小于WINDOW_SHIFT就好,WINDOWS_SHIFT最小可以是2,那么写延迟最小可以是1.因此我们也就实现一级写延迟。一级读写延迟的RAM_2PORT实现代码如下:

//
// Copyright 2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//module ram_2port
#(parameter DWIDTH=32,parameter AWIDTH=9
)
(input clka,input ena,input wea,input [AWIDTH-1:0] addra,input [DWIDTH-1:0] dia,output reg [DWIDTH-1:0] doa,input clkb,input enb,input web,input [AWIDTH-1:0] addrb,input [DWIDTH-1:0] dib,output reg [DWIDTH-1:0] dob
);reg [DWIDTH-1:0] ram [(1<<AWIDTH)-1:0];
integer         i;
initial beginfor(i=0;i<(1<<AWIDTH);i=i+1)ram[i] <= {DWIDTH{1'b0}};doa <= 0;dob <= 0;
endalways @(posedge clka) beginif (ena) beginif (wea)ram[addra] <= dia;doa <= ram[addra];end
end
always @(posedge clkb) beginif (enb)beginif (web)ram[addrb] <= dib;dob <= ram[addrb];end
end
endmodule // ram_2port

这份RAM_2PORT代码来自ETTUS的USRP产品的源码,被OPENOFDM引用。

作为效果我看看看仿真图

这是在openofdm里面内嵌的一个4平均值的滑动滤波器效果,整个就是openofdm正常实例仿真的数据。我们看到蓝色输出相对与绿色的输入确实平滑了很多。

这里这个32位4平均数值的模块实现过于麻烦了,一大堆寄存器和一个双口RAM。其实对于2,4,8,16这些2的数次方的特例是有可以用另外使用移位寄存器。思路我用代码简单写写核心部分如下:


reg [31:0] r0,r1,r2,r3;
reg [31+2:0]sum;
always @ (posedge clk ) if (en) {r3,r2,r1,r0}<={r2,r1,r0,sig_in} ;
always @ (posedge clk )sum <= r3+r2+r1+r0 ;
assign sig_out = sum [31+2:2] ;

这里注意输出实际是左移动2位后的sum,也就是sum除以4。如果要滑动5位就是能这样左移位了,在verilog里面实现除以5的代价远不是加减肥那样简单,所以要再次评估实现方式了。

如果需要out_storbe信号,就将in_strobe和sig_in一起按照时序移动就好。

话回来,现在FPGA都资源冗余,具体工程中也没有必要在实现细节上死磕资源。具体使用时候可以根据情况权衡实现方式。

滑动平均值滤波的VERILOG实现相关推荐

  1. PLC滑动平均值滤波(SMART 200梯形图篇)

    滑动平均值滤波的算法原理请参看<信号处理>专栏的其它文章,这里给出简单快速写法,以供参考. S7-200 SMART PLC信号处理系列之滑动平均值滤波FB_RXXW_Dor的博客-CSD ...

  2. S7-200 SMART PLC信号处理系列之滑动平均值滤波FB

    PLC相关滤波算法,专栏有很多详细讲解这里不再赘述.滑动平均值滤波和算术平均值滤波专栏也有文章讲解,大家可以查看相应文章.关于SMART PLC的指针应用可以查看下面这篇博客: SMART PLC指针 ...

  3. 基于TIA博途的滑动平均值滤波算法SCL语言程序(V15)

    基于TIA博途的滑动平均值滤波算法SCL语言程序(V15) 如果在实际项目中发现模拟量输入或某些信号输入有干扰时或波动时,可以编写相应的滤波程序来使得输入信号变得较为稳定,下面就和大家分享:在TIA博 ...

  4. 微型计算机滑动平均值滤波器方程,微型计算机控制技术期末复习2011.ppt

    期末复习提纲,考试范围,第二章模拟量输入输出通道接口技术第三章人机交互接口技术第四章常用控制程序设计第六章总线接口技术第七章过程控制数据处理方法第八章PID算法第十一章微机控制系统抗干扰设计,试题题型 ...

  5. π型滤波频率计算_滑动平均滤波的截止频率与平均点数计算

    1.介绍 滑动平均值滤波可以去除随机噪声.测量中随机噪声的影响,使测量结果不准确,通过多次测量同一数据源,使用多点集合平均的方法得到数据一个比较合理的估计就是滑动平均值滤波. 例如第80采样点的5次平 ...

  6. 滑动平均滤波的截止频率与平均点数计算

    1. 介绍 滑动平均值滤波可以去除随机噪声.测量中随机噪声的影响,使测量结果不准确,通过多次测量同一数据源,使用多点集合平均的方法得到数据一个比较合理的估计就是滑动平均值滤波. 例如第80采样点的5次 ...

  7. 嵌入式–滑动平均滤波算法

    嵌入式–滑动平均滤波 ​ 滑动平均值滤波是指先在RAM中建立一个数据缓冲区,依顺序存放N个采样数据,每采进一个新数据,就将最早采集的那个数据丢掉,而后求包括新数据在内的N个数据的算术平均值.这样,每进 ...

  8. 微型计算机滑动平均值滤波器方程,wx05_微型计算机控制技术_第五章.ppt

    wx05_微型计算机控制技术_第五章,微型计算机控制技术,微型计算机接口技术,微型计算机技术,微型计算机及接口技术,微型计算机技术及应用,微型计算机与接口技术,微型计算机控制系统,微型计算机技术指标, ...

  9. Verilog功能模块——取滑动平均值(使用寄存器组)

    我的另一篇博客:Verilog功能模块--取滑动平均值(使用FIFO) 两者用不同的方式实现相同的功能, 使用FIFO占用较少寄存器资源,适用于取值N较大的场合. 使用寄存器组不需要额外的IP,更简单 ...

最新文章

  1. 闲得蛋疼在linux下装鸟个svn
  2. 软件测试是采用(A)执行软件的活动,测试(Test)测试是一项采用测试用例执行软件的活动,在这.ppt...
  3. 每天学一点儿shell:Linux中crontab的用法
  4. bash-shell高级编程--求最大公约数
  5. 【转】为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?...
  6. MyBatis 插件原理与自定义插件-PageHelper 原理
  7. python 的下划线_
  8. 如何修改SQL Server 2000身份验证模式和系统管理员
  9. ES6的Promise -- 逻辑执行的顺序
  10. Java NIO学习篇之StandardOpenOption详解
  11. yum 源端软件包扩展
  12. java mockserver搭建_使用Moco搭建Mock Server教程
  13. 贪心 学员 高阶机器学习 魔鬼·训练营
  14. 100多本炒股电子书网盘自由下载!
  15. 180亿美元估值,快手用什么来支撑?
  16. 分享文案、表白网页、电影 祝各位都能追到女神!
  17. 个人作业2---必应词典案例分析
  18. 使用python进行视频地址的获取,下载
  19. RAM与ROM与CMOS
  20. manifest文件linux,MANIFEST 文件扩展名: 它是什么以及如何打开它?

热门文章

  1. 2016新疆教师计算机等级考试,2019年11月7日的新疆中小学教师计算机等级..._教师资格考试_帮考网...
  2. 网页设计手绘板绘画板,适合初学者学习使用,HTML
  3. Oraclenbsp;SQL培训教程[清华大学出版…
  4. oracle数据库9.2,Oracle数据库从 9.2.0.1 到 9.2.0.8升级步骤 for win
  5. php fck编辑器拿shell,Fck编辑器漏洞
  6. 彻底搞懂MOS管的工作原理及应用
  7. LeetCode-Python-277. 搜寻名人
  8. Microsoft SQL Server 2008R2和2019
  9. sql 2008 r2使用
  10. 小长假出游攻略之新加坡圣淘沙