1.算法介绍和实现
首先来搞明白,什么是快速中值滤波?
快速中值滤波非常简单,就是用过去连续N个数据,再对这N个数据进行排序,取排序后的中间那个数据,做为当前的输出,N即为窗口的长度。
算法实现:
1.设置一个缓存区1,用来缓存原始窗口数据,长度为N;再设置一样同样的缓存区2,用来放排序后的窗口数据
2.输入信号到缓存区1,缓存区1未满时,不断重复2过程,返回0。
3.缓存区1已满,复制全部数据到缓存区2,对缓存区2进行冒泡排序,返回中值。
4.取出最早进入缓冲区1中数据data,在缓存区2中找到这个数据,直接删除,找到新数据x合适的位置,插入新数据x,返回中值,循环4,直到全部信号已过算法。
这里实现的时候,用了一些小技巧,每次新数据来的时候,不用每次都对整个窗口去全部排序,那样计算量会非常大,而是直接删除掉一个最早的数据,直接把新数据插入到合适的位置(这里找位置要想高效也可以用二分法查找),这样一来计算量就非常小。
2.在心电图ECG上的应用
快速中值滤波第一个应用,是用来处理漂移非常小的ECG心电图信号,可以很好的保存波形的特征,基本可以做到无失真,做法是设置一个比较长的窗(一般为1~2秒采样的数据长度),将原始数据x输入到算法中,算法出来的基本是信号的直流分量或者频率超级低的基线漂移信号x1,将原始信号x减去算法得到的信号x1,即为想要的信号。
该应用的前提是ECG信号的干扰信号频率极低,但在实际应用中,心电图本身由于阻抗不稳定、肌肉紧张、呼吸等原因,都会导致心电图有较大的基线漂移,所以该应用实际用的不多。
快速中值滤波第二个应用,不是直接使用算法的输出结果,比如该算法能提取基本的基线漂移,我们可以使用这些数据来做一些判断,比如系统是不是漂移非常严重,或者配合其他算法,对结果进行二次运算,得到最终结果。
3.评价
该算法的特点是简单,运算量小,同时对于提取频率非常低的干扰信号非常有效,同时该算法最大的优势是带来的失真度极小,下图为在实际项目中使用快速中值滤波滤除基线漂移的效果:

可以看出,使用快速中值滤波滤基线漂移,出来的心电图ECG还是很容易漂移,但是很好的保留了信号的特征值,所以快速中值滤波适合处理提取频率非常低的干扰信号,或者对系统漂移情况进行快速判断。