Als Hintergrund für die diesmalige Anwendung einer Frequenzanalyse gibt es im Labor der Universität, der ich angehöre, mehrere Gruppen, die Pulswellen und Elektrokardiogramme untersuchen, aber Software, um sie zu analysieren ( Derzeit gibt es nur einen PC mit kostenpflichtiger WaveLab-Software. Aufgrund dieser Situation kann eine andere Gruppe nicht analysiert werden, wenn eine Gruppe die Software verwendet. Daher habe ich beschlossen, sie selbst zu erstellen. Wenn eine Frequenzanalyse online möglich wird, ist dies sehr praktisch, da eine Analyse überall durchgeführt werden kann, solange eine Verbindung zum Internet besteht, ohne dass Software installiert werden muss.
Ich habe Python verwendet, um diese Webanwendung zu erstellen. Der Grund ist, dass ich es mit Numpy und Scipy erstellen wollte, die in Python berühmte Bibliotheken sind. Diese beiden Bibliotheken haben viele Funktionen für die Frequenzanalyse, daher werden wir sie mit ihnen erstellen. Der Grund, warum ich Django im Framework verwendet habe, war, dass ich dachte, Pythons FW sei Django, also habe ich es verwendet.
Erstellen Sie ein Modul zur Analyse von Pulswellen und Elektrokardiogrammen. Der Modulname lautet analysis.py.
analysis.py
import io
import pathlib
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from .models import Pulse_Rate
def setPlt(pk):
#Zieldaten abrufen
pulse_rate = Pulse_Rate.objects.get(pk=pk)
path = pathlib.Path(pulse_rate.data.url)
#Daten lesen
f = open(path.resolve())
lines = f.read().split()
# -----Variable Vorbereitung-----
N = 4096
lines_length = int(len(lines) / 2)
if lines_length < N:
N = 2048
dt = float(lines[2]) - float(lines[0])
pulse = []
for num in range(N - 1):
pulse.append(float(lines[num * 2 + 1]))
# -------------------
# -----Berechnung der Abtastfrequenz-----
t = np.arange(0, N * dt, dt) # time
freq = np.linspace(0, 1.0 / dt, N) # frequency step
# -----------------------------
# -----Wellenformgenerierung-----
y = 0
for pl in pulse:
y += np.sin(2 * np.pi * pl * t)
# -------------------
# -----Fourier-Transformation-----
yf = np.fft.fft(y) #Schnelle Fourier-Transformation
# --------------------
#Leistungsspektrumberechnung
yf_abs = np.abs(yf)
# -----Graphgenerierung-----
plt.figure()
plt.subplot(211)
plt.plot(t, y)
plt.xlabel("time")
plt.ylabel("amplitude")
plt.grid()
plt.subplot(212)
plt.plot(freq, yf_abs)
plt.xlim(0, 10)
plt.xlabel("frequency")
plt.ylabel("amplitude")
plt.grid()
plt.tight_layout()
Auf diese Weise werden ein Pulswellen- oder Elektrokardiogramm-Diagramm und ein Leistungsspektrum-Diagramm erzeugt. Die Daten werden aus der vom Benutzer hochgeladenen Textdatei gelesen.
Im obigen Modul erstellen wir ein Diagramm mit Plot, daher möchte ich dies auf einer Webseite im SVG-Format anzeigen.
analysis.py
def pltToSvg():
buf = io.BytesIO()
plt.savefig(buf, format='svg', bbox_inches='tight')
s = buf.getvalue()
buf.close()
return s
Jetzt können Sie Plot in SVG konvertieren und auf Ihrer Webseite anzeigen.
Schreiben Sie views.py mit dem obigen Modul.
views.py
def get_svg(request, pk):
setPlt(pk) # create the plot
svg = pltToSvg() # convert plot to SVG
response = HttpResponse(svg, content_type='image/svg+xml')
return response
Dies gibt eine Antwort in HttpResponse (SVG-Format) zurück.
Stellen Sie die URL ein.
urls.py
urlpatterns = [
...
path('pulse_rate-detail/<int:pk>/plot/', views.get_svg, name="plot"),
]
Ich möchte die Seite, auf der das Diagramm angezeigt wird, diesmal zu einem Detailbildschirm machen.
pulse_rate_detail.html
<img src="{% url 'pulse_rate:plot' object.pk %}" width=600, height=300>
Sie können jetzt das Diagramm anzeigen.
Das Diagramm, das tatsächlich erstellt werden kann, lautet wie folgt.
Die obige Abbildung zeigt grafisch ungefilterte Daten, sodass Sie nichts so sehen können, wie es ist. Daher habe ich eine Filterfunktion hinzugefügt, um ein Diagramm zu generieren. (Ich werde den Code weglassen) Wenn Sie den Filter anwenden, wird eine pulswellenartige Wellenform angezeigt. (Da diese Pulswelle unter Verwendung der G-Komponente des von der Kamera aufgenommenen RGB-Werts erzeugt wird, ist sie keine perfekte Wellenform.) Die unteren und oberen Grenzen des Filters können Sie selbst über die Webseite anpassen.
Die diesmal erstellte Anwendung wird zukünftig im Labor eingesetzt. Außerdem gibt es in dem Labor, dem ich angehöre, Gruppen, die andere Forschungen als Elektrokardiogramme und Pulswellen durchführen. Deshalb möchte ich auch für diese Gruppen etwas schaffen. Tatsächlich besteht mein Forschungsthema darin, den Grad der Belastung einer Person anhand der Temperatur der Nase der Person zu messen.
Ich möchte das Labor, zu dem ich gehöre, zum coolsten Labor der Universität machen, also möchte ich eine solche Anwendung auch in der 4. Klasse erstellen!
Recommended Posts