웨이브 패턴 감지


80

저는 심전도에서 이미지를 읽고 그 안의 주요 파동 (P 파, QRS 복합체 및 T 파)을 각각 감지하려고합니다. 이제 이미지를 읽고 심전도의 값을 나타내는 (4.2; 4.4; 4.9; 4.7; ...)과 같은 벡터를 얻을 수 있습니다. 저는이 벡터를 통과 할 수있는 알고리즘이 필요합니다. 그리고이 파동이 언제 시작되고 끝나는 지 감지 할 수 있습니다.

다음은 그래프 중 하나의 예입니다.

대체 텍스트

그들이 항상 같은 크기를 가지고 있다면 쉬울 것입니다. 그러나 그것이 효과가있는 것 같지 않거나 심전도가 얼마나 많은 파동을 가질 것인지 알고 있었지만 그것은 다를 수도 있습니다. 누구에게 아이디어가 있습니까?

감사!

업데이트 중

내가 달성하려는 것의 예 :

파도를 감안할 때

대체 텍스트

벡터를 추출 할 수 있습니다.

[0; 0; 20; 20; 20; 19; 18; 17; 17; 17; 17; 17; 16; 16; 16; 16; 16; 16; 16; 17; 17; 18; 19; 20; 21; 22; 23; 23; 23; 25; 25; 23; 22; 20; 19; 17; 16; 16; 14; 13; 14; 13; 13; 12; 12; 12; 12; 12; 11; 11; 10; 12; 16; 22; 31; 38; 45; 51; 47; 41; 33; 26; 21; 17; 17; 16; 16; 15; 16; 17; 17; 18; 18; 17; 18; 18; 18; 18; 18; 18; 18; 17; 17; 18; 19; 18; 18; 19; 19; 19; 19; 20; 20; 19; 20; 22; 24; 24; 25; 26; 27; 28; 29; 30; 31; 31; 31; 32; 32; 32; 31; 29; 28; 26; 24; 22; 20; 20; 19; 18; 18; 17; 17; 16; 16; 15; 15; 16; 15; 15; 15; 15; 15; 15; 15; 15; 15; 14; 15; 16; 16; 16; 16; 16; 16; 16; 16; 16; 15; 16; 15; 15; 15; 16; 16; 16; 16; 16; 16; 16; 16; 15; 16; 16; 16; 16; 16; 15; 15; 15; 15; 15; 16; 16; 17; 18; 18; 19; 19; 19; 20; 21; 22; 22; 22; 22; 21; 20; 18; 17; 17; 15; 15; 14; 14; 13; 13; 14; 13; 13; 13; 12; 12; 12; 12; 13; 18; 23; 30; 38; 47; 51; 44; 39; 31; 24; 18; 16; 15; 15; 15; 15; 15; 15; 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;]

예를 들어 감지하고 싶습니다.

P 파 [19-37]

[51-64]의 QRS 콤플렉스

기타...


12
이것은 정말 흥미로운 문제입니다!
jonnii

15
질문 숙제 였으면 좋겠어요 !
caf

내 편집을 봐, 나는 당신의 편집에 응답했다 ...
rook

1
이 질문은 놀랍습니다. 솔루션을 업데이트하기 위해 컴퓨터로 돌아 가야했습니다. 나는 당신이 그것을 좋아하기를 바랍니다 :)
rook

이 분야에서 일한 사람 을 알고 있습니다. 여기 에서 그의 출판물 목록을 찾을 수 있습니다 . 그는 내가 정확하게 기억한다면 Hidden Markov Models를 사용하여 알려진 모양의 훈련 세트에 대한 파도를 안정적으로 감지하지만 논문에서 더 자세한 내용을 찾을 수 있습니다.
Stefano Borini

답변:


55

내가 할 첫 번째 일은 이미 거기에 무엇이 있는지 보는 것입니다 . 실제로이 특정 문제는 이미 많이 연구되었습니다. 다음은 정말 간단한 몇 가지 방법에 대한 간략한 개요입니다 : link .

