suchen
HeimBackend-EntwicklungPython-TutorialEinfache DIY-HR-Monitor-EKG-Anzeige

Ziel
Das Ziel dieses Miniprojekts/Tutorials ist es, mit minimalen Komponenten einen supereinfachen HR-Monitor und eine scrollende EKG-Anzeige zu erstellen.

Anforderungen:

  • Python
  • Audio-Schnittstelle
  • 1/4"-Kabel/Gitarrenkabel/Instrumentenkabel (es muss nur über das Audio-Interface in den Computer gelangen)

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

Simple DIY HR Monitor ECG Display

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
Simple DIY HR Monitor ECG Display

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.

Es eignet sich auch nicht gut für die Erkennung kleinerer Signale wie bei EMG.

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!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Wie unterscheiden sich Numpy Arrays von den Arrays, die mit dem Array -Modul erstellt wurden?Wie unterscheiden sich Numpy Arrays von den Arrays, die mit dem Array -Modul erstellt wurden?Apr 24, 2025 pm 03:53 PM

NumpyarraysarebetterFornumericaloperations und multi-dimensionaldata, whilethearraymoduleiStableforbasic, an Gedächtniseffizienten

Wie vergleichen sich die Verwendung von Numpy -Arrays mit der Verwendung der Array -Modularrays in Python?Wie vergleichen sich die Verwendung von Numpy -Arrays mit der Verwendung der Array -Modularrays in Python?Apr 24, 2025 pm 03:49 PM

NumpyarraysarebetterforeheavynumericalComputing, während der projectwithsimpledatatypes.1) numpyarraysoferversatility und -PerformanceForlargedataSets und Compoxexoperations.2) thearraysoferversStility und Mächnory-Effefef

Wie bezieht sich das CTypes -Modul auf Arrays in Python?Wie bezieht sich das CTypes -Modul auf Arrays in Python?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingandmanipulationsc-stylearraysinpython.1) usectypestoInterfaceWithClibraryForperformance.2) createCec-stylearraysFornumericalComputationen.3) PassarrayStocfunctionsFectionFicecher-Operationen.

Definieren Sie 'Array' und 'Liste' im Kontext von Python.Definieren Sie 'Array' und 'Liste' im Kontext von Python.Apr 24, 2025 pm 03:41 PM

Inpython, eine "Liste" iSaverSatile, mutablesquencethatcanholdmixedDatatypes, während "Array" iSamorememory-effizientes, homogenoussequencequiringelementementsOfthesametype.1) ListareidealfordVeredatastorageAndmanipulationDuetothisiflexflexibilität

Ist eine Python -Liste veränderlich oder unveränderlich? Was ist mit einem Python -Array?Ist eine Python -Liste veränderlich oder unveränderlich? Was ist mit einem Python -Array?Apr 24, 2025 pm 03:37 PM

PythonlistsandArraysarBothmus.1) listsareflexiBleDsupportheterogenDatabUtarelessMemoryeffizient.2) Arraysaremoremory-effizientforhomogenousDatAbutLessvertile, das KorrectTypecodusagetoavoidoVoidERRors erfordert.

Python vs. C: Verständnis der wichtigsten UnterschiedePython vs. C: Verständnis der wichtigsten UnterschiedeApr 21, 2025 am 12:18 AM

Python und C haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1) Python ist aufgrund seiner prägnanten Syntax und der dynamischen Typisierung für die schnelle Entwicklung und Datenverarbeitung geeignet. 2) C ist aufgrund seiner statischen Tipp- und manuellen Speicherverwaltung für hohe Leistung und Systemprogrammierung geeignet.

Python vs. C: Welche Sprache für Ihr Projekt zu wählen?Python vs. C: Welche Sprache für Ihr Projekt zu wählen?Apr 21, 2025 am 12:17 AM

Die Auswahl von Python oder C hängt von den Projektanforderungen ab: 1) Wenn Sie eine schnelle Entwicklung, Datenverarbeitung und Prototypdesign benötigen, wählen Sie Python. 2) Wenn Sie eine hohe Leistung, eine geringe Latenz und eine schließende Hardwarekontrolle benötigen, wählen Sie C.

Erreichen Sie Ihre Python -Ziele: Die Kraft von 2 Stunden täglichErreichen Sie Ihre Python -Ziele: Die Kraft von 2 Stunden täglichApr 20, 2025 am 12:21 AM

Indem Sie täglich 2 Stunden Python -Lernen investieren, können Sie Ihre Programmierkenntnisse effektiv verbessern. 1. Lernen Sie neues Wissen: Lesen Sie Dokumente oder sehen Sie sich Tutorials an. 2. Üben: Schreiben Sie Code und vollständige Übungen. 3. Überprüfung: Konsolidieren Sie den Inhalt, den Sie gelernt haben. 4. Projektpraxis: Wenden Sie an, was Sie in den tatsächlichen Projekten gelernt haben. Ein solcher strukturierter Lernplan kann Ihnen helfen, Python systematisch zu meistern und Karriereziele zu erreichen.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.