说到滤波的话大家应该一下就会想到平均滤波,因为这个比较常接触,从小到大的分数平均分,全省平均工资等,但是很多时候平均数是不合理的,我和千万家产的人平均的话,也人均百万富翁了,所以,当我们遇到一个强的干扰信号,平均之后数据是无法反应出正确的信号的,这个时候,中值滤波的优势就体现出来了。
中值滤波在数据处理中的角色就是一个和事佬,把数据中的“刺头”剔除出去,如下图所示:
实际的信号就会伴随一些随机噪声和一些强干扰信号,而平均滤波无法滤除强干扰,但随机噪声的滤波效果是不错的,这是平均滤波擅长的,让数据变得平滑,如果能确保需要处理的信号不会有阶跃型的干扰可以上,但是实际使用中是无法保证的,再来看中值滤波后的结果,颇有一种“他强任他强,清风拂山岗”的佛系表现,滤波器很好的过滤了大的“刺头”,也让信号看起来较为平稳。
看到这想必大家也能看出中值滤波的过人之处,那大家可能会有疑惑,到底怎么中值滤波呢?
中值滤波的原理就是对固定数量的信号值进行排序后选择中值作为过滤后的信号点,举例:如果是3阶中值滤波,就是取源信号的三个数的中间值作为滤波后的值,细心的小伙伴可能会发现,那取三个数,第一、二个值怎么取3个数? 事实就是它要采到 阶数个数的值 才能滤波。原理大概讲完了,下面直接上代码:
//中值滤波在使用时一般有两种情况
//1 先采集好数据再进行滤波处理
//2 边采集数据边处理数据
//阶数怎么确定后面会解释 一般来说可以试出来
#define ORDER 10 //阶数
#define N ((ORDER) / 2) //判断中值位置的值
//第一种 先采集好数据再进行滤波处理
/*
*********************************************************************************************************
* 函 数 名: MidFilterBlock
* 功能说明: 对已经采集好的一段数据进行中值滤波
* 形 参: pSrc 源数据地址
* pDst 滤波后数据地址
* blockSize 数据个数,至少为3
* ORDER 至少3阶。
* 注 意:阶数不给设置2是因为我认为2的话就是平均值了,两个值取