나는 또 다른 대답에도 응답해야한다. 신호 처리 및 음악 정보 검색에 대한 연구를합니다. 표면적으로이 문제는 발병 감지와 유사하게 보이지만 문제 컨텍스트는 동일하지 않습니다. 이러한 유형의 생물학적 신호 처리, 즉 P, QRS 및 T 위상 검출 은 이러한 각 파형 의 특정 시간 영역 특성 에 대한 지식을 활용할 수 있습니다 . MIR의 발병 감지는 실제로 그렇지 않습니다. (적어도 신뢰할 수는 없습니다.)

QRS 감지에 잘 작동하는 한 가지 접근 방식 (노트 시작 감지에 반드시 필요한 것은 아님)은 동적 시간 왜곡입니다. 시간 영역 특성이 변하지 않을 때 DTW는 매우 잘 작동 할 수 있습니다. 다음은이 문제에 DTW를 사용하는 짧은 IEEE 문서입니다. link .

이것은 많은 방법을 비교하는 멋진 IEEE 잡지 기사입니다 : link . 많은 일반적인 신호 처리 모델이 시도되었음을 알 수 있습니다. 종이를 훑어보고 이해하는 것을 기본 수준에서 시도하십시오.

편집 :이 기사를 살펴본 후 웨이블릿 기반 접근 방식이 가장 직관적 인 것 같습니다. DTW도 잘 작동하고 거기에 DTW 모듈이 있지만 웨이블릿 접근 방식이 가장 좋습니다. 다른 누군가는 신호의 파생물을 이용하여 응답했습니다. 내 첫 번째 링크는 1990 년 이전의 방법을 조사하지만, 더 현대적인 방법만큼 강력하지 않다고 생각합니다.

편집 : 내가 기회를 얻을 때 간단한 솔루션을 제공하려고합니다, 그러나 이유 그들이 관계없이 모양의 다양한 매개 변수화에 유용하기 때문에 내가 웨이블릿 여기에 적합 생각은 시간 또는 진폭 스케일링 . 즉, 반복되는 시간적 모양이 같지만 시간 척도와 진폭이 다른 신호가있는 경우 웨이블릿 분석은 이러한 모양이 유사한 것으로 인식 할 수 있습니다 (대략적으로 말하면). 또한 제가이 카테고리에 필터 뱅크를 집중시키는 것입니다. 비슷한 것들.


나는 그것이 많은 것을 요구한다는 것을 알고 있지만 여전히 간단한 해결책을보기 위해 살 것입니다.
Diego

죄송합니다. 바쁘게 지냈어 요. 할 일 목록으로 돌아 왔습니다.
Steve Tjoa

