[PYTHON] J'ai créé une application d'analyse de fréquence en ligne

Contexte

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.

À propos de la langue utilisée

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éer un module d'analyse de fréquence

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.

Afficher le graphique sur la page Web

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.

paramètres views.py

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

paramètres urls.py

Définissez l'URL.

urls.py


urlpatterns = [
    ...
    path('pulse_rate-detail/<int:pk>/plot/', views.get_svg, name="plot"),
]

paramètres des modèles

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.

Graphique créé

Le graphique qui peut être réellement créé est le suivant. image.png

Générer un graphique filtré

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

Résumé

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

J'ai créé une application d'analyse de fréquence en ligne
J'ai créé un installateur Ansible
J'ai créé un serveur Xubuntu.
J'ai fait un peintre discriminateur Anpanman
J'ai fait un kit de démarrage angulaire
J'ai créé un module alternatif pour les japandas.
J'ai créé un package extenum qui étend enum
Obstacle (noir) J'ai fait une chenille d'évitement automatique.
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
Application d'analyse des investissements boursiers avec tarte aux framboises
J'ai créé un bouton Amazon Web Service Dash
[Python] J'ai créé une application pour pratiquer la délicate distinction vocale des mots anglais.
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé une application Android qui affiche Google Map
J'ai créé une application qui m'avertit si je joue avec mon smartphone pendant mes études avec OpenCV
J'ai créé un appareil IoT pour acquérir naturellement une pensée positive
J'ai fait un graphique radar des émotions du travail d'Aozora Bunko
J'ai fait une putain d'application qui ne te laisse pas sauter
J'ai fait une animation qui renvoie la pierre d'Othello avec POV-Ray
J'ai créé un modèle de détection d'anomalies qui fonctionne sur iOS
J'ai créé un programme automatisé pour coller du squishy dans Excel
J'ai créé une application d'estimation de l'entraînement musculaire à l'aide du SDK Qore
J'ai créé un guide de programme original en utilisant l'API de guide de programme NHK.
J'ai créé une application pour découvrir à qui ressemblent les membres des Pirates du Chapeau de Paille