作用
消除输入信号的“突变”脉冲,如下图:
中值滤波原理
连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。
下面以3次中值滤波原理为例说明原理:输入数据里面a3点为毛刺,b3点是由a1 a2 a3三个点排序得出的,由于a3>a2>=a1,所以,b3=a2或者a1,这样中间的毛刺信号就没了。
图1 3次采样中值滤波示例
优点
能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果。
代码设计
以3次采样中值滤波器为例,设计方案如图2所示。源码和仿真测试代码链接:
缓存用寄存器打拍实现,比较需要任意两两比较,所以比较次数为C n ^2^次,选择输出在比较完成以后,进行简单排序,确定中间值输出。其中比较麻烦的是后面两步,比较次数和排序随着中值滤波规模的变大而变大,是二次增长。
图2 中值滤波器方案
代码详解
很多小伙伴反应吗,最多到上一步方案设计就难以往下走了,不知道代码怎么设计。为了让大家学会怎么设计代码,这里给大家提供代码含义解释和设计思路解释。
根据图2,首先写缓存器,din是输入端口。代码如下:
比较部分为了简便,我们用一个bit位代表某两两比较的结果,比如com[2]=1就代表din_buf[0]大于din_buf[2],反之din_buf[0]小于din_buf[2]。这样用3bit的线就可以保留比较结果了。wire类型的代表线,assign代表将结果引到某根线上,所以比较结果输出到comp[*]没有经过任何时钟,延时是纯粹的组合逻辑延时。代码如下:
排序筛选的部分由于只有3个比较所以直接用枚举法,全部列出来处理。注释部分表示了排序结果,根据排序结果选择将哪个缓冲器输出即可。代码如下:
仿真测试
仿真测试文件和代码在同一个文件夹下,欢迎下载。第二行周期波形是输入波形,带有一个正尖峰和一个负尖峰,经过中值滤波后如第三行所示,毛刺都没了。
**图3 ** 中值滤波结果
-
滤波器
+关注
关注
159文章
7688浏览量
177346 -
寄存器
+关注
关注
31文章
5281浏览量
119746 -
缓冲器
+关注
关注
6文章
1910浏览量
45415
发布评论请先 登录
相关推荐
评论