4
상위 링크는 이제 죽었습니다. :(
basickarl 2015

죄송합니다. 이제 상위 두 링크가 수정되었습니다.
Steve Tjoa 2015-04-13

첫 번째 링크가 다시 다운되었지만 여기서 찾았습니다 . 그리고 그것은 IEEE이므로 계속 유지되어야합니다. 물론 비용 장벽이있는 경우 유사한 주제에 대한 많은 논문 이 있습니다.
Asaaj

17

이 퍼즐의 한 부분은 " 시작 감지 " 이며이 문제를 해결하기 위해 여러 복잡한 알고리즘이 작성되었습니다. 발병에 대한 자세한 정보는 다음과 같습니다 .

다음 조각은 Hamming Distance 입니다. 이 알고리즘을 사용하면 퍼지 비교를 수행 할 수 있습니다. 입력은 2 개의 배열이고 출력은 정수 "거리"또는 두 데이터 세트 간의 차이입니다. 숫자가 작을수록 2가 더 비슷합니다. 이것은 당신이 필요로하는 것에 매우 가깝지만 정확하지는 않습니다. 나는 새로운 거리를 계산하기 위해 Hamming Distance 알고리즘을 약간 수정했습니다. 아마도 이름이 있지만 그것이 무엇인지 모르겠습니다. 기본적으로 배열의 각 요소 사이의 절대 거리를 더하고 합계를 반환합니다. 다음은 파이썬 코드입니다.

import math

def absolute_distance(a1, a2, length):
       total_distance=0
       for x in range(0,length):
               total_distance+=math.fabs(a1[x]-a2[x])
       return total_distance

print(absolute_distance([1,3,9,10],[1,3,8,11],4))

이 스크립트는이 두 배열 사이의 거리 인 2를 출력합니다.

이제이 조각들을 모아 보겠습니다. 시작 감지를 사용하여 데이터 세트에서 모든 웨이브의 시작을 찾을 수 있습니다. 그런 다음 각 웨이브를 샘플 P-Wave와 비교하여 이러한 위치를 반복 할 수 있습니다. QRS Complex를 치면 거리가 가장 큽니다. 다른 P-Wave를 치면 숫자는 0이 아니지만 훨씬 더 작아집니다. P-Wave와 T-Wave 사이의 거리는 매우 작지만 다음과 같은 가정을하면 문제가되지 않습니다.

The distance between any p-wave and any other p-wave will be smaller than the distance between any p-wave and any t-wave.

시리즈는 다음과 같습니다. pQtpQtpQt ... p-wave와 t-wave는 서로 바로 옆에 있지만이 시퀀스는 예측 가능하기 때문에 읽기가 더 쉽습니다.

그렇지 않은 편에는이 문제에 대한 미적분 기반 솔루션이있을 것입니다. 그러나 내 마음에 커브 피팅과 적분은이 문제를 더 엉망으로 만듭니다. 내가 작성한 거리 함수 는 두 곡선의 적분을 뺀 것과 매우 유사한 면적 차이 를 찾을 수 있습니다 .

한 번에 1 포인트 씩 반복하여 O (n) 거리 계산을 수행하는 대신 시작 계산을 희생 할 수 있습니다. 여기서 n은 그래프의 포인트 수입니다. 이러한 모든 거리 계산 목록이 있고 50 개의 pQt 시퀀스가 ​​어디에 있는지 알고 있다면 p- 파의 모든 위치에서 겹치지 않는 50 개의 최단 거리를 알 있습니다. 빙고! 단순함을 위해 어떻습니까? 그러나 트레이드 오프는 거리 계산의 증가로 인한 효율성 손실입니다.


시간 영역 진폭의 증가감지하는 것과 같은 더 간단한 기술 은 일반적으로 불만족스럽게 많은 양의 위양성 또는 위음성으로 이어질 수 있습니다. 그것이 제가 두려워했던 것입니다. 나는 내 (최적화되지 않은) 솔루션에서 동일한 것을 제안했습니다.
Vivin Paliath

3
예, 당신의 알고리즘은 흥미롭고 성공이 제한적일 수 있습니다. 이것은 완벽한 해결책이없는 정말 복잡한 문제입니다.
rook

귀하의 답변에 감사드립니다. Michael, 나는 그것에 대해 생각하고 있으며 곧 피드백을 게시 할 것입니다!
Alaor

8

상호 상관을 사용할 수 있습니다 . 각 패턴의 모델 샘플을 가져와 신호와 연관시킵니다. 상관 관계가 높은 곳에서 피크를 얻을 수 있습니다. qrs와 t 파를 추출하는이 기술로 좋은 결과를 기대합니다. 그 후 qrs 이전의 상관 신호에서 피크를 찾아 p 파를 추출 할 수 있습니다.

상호 상관은 알고리즘을 구현하기가 매우 쉽습니다. 원래:

x is array with your signal of length Lx
y is an array containing a sample of the signal you want to recognize of length Ly
r is the resulting correlation

for (i=0; i<Lx - Ly; i++){
  r[i] = 0;
  for (j=0; j<Ly ; j++){
    r[i] += x[i+j]*y[j];
  }
}

그리고 r에서 피크를 찾습니다 (예 : 임계 값을 초과하는 값).


웨이브가 항상 특정 패턴을 따르기 때문에 이것은 시도하기 좋은 첫 번째 방법입니다. 그러나이 문제의 경우 시간 스케일링과 진폭 스케일링이 모두 다를 수 있으므로 궁극적으로이 접근 방식은 주제 전반에 걸쳐 강력하지 않습니다.
스티브 조아

예, 이는 첫 번째 접근 방식 일뿐입니다. 강력하지는 않지만 시도해 볼 수있을만큼 간단합니다. 패턴 일치는 일반적으로 가장 쉬운 기술이며 여전히 일부 결과를 제공합니다. 물론 웨이블릿은 훨씬 낫습니다.
nacmartin 2010

7

가장 먼저 할 일은 데이터를 단순화하는 것입니다.

절대 데이터를 분석하는 대신 한 데이터 포인트에서 다음 데이터 포인트로의 변화량을 분석하십시오.

다음은 ;분리 된 데이터를 입력으로 받아 해당 데이터의 델타를 출력 하는 빠른 라이너입니다 .

perl -0x3b -ple'( $last, $_ ) = ( $_, $_-$last )' < test.in > test.out

제공 한 데이터에서 실행하면 다음과 같이 출력됩니다.

0; 0; 20; 0; 0; -1; -1; -1; 0; 0; 0; 0; -1; 0; 0; 0; 0; 0; 0; 1; 0; 1; 1; 1; 1; 1; 1; 0; 0; 2; 0; -2; -1; -2; -1; -2; -1; 0; -2; -1; 1; -1; 0;- 1; 0; 0; 0; 0; -1; 0; -1; 2; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4; 0; -1; 0;- 1; 1; 1; 0; 1; 0; -1; 1; 0; 0; 0; 0; 0; 0; -1; 0; 1; 1; -1; 0; 1; 0; 0; 0 ; 1; 0; -1; 1; 2; 2; 0; 1; 1; 1; 1; 1; 1; 1; 0; 0; 1; 0; 0; -1; -2; -1; -2; -2; -2; -2 ; 0; -1; -1; 0; -1; 0; -1; 0; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; 1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; -1; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; -1; 1; 0; 0; 0; 0 ; -1; 0; 0; 0; 0; 1; 0; 1; 1; 0; 1; 0; 0; 1; 1; 1; 0; 0; 0; -1; -1; -2;- 1; 0; -2; 0; -1; 0; -1; 0; 1; -1; 0; 0; -1; 0; 0; 0; 1; 5; 5; 7; 8; 9; 4; -7; -5; -8 ; -7; -6; -2; -1; 0; 0; 0; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; -1; 1; 0; 0; 0 ; 1; 0; 0; 0; 1; 0; 1; 0; 0; 0; 1; 1; 0; 2; 1; 1; 1; 1; 1; 1; 1; 1; 1; -1; 1; 0; 0; -1; -2; -2; -2; -2; -1; 0; -1; -2; -1; 0; -1; -1; 0; 1; -1; 1; 0; -1; 1; -1; 1; 0; -1; 0; 0; 0; -1; 1; 0; 0; 1; 0; -1; 0; 1; 0; 0; 1; -1; 0; -1; 1; 0; -1; 0; 0 ; 0; 0; 1; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 1; -1; 0; 1; 0; 0; 2; 0; 1; 0; 1; 1; 1; -1; 0; -2; 0; -1; -2; 0; -1; -1; -2; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 0; 0; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4; -2; -2; 0; 0; 0; -1; 1; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; 0; 0; 1; -1; 0; 1; 1; 0; 0; 0; 0; 1; 0; 1; 0; 1; 2; 1; 1; 2; 0; 1 ; 1; 1; 1; 0; 0; 1; 1; 0; 0; -35; 0; 0; 0;

출력에 원래 존재하지 않는 위의 텍스트에 삽입 된 줄 바꿈이 있습니다.


그 후에 qrs 콤플렉스를 찾는 것은 간단합니다.

perl -F';' -ane'@F = map { abs($_) > 2 and $_ } @F; print join ";", @F'< test.out

;; 20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;; 5; 5; 7; 8; 9; 4; -7; -5; -8; -7; -6
;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-35 ;;;

20-35데이터 포인트는 시작과 끝 원본 데이터의 결과0 .

다른 데이터 포인트를 찾으려면 패턴 일치에 의존해야합니다.


첫 번째 p 파를 보면 패턴을 명확하게 볼 수 있습니다.

0;0;0;0;0;0;1;0;1;1;1;1;1;1;0;0;2;0;-2;-1;-2;-1;-2;-1;0;-2;-1;1;-1;0;-1;0;0;0;0;
#           \________ up _______/   \________ down _________/

하지만 두 번째 p 파에서 패턴을 보는 것은 쉽지 않습니다. 이것은 두 번째가 더 멀리 퍼져 있기 때문입니다.

0;0;0;1;0;1;1;0;1;0;0;1;1;1;0;0;0;-1;-1;-2;-1;0;-2;0;-1;0;-1;0;1;-1;0;0;-1;0;0;0;
#     \________ up _______/       \________________ down ________________/

세 번째 p 파동은 다른 두 파동보다 약간 더 불규칙합니다.

0;0;0;0;0;1;-1;0;1;0;0;2;0;1;0;1;1;1;-1;0;-2;0;-1;-2;0;-1;-1;-2;-1;0;0;0;0;0;
#                \_______ up ______/  \__________ down __________/

p 파와 비슷한 방식으로 t 파를 찾을 수 있습니다. 주요 차이점은 언제 발생하는지입니다.


시작하기에 충분한 정보 여야합니다.

두 개의 원 라이너는 예를 들어 일상적인 사용에는 권장되지 않습니다.


나는 이것을 편집하여 페이지를 나누는 외설적으로 긴 줄을 제거했습니다. : P
GManNickG 2010

@GMan 나에게 잘 작동하고 있었는데 어떤 브라우저를 사용하고 있습니까?
Brad Gilbert

Firefox 3.5에서는 페이지가 가로로 늘어났습니다. 알려진 버그라고 생각합니다.
GManNickG 2010

1
-1 : 사용자가 데이터를 플로팅하고 시작점을 직접 선택하여 수행 할 수있는 문제 해결에 대한 수동 접근 방식 만 보입니다.
Hannes Ovrén 2010

4

다른 두 개의 날카로운 봉우리와 계곡도 qrs 복합체입니까?

머리 꼭대기에서해야 할 일은 각 지점에서이 그래프의 기울기를 계산하는 것입니다. 그런 다음 경사가 얼마나 빨리 변하는 지 확인해야합니다 (2 차 미분 ???). 갑작스런 변화가 있으면 어떤 종류의 급격한 정점에 도달 한 것입니다. 물론 변화 감지를 제한하고 싶으므로 "시간 간격 T에 따라 기울기가 X만큼 변경되는 경우"와 같은 작업을 수행하여 그래프에서 작은 범프를 포착하지 않도록 할 수 있습니다.

내가 수학을 한 지 오래되었습니다 ... 그리고 이것은 수학 질문처럼 보입니다;) 아, 그리고 나는 어떤 종류의 신호 분석도하지 않았습니다 :).

