IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Traitement du signal: filtrage


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Traitement du signal: filtrage
    Bonjour, je suis débutant en programmation et en traitement du signal et j'ai un petit soucis.
    J'acquiers des données EEG en continue en temps réel, que je met dans un graphe et en fait je dois les filtrer (filtre passe bande 8-13Hz). Pour le moment j'arrive pas à réaliser le filtrage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    from pylsl import StreamInlet, resolve_stream
    from matplotlib import pyplot as plt
     
     
     
     
    print("attente d'un stream EEG")
    streams = resolve_stream('type', 'EEG')
    inlet = StreamInlet(streams[0])
     
     
    amp = []
    temps_init = []
    while True:
        sample, timestamp = inlet.pull_sample()
        print(timestamp, sample)
        C1 = sample[0:1]  # Affichage du canal 1 (1:2, 2:3, 3:4, 4:5, 5:6, 6:7, 7:8)
        temps = timestamp
        temps_init.append(temps)
        amp.append(C1)
        plt.plot(temps_init, amp)
        plt.draw()
        plt.pause(0.05)  # figure updated and displayed, and the GUI event loop will run during the pause
        plt.clf()  # clear the current figure
    Nom : data.jpg
Affichages : 770
Taille : 113,1 Ko
    J'ai essayé en me servant de scipy, mais j'ai pas tout bien saisi, apparemment j'ai un problème avec la taille de mes axes...
    (je pense que pour quelqu'un qui sait programmer ça doit être simple à résoudre).

    Merci

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 27
    Points : 9
    Points
    9
    Par défaut
    Pourrais tu mettre le message d'erreur exacte?

    Ne connaissant pas du tout le module pylsl, je vais juste te poser une petite question : quand tu demande l'affichage de ta variable timestaps, Quel est le résultat?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    la variable timestamp me renvoie un nombre à virgule
    19344.402136901
    19344.404136901
    19344.406136901
    19344.408136901
    19344.410136901
    ....

    quand je teste le filtrage dans ma boucle while:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     while True:
        sample, timestamp= inlet.pull_sample()
        #print(sample)
        C1 = sample[0:1]  # Affichage du canal 1 (1:2, 2:3, 3:4, 4:5, 5:6, 6:7, 7:8)
        #print(C1)
        temps = timestamp
        temps_init.append(temps)
        xar.append(C1)
        # plt.plot(temps_init,xar)
        # plt.draw()
        # plt.pause(0.05)  # figure updated and displayed, and the GUI event loop will run during the pause
        # plt.clf()  # clear the current figure
        #bandpass
        Fs = 500
        wp = [0.2,0.5]
        ws = [0.1,0.6]
        Rp = 1  # passband maximum loss (gpass)
        As = 100  # stoppand min attenuation (gstop)
     
        b, a = fd.iirdesign(wp, ws, Rp, As, ftype='butter')
        w, H = signal.freqz(b, a)  # filter response
        #plt.plot(w, H)
        t = temps_init
        y = signal.filtfilt(b, a, xar)
        plt.plot(t, y)
        plt.draw()
        plt.pause(0.05)  # figure updated and displayed, and the GUI event loop will run during the pause
        plt.clf()  # clear the current figurel
    j'obtiens le message d'erreur suivant:
    Traceback (most recent call last):
    File "C:/Users/Vivien/PycharmProjects/untitled/acqui_data_lsl.py", line 43, in <module>
    y = signal.filtfilt(b, a, xar)
    File "C:\Users\Vivien\Desktop\WinPython-64bit-3.4.4.2\python-3.4.4.amd64\lib\site-packages\scipy\signal\signaltools.py", line 2482, in filtfilt
    "padlen, which is %d." % edge)
    ValueError: The length of the input vector x must be at least padlen, which is 147.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 27
    Points : 9
    Points
    9
    Par défaut
    Le problème est donc à la ligne y= signal.filtfilt(b,a,xar) selon le message d'erreur.

    Ton problème a l'air de venir du fait que la taille par défault de la variable padlen, qui est calculée par défault à Essaie de remplacer la ligne en question par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y= signal.filtfilt(b,a,xar,padlen=0)

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    merci, en effet en remplaçant la ligne j'ai plus cette erreur.
    Par contre je pense que j'ai du me planter sur mon filtrage, en haut j'ai ma courbe initiale, j'obtiens exactement la même courbe mais pour des ordonnées différents.
    Nom : filtrage.jpg
Affichages : 746
Taille : 70,4 Ko

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 27
    Points : 9
    Points
    9
    Par défaut
    Je ne suis pas sûr d'avoir compris le type de filtre que tu cherche à utiliser, mais j'ai l'impression qu'il s'agit d'un filtre visant à "lisser" la courbe. Or, ton signal semble avoir être quasi sinusoïdale, ce qui explique le résultat avec ce type de filtre, qui donne de très faible variation, au vue de l'ordonnée en 10⁻²⁷.

    Edit : Après vérification, j'ai vu le filtre fréquentiel que tu as calculé. Tu cherche à réaliser un filtre de Butterworth si je ne me trompe pas? L'utilisation de la fonction scipy.signal.butter serait sûrement plus simple pour effectuer ton passe bande

Discussions similaires

  1. traitement du signal
    Par axoupoker dans le forum C
    Réponses: 4
    Dernier message: 05/04/2007, 00h28
  2. Enveloppe spectrale dans le traitement du signal
    Par AsmaHaj dans le forum MATLAB
    Réponses: 4
    Dernier message: 05/04/2007, 00h28
  3. DTW dans le traitement de signal
    Par AsmaHaj dans le forum Signal
    Réponses: 5
    Dernier message: 01/04/2007, 23h08
  4. [Traitement du signal] Convolution en passant par la FFT
    Par parp1 dans le forum Traitement du signal
    Réponses: 8
    Dernier message: 25/04/2006, 13h26
  5. DSP traitement du signal
    Par miminou dans le forum Autres architectures
    Réponses: 4
    Dernier message: 24/03/2005, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo