Muster in Wellen erkennen


80

Ich versuche, ein Bild aus einer Elektrokardiographie zu lesen und jede der Hauptwellen darin zu erfassen (P-Welle, QRS-Komplex und T-Welle). Jetzt kann ich das Bild lesen und einen Vektor wie (4.2; 4.4; 4.9; 4.7; ...) erhalten, der für die Werte in der Elektrokardiographie repräsentativ ist, was die Hälfte des Problems ist. Ich brauche einen Algorithmus, der durch diesen Vektor gehen und erkennen kann, wann jede dieser Wellen beginnt und endet.

Hier ist ein Beispiel für eines seiner Diagramme:

Alt-Text

Wäre einfach, wenn sie immer die gleiche Größe hätten, aber es funktioniert nicht so, oder wenn ich wüsste, wie viele Wellen das EKG haben würde, aber es kann auch variieren. Hat jemand ein paar Ideen?

Vielen Dank!

Aktualisierung

Beispiel für das, was ich erreichen möchte:

Angesichts der Welle

Alt-Text

Ich kann den Vektor extrahieren

[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;]

Ich möchte zum Beispiel erkennen

P-Welle in [19 - 37]

QRS-Komplex in [51 - 64]

usw...


12
Das ist ein wirklich interessantes Problem!
Jonnii

15
Dies ist eine Zeit , wo ich hoffe wirklich , die Frage ist Hausaufgaben!
Café

Schauen Sie sich meine Bearbeitung an, ich habe auf Ihre Änderungen geantwortet ...
Turm

1
Diese Frage ist ERSTAUNLICH. Ich musste zu meinem Computer zurückkehren, um meine Lösung zu aktualisieren. Ich hoffe es gefällt euch :)
Turm

Ich kenne einen Mann, der auf diesem Gebiet gearbeitet hat. Hier finden Sie eine Liste seiner Publikationen . Wenn ich mich recht erinnere, verwendet er Hidden Markov Models, um Wellen gegen einen Trainingssatz bekannter Formen zuverlässig zu erkennen. Weitere Details finden Sie in den Artikeln.
Stefano Borini

Antworten:


55

Das erste, was ich tun würde, ist zu sehen, was schon da draußen ist . In der Tat wurde dieses spezifische Problem bereits intensiv untersucht. Hier ist eine kurze Übersicht über einige wirklich einfache Methoden: Link .

Ich muss auch auf eine andere Antwort antworten. Ich forsche in der Signalverarbeitung und beim Abrufen von Musikinformationen. Oberflächlich betrachtet ähnelt dieses Problem der Erkennung des Beginns, aber der Problemkontext ist nicht der gleiche. Diese Art der biologischen Signalverarbeitung, dh die Erfassung der P-, QRS- und T-Phasen, kann das Wissen über spezifische Zeitbereichseigenschaften jeder dieser Wellenformen nutzen. Onset-Erkennung in MIR nicht wirklich. (Zumindest nicht zuverlässig.)

Ein Ansatz, der für die QRS-Erkennung gut geeignet wäre (aber nicht unbedingt für die Erkennung des Einsetzens von Noten), ist die dynamische Zeitverzerrung. Wenn die Zeitbereichseigenschaften unveränderlich bleiben, kann DTW bemerkenswert gut funktionieren. Hier ist ein kurzes IEEE-Papier, das DTW für dieses Problem verwendet: link .

Dies ist ein schöner Artikel im IEEE-Magazin, der viele Methoden vergleicht: link . Sie werden sehen, dass viele gängige Signalverarbeitungsmodelle ausprobiert wurden. Überfliegen Sie das Papier und probieren Sie eines aus, das Sie auf einer grundlegenden Ebene verstehen.

BEARBEITEN: Nach dem Durchsuchen dieser Artikel erscheint mir ein Wavelet-basierter Ansatz am intuitivsten. DTW wird auch gut funktionieren, und es gibt DTW-Module, aber der Wavelet-Ansatz scheint mir am besten zu sein. Jemand anderes antwortete, indem er Ableitungen des Signals ausnutzte. Mein erster Link untersucht Methoden aus der Zeit vor 1990, die dies tun, aber ich vermute, dass sie nicht so robust sind wie modernere Methoden.

EDIT: Ich werde versuchen, eine einfache Lösung zu finden, wenn ich die Gelegenheit dazu bekomme, aber der Grund, warum ich denke, dass Wavelets hier geeignet sind, liegt darin, dass sie nützlich sind, um eine Vielzahl von Formen unabhängig von Zeit- oder Amplitudenskalierung zu parametrisieren . Mit anderen Worten, wenn Sie ein Signal mit derselben wiederholten zeitlichen Form, aber mit unterschiedlichen Zeitskalen und Amplituden haben, kann die Wavelet-Analyse diese Formen immer noch als ähnlich erkennen (grob gesagt). Beachten Sie auch, dass ich Filterbänke in diese Kategorie einreihe. Ähnliche Dinge.


Ich weiß, dass es viel verlangt, aber ich würde immer noch eine einfache Lösung erleben.
Diego

Entschuldigen Sie. Ich war beschäftigt. Es ist wieder auf meiner To-Do-Liste.
Steve Tjoa

4
Top Link ist jetzt tot :(
basickarl

Es tut uns leid. Die beiden obersten Links sind jetzt behoben.
Steve Tjoa

Der erste Link ist wieder unten, aber ich habe ihn hier gefunden . Und es ist IEEE, also sollte es aufbleiben, würde ich mir vorstellen. Wenn es eine Kostenbarriere gibt, gibt es natürlich viele Artikel zu ähnlichen Themen.
Asaaj

17

Ein Teil dieses Puzzles ist die " Onset Detection ", und eine Reihe komplexer Algorithmen wurden geschrieben, um dieses Problem zu lösen. Hier finden Sie weitere Informationen zu Einsätzen .

Das nächste Stück ist eine Hamming Distance . Mit diesen Algorithmen können Sie Fuzzy-Vergleiche durchführen. Die Eingabe besteht aus 2 Arrays und die Ausgabe ist eine ganzzahlige "Entfernung" oder Differenz zwischen den beiden Datensätzen. Je kleiner die Zahl, desto ähnlicher sind die 2. Dies ist sehr nah an dem, was Sie brauchen, aber es ist nicht genau. Ich habe einige Änderungen am Hamming-Distanz-Algorithmus vorgenommen, um eine neue Distanz zu berechnen. Er hat wahrscheinlich einen Namen, aber ich weiß nicht, was er ist. Grundsätzlich addiert es den absoluten Abstand zwischen jedem Element im Array und gibt die Summe zurück. Hier ist der Code dafür in Python.

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))

Dieses Skript gibt 2 aus, dh den Abstand zwischen diesen beiden Arrays.

Nun zum Zusammenstellen dieser Teile. Sie können die Onset-Erkennung verwenden, um den Anfang aller Wellen im Datensatz zu finden. Sie können dann diese Position durchlaufen, indem Sie jede Welle mit einer Beispiel-P-Welle vergleichen. Wenn Sie einen QRS-Komplex treffen, ist die Entfernung am größten. Wenn Sie eine andere P-Welle treffen, wird die Zahl nicht Null sein, aber sie wird viel kleiner sein. Der Abstand zwischen einer P-Welle und einer T-Welle wird ziemlich klein sein. Dies ist jedoch kein Problem, wenn Sie die folgende Annahme treffen:

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.

Die Serie sieht ungefähr so ​​aus: pQtpQtpQt ... Die p-Welle und die t-Welle liegen direkt nebeneinander, aber da diese Sequenz vorhersehbar ist, ist sie leichter zu lesen.

Auf der anderen Seite gibt es wahrscheinlich keine kalkülbasierte Lösung für dieses Problem. In meinen Augen machen Kurvenanpassung und Integrale dieses Problem jedoch eher zu einem Chaos. Die Distanzfunktion, die ich geschrieben habe, findet die Flächendifferenz, die sehr ähnlich ist, indem das Integral beider Kurven subtrahiert wird.

Es ist möglicherweise möglich, die Onset-Berechnungen zugunsten einer Iteration um jeweils 1 Punkt zu opfern und somit O (n) -Distanzberechnungen durchzuführen, wobei n die Anzahl der Punkte in der Grafik ist. Wenn Sie eine Liste all dieser Entfernungsberechnungen hätten und dort wüssten, wo 50 pQt-Sequenzen sind, dann würden Sie die 50 kürzesten Entfernungen kennen, die sich nicht überlappen, wo alle Orte der p-Wellen liegen. Bingo! Wie ist das der Einfachheit halber? Der Kompromiss ist jedoch ein Effizienzverlust aufgrund einer erhöhten Anzahl von Entfernungsberechnungen.


Einfachere Techniken wie das Erfassen von Erhöhungen der Zeitbereichsamplitude können typischerweise zu einer unbefriedigend hohen Menge an falsch positiven oder falsch negativen Ergebnissen führen. Davor hatte ich Angst. Ich hatte dasselbe in meiner (weniger als optimalen) Lösung vorgeschlagen.
Vivin Paliath

3
Ja, dein Algo ist interessant und du hast vielleicht nur begrenzten Erfolg. Dies ist ein wirklich komplexes Problem, bei dem es keine perfekte Lösung gibt.
Turm

Danke für deine Antwort Michael, ich denke darüber nach und werde bald ein Feedback posten!
Alaor

8

Sie können Kreuzkorrelation verwenden . Nehmen Sie von jedem Muster eine Modellprobe und korrelieren Sie sie mit dem Signal. Sie erhalten Peaks, bei denen die Korrelation hoch ist. Ich würde gute Ergebnisse mit dieser Technik erwarten, die qrs- und t-Wellen extrahiert. Danach können Sie p-Wellen extrahieren, indem Sie nach Spitzen auf dem Korrelationssignal suchen, die vor qrs liegen.

Kreuzkorrelation ist ein ziemlich einfach zu implementierender Algorithmus. Grundsätzlich:

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];
  }
}

Und suchen Sie nach Peaks in r (z. B. Werte über einem Schwellenwert).


Dies ist ein guter erster Ansatz, da die Welle immer einem bestimmten Muster folgt. Bei diesem Problem können jedoch sowohl die Zeitskalierung als auch die Amplitudenskalierung variieren, sodass dieser Ansatz letztendlich nicht für alle Subjekte robust ist.
Steve Tjoa

Ja, es ist nur ein erster Ansatz. Nicht robust, aber einfach genug zu codieren, um es auszuprobieren. Der Mustervergleich ist normalerweise die einfachste Technik und liefert dennoch einige Ergebnisse. Wavelets sind natürlich definitiv viel besser.
Nacmartin

7

Das erste, was ich tun würde, ist die Daten zu vereinfachen.

Anstatt absolute Daten zu analysieren, analysieren Sie das Ausmaß der Änderung von einem Datenpunkt zum nächsten.

Hier ist ein schneller Einzeiler, der ;getrennte Daten als Eingabe verwendet und das Delta dieser Daten ausgibt.

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

Wenn Sie es mit den von Ihnen angegebenen Daten ausführen, ist dies die Ausgabe:

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; 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; 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; 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;

In den obigen Text sind neue Zeilen eingefügt, die ursprünglich nicht in der Ausgabe vorhanden waren.


Nachdem Sie dies getan haben, ist es trivial, den qrs-Komplex zu finden.

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 ;;;

Die 20und -35Datenpunkte ergeben sich aus den Originaldaten, die mit beginnen und enden 0.

Um die anderen Datenpunkte zu finden, müssen Sie sich auf den Mustervergleich verlassen.


Wenn Sie sich die erste p-Welle ansehen, sehen Sie deutlich ein Muster.

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 _________/

Es ist jedoch nicht so einfach, das Muster auf der zweiten p-Welle zu erkennen. Dies liegt daran, dass der zweite weiter verteilt ist

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 ________________/

Die dritte p-Welle ist etwas unregelmäßiger als die beiden anderen.

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 __________/

Sie würden die t-Wellen auf ähnliche Weise wie die p-Wellen finden. Der Hauptunterschied besteht darin, wann sie auftreten.


Dies sollten genügend Informationen sein, um Ihnen den Einstieg zu erleichtern.

