⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmpt_multilead_mfr_int_backup4.c

📁 做ECG的可以看一下
💻 C
字号:

#include "multilead_QRS.h"

void  cmpt_MultiLead_Recognization_MFR(INT32 *QRS, LONG32 dataxyz[][COL],INT32 sfreq0,INT32 *QRS_P[][COL])
{
	INT32    i,j,flag,win10ms,kk,Ind,jj,nn,t1,t2,win100ms,win50ms;
	LONG32   rr      = (sfreq0 * 1024+500)/1000;
	INT32    sslen   = (INT32) (5 * rr)>>10;
	INT32    datalen = DATALEN - sslen;
	INT32    qrsT[200];
	LONG32   Mmax    = 0;
	LONG32   Mmax0,max1,max2,rm,tempr,newM5,M,F,R,min1;
	LONG32   temp    = 0;
	LONG32   sfreq   = (LONG32)sfreq0;
	LONG32   modrate = (LONG32)(250*1024/sfreq);
	LONG32   MM[5],RR[5];
	LONG32   st[DATALEN-2];
	Combined_Adaptive_Threthold mfr[DATALEN-2];

	win10ms = 10*rr+512>>10;
	win100ms= 100*rr+512>>10;
	win50ms = 50*rr+512>>10;
	Ind = 0;
	nn  = 0;
	rm  = 0;

	/*根据已知的3导数据计算空间速率st*/
	for(i=0;i<sslen;i++)
		st[i] = 0;

	for(i = sslen;i<datalen;i++)
	{
		temp = 0;
		for(j=0;j<COL;j++)
			temp += abs(dataxyz[i+sslen][j] - dataxyz[i-sslen][j]);

		st[i] = temp/COL;
	}
	

	for(i=0;i<5;i++)
	{
		Mmax0 = 0;
		for(j=0;j<sfreq;j++)
			Mmax0 = (Mmax0 > st[i*sfreq0+j])? Mmax0:st[i*sfreq0+j];

		Mmax += Mmax0;
	}
//	M = 6*Mmax/50;
	M = 3*Mmax/25;
	for(i=0;i<5;i++)
	{
		MM[i] = M;
		RR[i] = 0;
	}
	R = 0;
	temp = 0;
	for(i=0;i<(350*rr+512>>10);i++)
	{
		temp += st[i];
	}
	F = temp/(350*rr+512>>10);
	i = 0;
	j = 0;
	flag = 0;
	QRS[0]  = 0;
	
	while(i<datalen)
	{
		temp = 0;
		if(i >= QRS[j] + (200 * rr+512>>10)-1 && i <= QRS[j] + (1200 * rr+512>>10))
		{
			temp = M /sfreq;
//			M = M - (INT32)(4 * temp+5)/10;
			M = M - ((INT32)((4 * temp+5)*51)>>9);
		}
		else
			temp = 0;
		mfr[i].m = M;
		if(i > (350*rr+512>>10) - 1)
		{
			if(flag == 1)
			{
				for(kk=0;kk<(200*rr+512>>10)-1;kk++)
				{
					max1 = max2 = 0;
					Ind = QRS[j] + kk + 1;
					if(Ind > 350*rr+512>>10)
					{
						for(jj=Ind-(50*rr+512>>10);jj<=Ind;jj++)
							max1 = (st[jj] > max1)? st[jj]:max1;

						for(jj=Ind-(350*rr+512>>10);jj<=Ind-(300*rr+512>>10);jj++)
							max2 = (st[jj] > max2)? st[jj]:max2;
	
						F += ((max1-max2)/150);
					}
					mfr[Ind].f = F;
				}
				flag = 0;
				i = Ind + 1;
				continue;
			}
			else
			{
				max1 = max2 = 0;
				for(jj=i-(50*rr+512>>10);jj<=i;jj++)
					max1 = (st[jj] > max1)? st[jj]:max1;

				for(jj=i-(350*rr+512>>10);jj<=i-(300*rr+512>>10);jj++)
					max2 = (st[jj] > max2)? st[jj]:max2;

				F += ((max1-max2)/150);
				mfr[i].f = F;
			}
		}
		if(j >= 2)
		{
			for(nn=1;nn<j;nn++)
			{
				qrsT[nn] = QRS[nn+1] - QRS[nn] + 1;
			}
			if(j < 7)
			{
				for(jj=7-j;jj<5;jj++)
					RR[jj] = qrsT[jj+j-5];
				for(jj=0;jj<7-j;jj++)
					RR[jj] = qrsT[1];
			}
			else
			{
				for(jj=0;jj<5;jj++)
					RR[jj] = qrsT[j-5+jj];
			}
			temp = 0;
			for(jj=0;jj<5;jj++)
				temp += RR[jj];
//			rm = (INT32)((temp*2 + 5)/10);
			rm = (INT32)((temp*2 + 5)*51>>9);
		
//			if(i-QRS[j] < (INT32)((rm*4 + 3)/6))
			if(i-QRS[j] < (INT32)((rm*4 + 3)*43>>8))
				R = 0;
			else
				if(i-QRS[j] <= rm)
				{
		//			tempr = M*rr/sfreq;
					tempr = M/sfreq;
//					R = R-tempr*2/7;
					R = R-(tempr*37>>7);
				}
		}

//漏检判断-Algorithm 2---------在以后加上////////////////////////////////////////////////////
		if(nn>1)
		{
			t1 = qrsT[nn-2];
			t2 = qrsT[nn-1];
//			if((t1 > rm || rm-t1 < 3*rm/10) && abs(t2-2*rm) < 6*rm/10)
			if((t1 > rm || rm-t1 < (3*rm*51>>9)) && abs(t2-2*rm) < (6*rm*51>>9))
			{
				for(kk=QRS[nn-1]+(200*rr+512>>10);kk<=QRS[nn]-(200*rr+512>>10);kk++)
				{
					min1 = 0x7FFFFFFF;
					temp = 0;
					for(jj=0;jj<3;jj++)
					{
						temp = abs(dataxyz[kk][jj] - dataxyz[kk-win10ms][jj]);
						min1 = (min1<temp)? min1:temp;
					}
					temp = 0;
					for(jj=0;jj<5;jj++)
						temp += MM[jj];
//					if(min1 > 20*ZOOM_OUT && st[kk] > temp/15)
					if(min1 > 20*ZOOM_OUT && st[kk] > (temp*17>>8))
					{
//						mfr[kk].mfr_sum = 8*st[kk]/10;
						mfr[kk].mfr_sum = (st[kk]*408>>9);
						j++;
						QRS[j] = QRS[j-1];
						QRS[j-1] = kk;
						break;
					}
				}
			}
		}
///////////////////////////////////////////////////////////////////////////////////////////////////
		mfr[i].f = F;
		mfr[i].r = R;
//		mfr[i].mfr_sum = mfr[i].m + mfr[i].f * modrate + mfr[i].r;
		mfr[i].mfr_sum = M + ((INT32)(F * modrate)>>10) + R;
//		mfr[i].mfr_sum = M + F * modrate/1024 + R;
		if(st[i] >= mfr[i].mfr_sum)
		{
			j++;
			QRS[j] = i;
			kk = (datalen < i+(200*rr+512>>10))? datalen:(i+(200*rr+512>>10));
			max1 = 0;
			for(jj=i;jj<kk;jj++)
				max1 = (max1>st[jj])? max1:st[jj];
//			newM5 = 3*max1/5;
			newM5 = (max1*615)>>10;					//此处有可能会溢出
//			newM5 = (newM5>15*MM[4]/10)? 11*MM[4]/10:newM5;
			newM5 = (newM5>(MM[4]*561)>>9)? ((MM[4]*561)>>9):newM5;
			for(jj=0;jj<4;jj++)
				MM[jj] = MM[jj+1];
			MM[4] = newM5;
			temp = 0;
			for(jj=0;jj<5;jj++)
				temp += MM[jj];
//			M = temp/5;
			M = temp*205>>10;						//此处有可能会溢出
			R = 0;
			mfr[i].mfr_sum = M + (((INT32)(F * modrate))>>10) + R;
			for(jj = i;jj<=kk;jj++)
			{
				mfr[jj].f = F;
				mfr[jj].r = R;
				mfr[jj].m = M;
				mfr[jj].mfr_sum = mfr[i].mfr_sum;
			}	
			i = kk;
			flag = 1;
			continue;
		}
		flag = 0;
		i++;
	}

	
/*确定QRS尖端位置*/
/*
	i = 1;
	j = 0;
	while(QRS[i] >= 0)
	{
		
	}
	*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -