Biomedical Instrumentation 2010105052 김광우
QRS Detector Digital filter ECG Signal LPF HPF 미분 제곱 적분 Thresholding Decision Digital filter 이 과정들은 마이크로프로세서 내부에서 코딩으로 구현가능
Main () { Int y1, y2 ………………; d = getData; y1=QRS_LPF ( d ); y2=QRS_HPF ( y1 ); y3=QRS_Derivative ( y2); y4=QRS_Square ( y3 ); y5=QRS_MWI ( y4 ); ………………….. }
LPF int QRS_LPF (int x) //y[n]=x[n]-2x[n-6]+x[n-12]+2y[n-1]-y[n-2] { static int y1=0, y2=0, x[26], p=12; int y; x[p]=x[p+13]=x; y=x[p]-(x[p+6]<<1)+x[p+12]+(y1<<1)-y2; y2=y1; y1=y; if(--p<0) p=12; return (y>>5); } 함수가 끝나도 남아있도록 Ring-buffer 뒤부터 저장 이득 32배
HPF LPF의 출력을 HPF의 입력으로 이용 int QRS_HPF (int x) //y[n]=x[n-16]-1/32(l[n-1]+x[n]-x[n-32]) { static int l1=0, x[66], p=32; int l; x[p]=x[p+33]=x; l=l1+x[p]-x[n+32]; l1=l; if(--p<0) p=32; return (x[p+16]-(l>>5)); } All pass filter 에서 Low pass filter 를 빼면 High pass filter 가 된다.
Derivative_ver1 HPF의 출력을 Derivative의 입력으로 이용 int QRS_Derivative (int x) //y[n]=x[n]-x[n-1] { static int x1; int y; y=x-x1; x1=x; return (y); } 정말 간단한 미분기 코드이다. 간단하지만 Signal 의 변화에 약하다는 단점이 있다.
Derivative_ver2 HPF의 출력을 Derivative의 입력으로 이용 int QRS_Derivative (int x) //y[n]=1/8(2x[n]+x[n-1]-x[n-3]-2x[n-4]) { static int x1, x2, x3, x4; int y; y=((x<<1)+x1-x3-(x4<<1))>>3; x4=x3; x3=x2; x2=x1; x1=x; return (y); } Ver1 에 비해서 Signal 의 변화추이에 더 좋다. 결과에 영향을 주는 데이터가 Ver1 에서는 현재와 그 전 이라면 Ver2 에서는 4번째 전 데이터까지 영향을 미친다. 대입하는 순서매우 중요
Square Derivative의 출력을 Square의 입력으로 이용 저가형 프로세서는 곱셈연산이 오래 걸린다. Datasheet 를 확인해서 Real-time에 영향을 줄 경우 다음과 같이 해결 고가형 int QRS_Square (int x) { return (x*x); } 저가형 int QRS_Abs (int x) if(x<0) return(-x); else return (x); Square를 하는 이유는 음수를 양수로 만들기 위해서이다. 그러므로 여의치 않은 경우 절대값을 이용할 수 있음
Moving window Integral int QRS_MWI (int x) // 보통 QRS의 폭은 100ms(빠른 연산필요) // y[n]=1/32(x[n]+x[n-1]+......+x[n-31]) { static int x[3], p=0; static long sum=0; long ly; int y; if(++p==32) p=0; sum-=x[p]; // 가장 옛날 데이터 sum+=x; // 가장 최근 데이터 x[p]=x; // 데이터 교체 ly=(sum>>5); if(ly>32400) y=32400; else y=(int)ly; return(y); } 적분 계산이 필요 신호는 계속 입력됨 최근 신호는 더하고 가장 오래된 순으로 데이터를 버리면 적분완성