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

 본 포스트는 uwb radar를 사용한 호흡수 측정의 예제 코드와 측정 결과를 싣고 있다. 예제 코드는 python으로 구현했다.


호흡수 측정 원리는 아래 글에 설명돼 있다.

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



1. uwb radar signal

 예제 코드에서는 uwb 레이더로 사람을 측정한 후 저장된 파일을 사용하였다.
 파일에서 한 프레임씩 읽어 10초 단위로 버퍼에 저장한 후 이를 사용하여 호흡수를 측정했다.

csvfile = open('0117170856.csv')
if csvfile is None:
    return

uwb_signal = csv.reader(csvfile)
measure_len = 153

for line in uwb_signal:
    frame = [float(x) for x in line]
    frame = frame[0:measure_len]
       
    vital.put_frame(frame)
    
csvfile.close()

def put_frame(self, frame):
    self.framesize = len(frame)
    self.framestack.append(frame)
    if len(self.framestack) > self.framestack_size:
        self.framestack.pop(0)



2. 사람 위치

 호흡을 측정하기 위해선 사람의 위치를 찾는 것이 선행되어야 한다.  사람이 호흡할 때 움직이는 가슴/배의 위치를 찾으면 된다. 움직이는 위치는 관련 포스트에서 다룬 적이 있다.



3. pre-processing

10초간 저장된 신호들은 호흡수 측정을 위해 fft를 수행하기전 전처리가 필요하다. 

3.1. detrend

신호의 trend 성분을 제거해야 한다. 아래 이미지는 trend 성분을 제거하지 않은 경우와 제거한 경우의 fft 수행후의 주파수 스펙트럼을 보여주고 있다.


trend 성분을 제거하지 않으면 위 이미지처럼 DC 부근의 주파수 크기가 크게 나타나 경향이 있다.

3.2. windowing

fft시 발생하는 주파수 하모닉을 제거하기 위해서는 신호에 window를 적용해 줄 필요가 있다. 본 포스트의 예제에서는 hanning window를 사용했다. 

self.window = np.hanning(self.measure_size) 



4. 호흡수 주파수 분석

호흡수의 주파수 분석을 위한 fft는 numpy.fft를 사용하였다. 

https://numpy.org/doc/stable/reference/generated/numpy.fft.fft2.html

fft를 수행해 호흡수 주파수를 찾는 과정은 아래 코드와 같다.

samples = np.reshape(self.framestack,(len(self.framestack),self.framesize)).T
samples = samples[measure_range[0]:measure_range[1],:]
samples = detrend2(samples)
samples = samples*self.window

sp = np.fft.fft2(samples,s=(-1,self.N),norm='ortho')

for i in range(measure_range[1]-measure_range[0]):
    freq_pow = np.sqrt(sp[i].real*sp[i].real +sp[i].imag*sp[i].imag )
    _,index = self.searchpeak(freq_pow,range(s,e,1))
    bpms.append(self.bpmtable[index])

저장된 10초간의 데이터의 shape을 바꾼 후 측정할 양만 잘라내고, detrend와 window를 적용 후 fft를 수행한다. fft 수행 결과는 주파수 파워 스펙트럼으로 바꾸기 위해 간단한 연산 후 호흡수 범위내의 주파수를 검색해 호흡수를 측정한다. 

호흡수 범위내의 주파수 파워 스펙트럼과 가장 큰 에너지를 가진 주파수의 호흡수는 아래 그림과 같다. 

호흡수는 가장 많이 측정되는 호흡수 또는 평균을 사용하면 된다. 


5. 결론

uwb 레이더 신호를 사용하여 간단히 호흡수 측정 코드를 작성했다. 예외 상황이나 노이즈에 대한 처리가 부족하지만, 원리를 파악하는데 도움이 되길 바란다.



관련 글

UWB 레이더를 사용한 호흡수 측정 원리
uwb radar 신호 움직이는 물체 위치 측정 예제
detrend signal c source code
FFT용 윈도우 함수 구현 예제 소스 코드
uwb 레이더 심박수 측정 원리 와 예제 코드

댓글

이 블로그의 인기 게시물

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

간단한 cfar 알고리즘에 대해

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

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

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