Pour faire une application d'analyse de fréquence cette fois, dans le laboratoire de l'université à laquelle j'appartiens, il existe plusieurs groupes qui étudient les ondes de pouls et les électrocardiogrammes, mais des logiciels pour les analyser ( La situation actuelle est qu'il n'y a qu'un seul PC avec le logiciel payant WaveLab). En raison de cette situation, lorsqu'un groupe utilise le logiciel, un autre groupe ne peut pas être analysé, j'ai donc décidé de le faire moi-même. Aussi, si l'analyse de fréquence devient possible en ligne, elle sera très pratique car il sera possible d'effectuer des analyses n'importe où tant qu'il est connecté à Internet sans avoir à se soucier d'installer un logiciel.
J'ai utilisé Python pour créer cette application Web. La raison est que je voulais le créer en utilisant Numpy et Scipy, qui sont des bibliothèques célèbres en Python. Ces deux bibliothèques ont beaucoup de fonctions pour l'analyse de fréquence, nous allons donc les créer en les utilisant. La raison pour laquelle j'ai utilisé Django dans le framework était parce que je pensais que le FW de Python était Django, donc je l'ai utilisé.
Créez un module pour analyser les ondes de pouls et les électrocardiogrammes. Le nom du module est 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):
#Obtenez des données cibles
pulse_rate = Pulse_Rate.objects.get(pk=pk)
path = pathlib.Path(pulse_rate.data.url)
#Lire les données
f = open(path.resolve())
lines = f.read().split()
# -----Préparation variable-----
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]))
# -------------------
# -----Calcul de la fréquence d'échantillonnage-----
t = np.arange(0, N * dt, dt) # time
freq = np.linspace(0, 1.0 / dt, N) # frequency step
# -----------------------------
# -----Génération de forme d'onde-----
y = 0
for pl in pulse:
y += np.sin(2 * np.pi * pl * t)
# -------------------
# -----Transformée de Fourier-----
yf = np.fft.fft(y) #Transformée de Fourier Rapide
# --------------------
#Calcul du spectre de puissance
yf_abs = np.abs(yf)
# -----Génération de graphes-----
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()
Une onde de pouls ou un graphique d'électrocardiogramme et un graphique de spectre de puissance sont générés comme ceci. Les données sont lues à partir du fichier texte téléchargé par l'utilisateur.
Dans le module ci-dessus, nous créons un graphique avec tracé, je voudrais donc l'afficher sur une page Web au format svg.
analysis.py
def pltToSvg():
buf = io.BytesIO()
plt.savefig(buf, format='svg', bbox_inches='tight')
s = buf.getvalue()
buf.close()
return s
Vous pouvez maintenant convertir le tracé en svg et l'afficher sur votre page Web.
Écrivez views.py en utilisant le module ci-dessus.
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
Cela renverra une réponse au format HttpResponse (format svg).
Définissez l'URL.
urls.py
urlpatterns = [
...
path('pulse_rate-detail/<int:pk>/plot/', views.get_svg, name="plot"),
]
Je voudrais faire de la page qui affiche le graphique cette fois un écran de détail.
pulse_rate_detail.html
<img src="{% url 'pulse_rate:plot' object.pk %}" width=600, height=300>
Vous pouvez maintenant afficher le graphique.
Le graphique qui peut être réellement créé est le suivant.
La figure ci-dessus est un graphique de données non filtrées, vous ne pouvez donc rien voir tel quel. Par conséquent, j'ai ajouté une fonction de filtrage pour générer un graphique. (Je vais omettre le code) Lorsque vous appliquez le filtre, une forme d'onde semblable à une onde de pouls apparaît. (Étant donné que cette onde de pouls est générée à l'aide de la composante G de la valeur RVB prise par la caméra, ce ne sera pas une forme d'onde parfaite.) Les limites inférieure et supérieure du filtre peuvent être ajustées par vous-même à partir de la page Web.
L'application créée cette fois sera utilisée dans le laboratoire dans le futur. De plus, dans le laboratoire auquel j'appartiens, il y a des groupes qui font des recherches autres que l'électrocardiogramme et les ondes de pouls, alors j'aimerais créer quelque chose pour ces groupes également. En fait, mon thème de recherche est de mesurer le degré de stress d'une personne à partir de la température de son nez.
Je veux faire du laboratoire j'appartiens au laboratoire le plus cool de l'université, donc je veux créer une telle application même en 4e année!
Recommended Posts