다른 요점을 추가하는 것뿐입니다. 제 생각에 신호 평균화를 시도 할 수도 있습니다. 예를 들어, 마지막 3 개 또는 4 개의 데이터 포인트를 평균화합니다. 내가 생각하는 당신이 너무 길 급격한 변화를 감지 할 수 있습니다.


흥미로운 알고리즘에 +1. 하지만이 문제는 좀 더 복잡하다고 생각합니다.
rook

네, 다른 두 봉우리와 계곡은 qrs 복합체입니다. 이미지에는 실제로 3p 파, 3qrs 복합체 및 3t 파가 있습니다. 흥미로운 접근 방식이지만 함수가 없으면 2 차 도함수를 어떻게 계산할 수 있는지 모르겠습니다. 가치의 변화에 ​​점수를 부여하고 무언가의 시작과 끝과 같이 점수가 높은 변화를 선택하는 것입니다. 나는 그것을 시도하고 몇 가지 결과가 나오면 uptade를 게시 할 것입니다. 대답 해 주셔서 감사합니다.
Alaor

네, 거의. 점수를 매기는 것이지만 기울기를 계산하거나 시간에 따라 진폭이 어떻게 변하는 지 확인하는 것입니다.
Vivin Paliath

4

저는이 특정 문제에 대한 전문가는 아니지만 좀 더 일반적인 지식에서 머리 위에 있습니다. QRS 컴플렉스 (또는 다른 기능 중 하나를 알고 있지만이 예에서는 QRS 컴플렉스를 사용하겠습니다)를 알고 있다고 가정 해 보겠습니다. 길이 L의 고정 된 시간 동안 발생합니다. 다음과 같이 분류 문제로 처리 할 수 ​​있는지 궁금합니다.

  1. 신호를 길이가 L 인 겹치는 창으로 분할합니다. 각 창에는 전체 QRS 콤플렉스가 있거나 없습니다.
  2. 푸리에는 각 창을 변환합니다. 귀하의 특징은 각 주파수의 신호 강도입니다.
  3. 손으로 주석을 단 데이터에 대해 의사 결정 트리, 지원 벡터 머신 등을 훈련시킵니다.