Die beiden Einzeiler sind zum Beispiel nur nicht für den täglichen Gebrauch zu empfehlen.


Ich habe dies bearbeitet, um die obszön lange Zeile zu entfernen, die die Seite unterbrochen hat. : P
GManNickG

@GMan Es hat gut funktioniert für mich, welchen Browser benutzt du?
Brad Gilbert

Firefox 3.5, diese Linie streckte die Seite horizontal. Es ist ein bekannter Fehler, denke ich.
GManNickG

1
-1: Ich sehe nur einen manuellen Ansatz zur Lösung des Problems, den die Benutzer hätten durchführen können, indem sie einfach die Daten geplottet und die Startpunkte selbst ausgewählt hätten.
Hannes Ovrén

4

Sind diese beiden anderen scharfen Gipfel und Täler ebenfalls qrs-Komplexe?

Ich denke, Sie müssen die Steigung dieses Diagramms an jedem Punkt berechnen. Dann müssen Sie auch sehen, wie schnell sich die Steigung ändert (2. Ableitung ???). Wenn Sie eine abrupte Veränderung haben, wissen Sie, dass Sie einen scharfen Höhepunkt erreicht haben. Natürlich möchten Sie die Erkennung der Änderung einschränken, also möchten Sie möglicherweise etwas tun wie "Wenn sich die Steigung über das Zeitintervall T um X ändert", damit Sie die winzigen Unebenheiten im Diagramm nicht erkennen.

Es ist schon eine Weile her, dass ich Mathe gemacht habe ... und das scheint eine Mathe-Frage zu sein;) Oh, und ich habe auch keine Signalanalyse gemacht :).

Fügen Sie einfach einen weiteren Punkt hinzu. Sie können auch versuchen, das Signal zu mitteln, denke ich. Beispiel: Mittelung der letzten 3 oder 4 Datenpunkte. Ich denke, so kann man auch abrupte Veränderungen erkennen.


+1 für eine interessante Algo. Aber ich denke, dieses Problem ist etwas komplexer.
Turm

Ja, die beiden anderen Gipfel und Täler sind QRS-Komplexe. Das Bild hat tatsächlich 3 p-Wellen, 3 qrs-Komplexe und 3 t-Wellen. Das ist ein interessanter Ansatz, aber ich sehe nicht, wie ich die 2. Ableitung berechnen kann, wenn ich keine Funktion habe. Ich denke, Sie sagen, Sie sollen den Änderungen der Werte eine Bewertung geben und diejenigen Änderungen auswählen, die hohe Bewertungen haben, wie den Anfang und das Ende von etwas, oder? Ich werde es versuchen und eine Aktualisierung veröffentlichen, wenn ich einige Ergebnisse erhalte. Danke für die Antwort.
Alaor

Ja, fast. Sie bewerten es irgendwie, aber Sie tun dies, indem Sie die Steigung berechnen oder sehen, wie sich die Amplitude im Laufe der Zeit ändert.
Vivin Paliath

4

Ich bin kein Experte für dieses spezielle Problem, aber aus allgemeinerem Wissen heraus: Nehmen wir an, Sie kennen den QRS-Komplex (oder eine der anderen Funktionen, aber ich werde den QRS-Komplex für dieses Beispiel verwenden). findet in ungefähr einem festgelegten Zeitraum der Länge L statt. Ich frage mich, ob Sie dies wie folgt als Klassifizierungsproblem behandeln könnten:

  1. Teilen Sie Ihr Signal in überlappende Fenster der Länge L auf. Jedes Fenster enthält entweder den vollständigen QRS-Komplex oder nicht.
  2. Fourier-Transformation jedes Fensters. Ihre Merkmale sind die Signalstärke bei jeder Frequenz.
  3. Trainieren Sie einen Entscheidungsbaum, eine Support-Vektor-Maschine usw. für einige von Hand kommentierte Daten.

3

