uwb 레이더 심박수 측정 원리 와 예제 코드

 uwb 레이더를 이용해 활력 징후(vital sign)를 모니터링하는 논문이나 시도는 예전부터 있어왔다.  2010년에 progress in electromagnetics research에 A. Lazaro, D. Girbau, R. Villarino가 쓴 "ANALYSIS OF VITAL SIGNS MONITORING USING AN IR-UWB RADAR"라는 글이 실리기도 했다.  본 글에는 간단하게 심박수 측정 원리에 대해 알아보고 python을 이용해 심박수를 측정하는 예제 코드를 구현하고 테스트했다.



1. 심박수 측정 원리

uwb 레이더를 사용하여 심박수를 측정하는 원리는 호흡수 측정 원리와 유사하다.

UWB 레이더를 사용한 호흡수 측정 원리

uwb 레이더는 투과성이 좋기 때문에 심장까지 도달했다가 반사되는 전파를 수신해 이를 분석해 심박수를 측정할 수 있다. 

심장이 뛸 때마다 레이더와의 거리가 늘어났다 줄어든다. 그 거리 신호들을 시간 순서로 모은 후, 푸리에 변환(Fourier transform)을 사용하여 주파수를 분석해 심박수를 측정한다. 일반적으로 호흡과 심장 박동의 회수가 다르기 때문에 fft를 통해한 주파수 분석이 가능하다. 

위키백과 - 호흡수 / 위키백과 - 심박수

예를 들어 아래 fft 후 주파수의 분포 이미지에서 좌측의 저주파 부분이 호흡수 주파수이고, 오른쪽의 주황색선 범위가 심박수 주파수 범위다. 

심박수 신호는 보통 호흡 신호에 섞인 상태로 레이더에 수신된다. 

 호흡 신호는 심박수 신호에 비해 상당히 큰 신호이다. 주파수 분석 시 fft변환 과정에서 호흡수 주파수에 영향을 받을 수도 있다. 이를 배제하기 위해 신호를 분리할 필요가 있으며, 심박수 신호의 분리는 Band Pass Filter를 사용하면 된다. 



2. 심박수 측정 예제 코드

 이전 포스트에서 uwb 레이더를 사용해 호흡수를 측정하는 예제에 대해 다룬 적이 있다. 본 글의 예제는 이 호흡수 측정 코드에 심박수 측정 기능을 추가해 테스트했다.

uwb radar 호흡수 측정 방법 예제 코드

심박수를 측정하기 위해 호흡수 측정 코드에서 추가된 함수는 아래와 같다.

def get_heartrate_sample(self,sample_range):
    samples = np.reshape(self.framestack,(len(self.framestack),self.framesize)).T
    samples = samples[sample_range[0]:sample_range[1],:]
    samples = detrend2(samples)
    hbsample = np.zeros((samples.shape[0],samples.shape[1] - int(self.bpf.shape[0]/2)))
    for i in range(samples.shape[0]):
        hbsample[i] = fir.filtering(samples[i],taps=self.bpf)
    return hbsample*np.hamming(hbsample.shape[1])

def measure_heartbeat(self, sample_range):
    if len(self.framestack) < self.measure_size:
        return -1
    
    s = self.hrange[0]
    e = self.hrange[1]
    bpms = []
    
    samples = self.get_heartrate_sample(sample_range)
    sp = np.fft.fft2(samples,s=(-1,self.N))
    
    for i in range(samples.shape[0]):
        freq_out = self.probe_freq(sp[i].real, sp[i].imag)[0:e]
        bpm = self.bpmtable[np.argmax(freq_out[s:])+s]
        bpms.append(bpm)
                
    return bpms 

fft를 수행할 샘플을 가져올때 band pass filter를 적용한다.band pass filter의 주파수 범위는 일반적인 심박수 범위를 사용하였다.

각 측정 범위의 샘플들을 fft 수행한 후 심박수 주파수 범위내에서 가장 큰 power를 가진 주파수를 심박수로 정했다.

 


3. 심박수 측정 코드 테스트

테스트 스트림은 호흡 테스트에 사용한 uwb 신호 파일을 사용하였다. 그리고 uwb 신호 캡쳐 당시 삼성 갤럭시 스마트폰으로 측정한 심박수는 아래와 같다.


구현된 코드를 사용해 심박수를 산출한 결과는 아래와 같다.

가장 많이 파워가 크고 많이 측정된 심박수는 대략 59 bpm 정도로 측정된다.


또한 52 bpm으로 측정되는 경우도 있다. 모두 스마트폰으로 측정한 심박수 범위내에 있다.
하지만, 모두 이렇게 잘 측정되는 것은 아니다. 아래의 경우처럼 74 bpm으로 측정되는 경우도 있다. 이는 추후 개선해야 할 사항이다.




4. 맺음말

 uwb 레이더로 심박수를 측정하는 방법에 대해 알아봤다.
기본적인 원리는 생각보다 간단하다. python에서는 구현도 간단하다. 다만, 심박수 주파수가 워낙 작기 때문에 사람의 작은 움직임에도 영향을 받고, 주변 in-band 노이즈에도 영향을 많이 받는다. 상용화를 위해선 이에 대한 처리도 필요 하다.  



관련 글

UWB 레이더를 사용한 호흡수 측정 원리
uwb radar 호흡수 측정 방법 예제 코드
바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

댓글

  1. 혹시 이렇게 개발된 제품이 있는지요? 아님 개발 진행중이신건가요?

    답글삭제
    답글
    1. 포스트한 내용처럼 만든 제품이 있는지는 모르겠습니다. 그리고, 개발중인 내용을 블로그에 올리진 않습니다.

      삭제

댓글 쓰기

이 블로그의 인기 게시물

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

간단한 cfar 알고리즘에 대해

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

간단한 칼만 필터(Kalman Filter) 소스 코드와 사용 예제

python winsound를 이용한 윈도우 환경에서 소리 재생 예제