3

좋은 결과를 얻을 수있는 한 가지 방법은 곡선 피팅입니다.

  • 연속파를 간격으로 나눕니다 (아마 qrs 복합체의 날카로운 피크 사이의 중간 정도 간격 경계를 갖는 것이 가장 좋습니다). 한 번에 하나의 간격 만 고려하십시오.
  • 심전도 곡선의 가능한 모든 변형을 근사화하는 데 사용할 수있는 모델 함수를 정의합니다. 이것은 처음 보이는 것만 큼 어렵지 않습니다. 모델 함수는 각 파동의 원점 (t_), 진폭 (a_) 및 폭 (w_)에 대한 매개 변수가있는 세 가지 함수의 합으로 구성 될 수 있습니다.

       f_model(t) = a_p   *  f_p  ((t-t_p  )/w_p) + 
                    a_qrs *  f_qrs((t-t_qrs)/w_qrs) +
                    a_t   *  f_t  ((t-t_t  )/w_t)
    

    기능 f_p(t), f_qrs(t),f_t(t) 용도는 세 파 각각을 모델링 할 수있는 간단한 함수이다.

  • 피팅 알고리즘을 사용하십시오 (예 : Levenberg-Marquardt-Algorithm http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm )을 사용하여 피팅 매개 변수 a_p, t_p, w_p, a_qrs, t_qrs, w_qrs, a_t를 결정합니다. , t_t, w_t는 각 간격의 데이터 세트에 대해

    t_p, t_qrs 및 t_p 매개 변수는 관심있는 매개 변수입니다.


