心电 基线漂移的处理研究论文

    中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。

 

参考论文:

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;

 

matlab在数组中取前n项数方法

 假设H为一个一维向量,其中元素个数为n,
则提取向量H的前n-1个元素的方式,是:H(1:length(H)-1);

 

以下是C语言代码,可以使用。原始数据在d盘test.xls里面。运行后保存成d盘testPiaoAfter.xls.

#include <stdio.h>
#include <stdlib.h>


#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 )<i && i<= (L+BUF_W_LEN-2))
		{
			printf("en2,i=%d\n",i);
			buffer_2[i] = buffer_out[L-1];
		}
	}
	///2排序buff2并拟合基线 .BL=median[ecg2(i):ecg2(i+W)], 
	for(int i=0; i<L-1; i++)
	{
		for (int j=0; j<BUF_W_LEN; j++)
		{
			buffer_W[j]=buffer_2[i+j];	
		}
		//排序buffer_W,取中间值
		qsort(buffer_W, BUF_W_LEN, sizeof(buffer_W[0]), compare_float);
		for (int j=i; j<BUF_W_LEN; j++)
		{
			//printf("buffer_W=%f\n", buffer_W[j]);
		}

		buffer_BL[i]=buffer_W[(BUF_W_LEN-1)/2];
	}
	//3.得到滤波后数据
	for(int i=0; i<L-1; i++)
	{
		buffer_3[i] = buffer_out[i] - buffer_BL[i];
	}
}


void saveData()

{
	FILE* fd = fopen("D:\\testPiaoAfter.xls","w+");
	if(fd)
	{
		int i=0;
		while(1)
		{
			fprintf(fd,"%f\t",buffer_3[i]);
			i++;
			if(i> 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;
}

原始数据波形图:

过滤后的波形:

可以使用在实时性强的地方,但是由于没有做优化,占用内存比较大。有待优化。

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值