Ein Ansatz, der sehr wahrscheinlich gute Ergebnisse liefert, ist die Kurvenanpassung:

  • Teilen Sie die kontinuierliche Welle in Intervalle (wahrscheinlich ist es am besten, wenn die Intervallgrenzen etwa auf halber Strecke zwischen den scharfen Spitzen der qrs-Komplexe liegen). Berücksichtigen Sie jeweils nur ein Intervall.
  • Definieren Sie eine Modellfunktion, mit der alle möglichen Variationen von Elektrokardiographiekurven angenähert werden können. Dies ist nicht so schwierig, wie es zunächst scheint. Die Modellfunktion kann als Summe von drei Funktionen mit Parametern für den Ursprung (t_), die Amplitude (a_) und die Breite (w_) jeder Welle konstruiert werden.

       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)
    

    Die Funktionen f_p(t), f_qrs(t), f_t(t)sind einige einfache Funktion , die Anwendungen jeder der drei Wellen zu modellieren sein kann.

  • Verwenden Sie einen Anpassungsalgorithmus (z. B. den Levenberg-Marquardt-Algorithmus http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm ), um die Anpassungsparameter a_p, t_p, w_p, a_qrs, t_qrs, w_qrs, a_t zu bestimmen , t_t, w_t für den Datensatz jedes Intervalls.

    Die Parameter t_p, t_qrs und t_p sind diejenigen, die Sie interessieren.


3

Das ist eine wunderbare Frage! Ich habe ein paar Gedanken:

Dynamisches Time Warping könnte hier ein interessantes Werkzeug sein. Sie würden "Vorlagen" für Ihre drei Klassen erstellen und dann mithilfe von DTW die Korrelation zwischen Ihrer Vorlage und "Blöcken" des Signals erkennen (das Signal in beispielsweise 0,5-Sekunden-Bits aufteilen, dh 0 bis 0,5. 1-.6 .2-.7 ...). Ich habe mit etwas Ähnlichem für die Ganganalyse mit Beschleunigungsmesserdaten gearbeitet, es hat ziemlich gut funktioniert.

Eine weitere Option ist ein kombinierter Signalverarbeitungs- / maschinelles Lernalgorithmus. Brechen Sie Ihr Signal wieder in "Stücke". Machen Sie wieder "Vorlagen" (Sie wollen ein Dutzend oder so für jede Klasse) nehmen Sie die FFT jedes Blocks / jeder Vorlage und verwenden Sie dann einen Naiven Bayes-Klassifizierer (oder einen anderen ML-Klassifizierer, aber NB sollte ihn ausschneiden), um für jede zu klassifizieren deine drei Klassen. Ich habe dies auch bei Gangdaten versucht und konnte mit relativ komplizierten Signalen eine Genauigkeit von über 98% erreichen und abrufen. Lassen Sie mich wissen, wie das funktioniert, es ist ein sehr aufregendes Problem.


1

"" Wavelet-Transformation " kann ein relevantes Schlüsselwort sein. Ich habe einmal an einer Präsentation von jemandem teilgenommen, der diese Technik verwendet hat, um verschiedene Herzschlagphasen in einem lauten EKG zu erkennen.

Nach meinem begrenzten Verständnis ähnelt es einer Fourier-Transformation, verwendet jedoch (skalierte) Kopien eines, in Ihrem Fall herzschlagförmigen, Pulses.


1

Es hat sich gezeigt, dass Wavelets das beste Werkzeug zum Lokalisieren von Peaks in dieser Art von Daten sind, bei denen die Peaks "unterschiedliche Größen" haben. Die Skalierungseigenschaften von Wavelets machen sie zu einem idealen Werkzeug für diese Art der mehrskaligen Peakerkennung. Dies sieht aus wie ein instationäres Signal, daher wäre die Verwendung einer DFT nicht das richtige Werkzeug, wie einige vorgeschlagen haben. Wenn es sich jedoch um ein Erkundungsprojekt handelt, können Sie das Spektrum des Signals verwenden (geschätzt im Wesentlichen anhand der FFT der Autokorrelation von das Signal.)

Hier ist ein großartiges Papier, in dem verschiedene Methoden zur Peakerkennung besprochen werden - dies wäre ein guter Anfang.

-Paul


1

mit BioSPPY

Eine T-Wellen-Analyse ist derzeit nicht möglich, da sie derzeit nur eine R-Wellen-Analyse enthält. zB Tstart Tpeak Tend