3

이것은 멋진 질문입니다! 몇 가지 생각이 있습니다.

동적 시간 왜곡 은 여기서 흥미로운 도구가 될 수 있습니다. 세 가지 클래스에 대한 "템플릿"을 설정 한 다음 DTW를 사용하면 템플릿과 신호의 "청크"사이의 상관 관계를 확인할 수 있습니다 (예를 들어 신호를 .5 초 비트, 즉 0-.5. 1-.6 .2-.7 ...). 가속도계 데이터를 사용하여 보행 분석을 위해 비슷한 작업을 해봤지만 상당히 잘 작동했습니다.

또 다른 옵션은 결합 된 신호 처리 / 기계 학습 알고리즘입니다. 신호를 다시 "덩어리"로 나누십시오. "템플릿"을 다시 만듭니다 (각 클래스에 대해 12 개 정도 필요). 각 청크 / 템플릿 의 FFT취한 다음 Naïve Bayes 분류기 (또는 다른 ML 분류기,하지만 NB는이를 잘라 내야 함)를 사용하여 각각을 분류합니다. 세 개의 수업. 나는 또한 보행 데이터에 대해 이것을 시도했고, 98 % 이상의 정밀도를 얻고 상대적으로 복잡한 신호로 리콜 할 수있었습니다. 이것이 어떻게 작동하는지 알려주세요. 매우 흥미로운 문제입니다.


1

" Wavelet transform "은 관련 키워드 일 수 있습니다. 저는이 기술을 사용하여 시끄러운 심전도에서 다른 심장 박동 단계를 감지 한 누군가의 프레젠테이션에 참석 한 적이 있습니다.

내 제한된 이해에 관한 한, 그것은 푸리에 변환과 다소 비슷하지만 귀하의 경우에는 심장 박동 모양의 펄스의 (스케일링 된) 사본을 사용합니다.


1

웨이블릿은 피크가 "다른 크기"인 이러한 유형의 데이터에서 피크를 찾는 데 가장 좋은 도구 인 것으로 나타났습니다. 웨이블릿의 스케일링 속성은 이러한 유형의 다중 스케일 피크 검출에 이상적인 도구입니다. 이것은 비정상 신호처럼 보이므로 DFT를 사용하는 것은 일부가 제안한 것처럼 올바른 도구가 아니지만 이것이 탐색 적 프로젝트 인 경우 신호의 스펙트럼을 사용하여 볼 수 있습니다 (본질적으로 자기 상관의 FFT를 사용하여 추정 됨). 신호.)

