Ziel
Das Ziel dieses Miniprojekts/Tutorials ist es, mit minimalen Komponenten einen supereinfachen HR-Monitor und eine scrollende EKG-Anzeige zu erstellen.
Anforderungen:
Kurzer Hintergrund
Die Muskeln im Herzen erzeugen elektrische Signale. Einige dieser Signale sind auf der Hautoberfläche erkennbar.
Wir können diese Signale mithilfe von Oberflächenelektroden erfassen. Das Problem ist, dass dies nicht die einzigen elektrischen Signale auf der Haut sind. Glücklicherweise sind die meisten Signale, die wir sehen möchten, auf etwa 1-40 Hz beschränkt.
Prozess
Wir nehmen unser 1/4-Zoll-Kabel, das als unsere Elektrode dient, und stechen es in der Nähe des Herzens in unsere Haut. Anschließend verwenden wir die USB-Audioschnittstelle, um das analoge Signal zu verstärken und in ein digitales umzuwandeln . Schließlich filtern und zeigen wir in Python an
Schritte
Schritt 1: Ein 1/4-Zoll-Kabel besteht aus zwei Teilen, der Hülse und der Spitze. Beide Teile müssen Kontakt mit Ihrer Haut haben – halten Sie einfach die Hülse mit der Hand fest und drücken Sie sie gegen die Haut Linke Seite Ihrer Brust/oberer Brustkorb (einige Kabel haben möglicherweise mehr Kanäle, stellen Sie einfach sicher, dass sie alle Kontakt haben, um zu starten). Passen Sie die Verstärkung am Audio-Interface an (ich drehe meine ganz nach oben).
Schritt 2: Führen Sie den folgenden Code aus. Stellen Sie sicher, dass die Zeile „input_device_index“ auf Ihr Audio-Interface zeigt. Was wir tun, ist, Teile des eingehenden Audios zu nehmen, sie mit fft in den Frequenzbereich zu konvertieren, alle unnötigen Frequenzen auf 0 zu setzen und dann wieder in den Zeitbereich zu konvertieren. Als nächstes suchen wir die Spitzen, um die Herzfrequenz zu berechnen, und zeichnen sie dann in einer scrollbaren Form auf.
import numpy as np import pyaudio as pa import struct import matplotlib.pyplot as plt from scipy.signal import decimate, find_peaks CHUNK = 4410 #.1 second FORMAT = pa.paInt16 CHANNELS = 1 RATE = 44100 # in Hz fstep = RATE/CHUNK p = pa.PyAudio() values = [] dsf=44 #down sample factor rds=RATE/dsf #down sampled rate stream = p.open( format = FORMAT, channels = CHANNELS, rate = RATE, input_device_index=3, #adjust based on input input=True, frames_per_buffer=CHUNK ) #set up graph fig,ax = plt.subplots(1) x = np.arange(0,2*CHUNK,2) line, = ax.plot(x, np.random.rand(CHUNK)) ax.set_ylim(-100,100) ax.set_xlim(0,2500) text = ax.text(0.05, 0.95, str(0), transform=ax.transAxes, fontsize=14, verticalalignment='top') fig.show() def getFiltered(x,hp=1,lp=41): #this sets the unneeded freqs to 0 fft=np.fft.fft(x) hptrim=len(fft)/RATE*hp lptrim=len(fft)/RATE*lp fft[int(lptrim):-int(lptrim)]=0 fft[0:int(hptrim)]=0 return np.real(np.fft.ifft(fft)) def getHR(x): pdis = int(0.6 * rds) #minimum distance between peaks. stops rapid triggering. also caps max hr, so adjust peaks, _ = find_peaks(x, distance=pdis, height=0.1) intervals = np.diff(peaks)/rds # in seconds hr = 60 / intervals # in BPM return peaks,round(np.mean(hr),0) #peaks,avg hr while 1: data = stream.read(CHUNK) dataInt = struct.unpack(str(CHUNK) + 'h', data) filtered=getFiltered(dataInt) #filter (working with full chunk) dsed=decimate(filtered, 44) #down sample (turns chunk into ds chunk) values=np.concatenate((values,dsed)) #puts the chunks into an array peaks,hr = getHR(values*-1) # gets the peaks and determins avg HR. text.set_text(str(hr)) line.set_xdata(np.arange(len(values))) line.set_ydata(values*-10) #the negative is bc it comes in upside down with my set up. the *10 is just for fun ax.set_xlim(max(0,len(values)-2500),len(values)) #keep the graph scrolling vlines = ax.vlines(peaks,ymin=-100,ymax=100,colors='red', linestyles='dashed') # pop some lines at the peaks fig.canvas.draw() fig.canvas.flush_events() vlines.remove() if len(values)>10000: #keeps the array managably sized, and graph scrolling pretty values=values[5000:] #5 seconds @ ~1000 sr.
Notizen
Halten Sie das Kabel ruhig – möglicherweise müssen Sie nach der Bewegung einige Sekunden warten, um eine genaue Herzfrequenz zu erhalten. Ich habe es mit meiner Garmin-Uhr verglichen und es wurden durchweg ähnliche Werte zurückgegeben.
Ausgabe
Haftungsausschluss
Denken Sie daran, dass Sie
Ihren Körper technisch gesehen zu einem Teil des Kreislaufs machen. Das Kabel wird an die Schnittstelle angeschlossen, die mit dem Computer verbunden ist, der an die Steckdose angeschlossen ist... Versuchen Sie dies auf eigene Gefahr. Ich bin kein Experte – ich spiele einfach gerne mit Dingen herum und wollte sie teilen.
Nächste Schritte
Diese Methode funktioniert nicht wirklich gut, um alle verschiedenen Teile eines EKG-Signals sauber zu erkennen. Die Elektrode ist stark abgenutzt und ich habe nur minimal gefiltert.
Von hier aus können Sie tiefer in die Software eintauchen und mit zusätzlichen Filtern herumspielen oder einen tatsächlichen Schaltkreis erstellen und echte Elektroden verwenden. Eine Tüte Elektroden für so etwas gibt es bei Amazon ziemlich günstig (Achtung, der Kleber nervt). Für eine Schaltung habe ich ein paar verschiedene Konfigurationen ausprobiert – was ich am einfachsten fand/für mich am besten funktionierte, war eine einfache Instrumentenverstärkerschaltung mit einem JFET-Operationsverstärker (zusammengebaut auf einem Steckbrett). 3 Elektroden, schauen Sie sich einfach ein Diagramm an, wo Sie sie platzieren können. Wenn Sie die Audioschnittstelle für den ADC verwenden, sollte der Code hier mit dem 3-Elektroden-Steckbrett-Setup funktionieren (möglicherweise muss die Verstärkung angepasst werden)
Warum
Die Inspiration für dieses Miniprojekt entstand, als ich mit einem EQ-Plug-in in einer DAW herumspielte, während ich ein Gitarrenkabel in der Hand hielt.
Das obige ist der detaillierte Inhalt vonEinfache DIY-HR-Monitor-EKG-Anzeige. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!