中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。
参考论文:
https://wenku.baidu.com/view/2d1bbb31a1c7aa00b42acb66.html
中值滤波的优点是计算速度快,适合实时性要求高的情况。同时效果明显。
以下都提到了中值滤波器的优点和特点。可供参考。
https://wenku.baidu.com/view/300d260590c69ec3d5bb75b4.html
https://wenku.baidu.com/view/51a16fef5ef7ba0d4a733b37.html?sxts=1549959306588
https://wenku.baidu.com/view/cbaf857076c66137ee0619de.html?rec_flag=default
https://wenku.baidu.com/view/85c6b46fb9d528ea80c7797d.html?from=search
ecg1=load('D:\test.xls');
L=length(ecg1);
W=501;
假设H为一个一维向量,其中元素个数为n,
则提取向量H的前n-1个元素的方式,是:H(1:length(H)-1);
以下是C语言代码,可以使用。原始数据在d盘test.xls里面。运行后保存成d盘testPiaoAfter.xls.
#include
#include
#define L 19680
#define BUF_LEN 19680
static float buffer_BL[BUF_LEN];//基线拟合
static float buffer_out[BUF_LEN];//原始数据
static float buffer_3[BUF_LEN];//滤波后数据
#define BUF_W_LEN 501
static float buffer_W[BUF_W_LEN];//中值漂移滤波缓存区窗
static float buffer_2[BUF_LEN + BUF_W_LEN-1];//中值漂移滤波缓存区
//===回调比较函数,注意数组类型和回调匹配===========
int compare_float(const void *a, const void *b)
{
return (*(float *)a) - (*(float *)b);
}
//一种实用的去基线漂移滤波算法_朱伟芳
//
void 中值漂移滤波()
{
//1.扩展buff2;
for(int i=0; i< L+BUF_W_LEN-1; i++)
{
if(0<= i && i<= (BUF_W_LEN-1)/2) {
printf("en0,i=%d\n",i);
buffer_2[i]=buffer_out[0];
}
else if((BUF_W_LEN-1)/2 < i && i<= (L+(BUF_W_LEN+1)/2))
{
printf("en1,i=%d\n",i);
buffer_2[i] = buffer_out[i-((BUF_W_LEN-1)/2)];
}
else if((L+(BUF_W_LEN-1)/2 ) BUF_LEN-1) break;
}
fclose(fd);
}
}
void loadData()
{
FILE* fd = fopen("D:\\test.xls","r+");
if(fd)
{
int i=0;
while(1)
{
fscanf(fd,"%f\t",&buffer_out[i]);
printf("buffer_out[%d]=%f\n", i,buffer_out[i]);
i++;
if(i> BUF_LEN-1) break;
}
fclose(fd);
}
}
int main(void)
{
printf("inmain");
loadData();
中值漂移滤波();
saveData();
printf("inmain is ok");
while(1){};
return 0;
}
原始数据波形图:
过滤后的波形:
可以使用在实时性强的地方,但是由于没有做优化,占用内存比较大。有待优化。