다음 은 몇 가지 피크 감지 방법을 검토하는 훌륭한 문서입니다. 시작하기에 좋은 곳입니다.

-폴


1

BioSPPY 사용

현재로서는 R 파 분석 만 포함하고 있으므로 T 파 분석을 구현할 수 없습니다. 예 : Tstart Tpeak Tend

자동으로 암시되지 않습니다

자신의 분석을 사용해야합니다.

내 제안은 아래 방법을 시도하고 구현하는 것입니다.

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3201026/

최근에 제가 발견했고 매우 흥미로 웠던 것입니다.

살펴볼만한 다른 t-wave 분석 방법은 ECGlib 팀이

http://ieeexplore.ieee.org/document/6713536/

도움이 되었기를 바랍니다


0

나는 서로의 대답을 철저히 읽지 않았지만 그들을 스캔했고 아무도 이러한 파도를 분할하기 위해 푸리에 변환을 보는 것을 권장하지 않는다는 것을 알았습니다.

나에게 그것은 수학에서 고조파 분석 의 명확한 적용처럼 보인다 . 내가 놓칠 수있는 몇 가지 미묘한 점이있을 수 있습니다.

이산 푸리에 변환 계수가 당신에게 당신의 문제가 찾으려 상태 무엇을 본질적으로 당신의 이산 시간 신호를 구성하는 다른 정현파 성분의 진폭과 위상을 제공합니다.

그래도 여기에 뭔가 빠졌을 수 있습니다 ...


고조파 분석이 여기에 적용된다는 점은 맞지만 문제의 특이성으로 인해 웨이블릿 분석과 같은 특정 접근 방식이 크기 응답 만 검사하는 일반 접근 방식보다 더 잘 작동 할 수 있습니다. 이 문제의 경우 상대 위상 오프셋이 중요 합니다.
Steve Tjoa 2010

0

첫째, 표준 심전도의 다양한 구성 요소가 주어진 플롯에서 누락 될 수 있습니다. 이러한 플롯은 일반적으로 비정상이며 일반적으로 일종의 문제를 나타내지 만 거기에 있다고 약속 할 수는 없습니다.

둘째, 그것들을 인식하는 것은 특히 무언가 잘못되고있는 경우에 과학만큼이나 예술입니다.

내 접근 방식은 구성 요소를 식별하기 위해 신경망을 훈련시키는 것입니다. 가장 낮은 지점은 0이고 가장 높은 지점은 1.0이고 11 개의 출력을 가지도록 정규화 된 이전 30 초의 데이터를 제공합니다. 비정상 등급이 아닌 출력은 지난 10 초 동안의 가중치가됩니다. 0.0은 현재로부터 -10 초이고 1.0은 현재를 의미합니다. 출력은 다음과 같습니다.

  1. 가장 최근의 P 파가 시작된 곳
  2. 가장 최근의 P 파가 끝난 곳
  3. 가장 최근의 P 파의 이상 등급 (한 극단이 '없음')입니다.
  4. 가장 최근의 QRS 단지가 시작된 곳
  5. 가장 최근 QRS 콤플렉스의 Q 부분이 R 부분으로 바뀐 곳.
  6. 가장 최근 QRS 컴플렉스의 R 부분이 S 부분으로 바뀐 곳.
  7. 가장 최근의 QRS 컴플렉스가 끝난 곳.
  8. 하나의 극단이 '부재'인 최신 QRS 복합체의 이상 등급입니다.
  9. 가장 최근의 T 파가 시작된 곳.
  10. 가장 최근의 T 파가 끝난 곳.
  11. 가장 최근 T 파의 이상 등급 중 하나는 '부재'입니다.

사람들이 제안한 다른 종류의 분석으로 이것을 다시 확인하거나 신경망의 출력과 함께 다른 종류의 분석을 사용하여 답을 줄 수 있습니다.

물론 신경망에 대한이 상세한 설명은 규범적인 것으로 받아 들여서는 안됩니다. 예를 들어, 가장 최적의 결과물을 반드시 선택하지는 않았다고 확신합니다. 그저 그것들이 무엇인지에 대해 약간의 아이디어를 던졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.