werden nicht automatisch implementiert

man müsste seine eigene Analyse verwenden.

Mein Vorschlag wäre, die folgende Methode zu implementieren

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

Das ist eine, die ich kürzlich entdeckt und als sehr interessant empfunden habe

Die andere T-Wellen-Analysemethode, die es wert ist, betrachtet zu werden, ist die des ECGlib-Teams

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

hoffe das hilft


0

Ich habe die Antwort des anderen nicht gründlich gelesen, aber ich habe sie gescannt und festgestellt, dass niemand empfohlen hat, die Fourier-Transformation zu betrachten, um diese Wellen zu segmentieren.

Für mich scheint es eine klare Anwendung der harmonischen Analyse in der Mathematik zu sein. Es kann einige subtile Punkte geben, die mir fehlen könnten.

Das diskrete Fourier-Transformation geben Ihnen die Amplitude und Phase der verschiedenen sinusförmigen Komponenten an, aus denen Ihr diskretes Zeitsignal besteht. Dies ist im Wesentlichen das, was Ihr Problem angibt, das Sie finden möchten.

Möglicherweise fehlt mir hier etwas ...


Sie haben Recht damit, dass hier die Oberschwingungsanalyse gilt, aber die Spezifität des Problems ermöglicht es, dass bestimmte Ansätze, wie beispielsweise die Wavelet-Analyse, besser funktionieren als allgemeine, die nur Größenantworten untersuchen. Für dieses Problem sind relative Phasenversätze von Bedeutung .
Steve Tjoa

0

Erstens können die verschiedenen Komponenten der Standard-Elektrokardiogrammwelle in einem bestimmten Diagramm fehlen. Eine solche Handlung ist im Allgemeinen abnormal und weist normalerweise auf ein Problem hin, aber Sie können nicht versprechen, dass sie vorhanden sind.

Zweitens ist das Erkennen von ihnen ebenso Kunst wie Wissenschaft, insbesondere in den Fällen, in denen etwas schief geht.

Mein Ansatz könnte darin bestehen, ein neuronales Netzwerk zu trainieren, um die Komponenten zu identifizieren. Sie würden ihm die vorherigen 30 Sekunden Daten geben, normalisiert, so dass der niedrigste Punkt bei 0 und der höchste Punkt bei 1,0 lag und es 11 Ausgänge geben würde. Die Ausgaben, bei denen es sich nicht um Abnormalitätsbewertungen handelte, wurden in den letzten 10 Sekunden gewichtet. Eine 0,0 wäre -10 Sekunden von der Gegenwart entfernt, und eine 1,0 würde jetzt bedeuten. Die Ausgaben wären:

  1. Wo die letzte P-Welle begann
  2. Wo die letzte P-Welle endete
  3. Abnormalitätsbewertung der letzten P-Welle, wobei ein Extrem "nicht vorhanden" ist.
  4. Wo der letzte QRS-Komplex begann
  5. Wobei der Q-Teil des letzten QRS-Komplexes in den R-Teil überging.
  6. Wobei der R-Teil des letzten QRS-Komplexes in den S-Teil überging.
  7. Wo der letzte QRS-Komplex endete.
  8. Abnormalitätsbewertung des neuesten QRS-Komplexes, wobei ein Extrem "nicht vorhanden" ist.
  9. Wo die letzte T-Welle begann.
  10. Wo die letzte T-Welle endete.
  11. Abnormalitätsbewertung der letzten T-Welle, wobei ein Extrem "nicht vorhanden" ist.

Ich könnte dies mit einigen der anderen vorgeschlagenen Analysetypen überprüfen oder diese anderen Analysetypen zusammen mit der Ausgabe des neuronalen Netzwerks verwenden, um Ihnen Ihre Antwort zu geben.

Natürlich sollte diese detaillierte Beschreibung des neuronalen Netzwerks nicht als vorschreibend angesehen werden. Ich bin mir sicher, dass ich nicht unbedingt die optimalsten Ergebnisse ausgewählt habe. Ich habe nur ein paar Ideen darüber geworfen, was sie sein könnten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.