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

Signal Discussion :

Détection sonore(traitement du signal) [Débutant]


Sujet :

Signal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Détection sonore(traitement du signal)
    Bonjour,
    Je suis étudiant en 2eme année de prépa intégrée à une école d'ingénieur, et souhaite utiliser Matlab dans le cadre de mes TIPE. Je me charge du traitement d'un signal audio, je m'explique:
    J'ai un son wave qui est l'enregistrement d'une note de musique (LA3 du diapason (440Hz)) dans un environnement bruyant (le LA ne s'entend pas, ou très peu, à l'oreille nue) et souhaite, à l'aide de filtre (passe bande 400Hz-500Hz par exemple) et de fft prouver la présence du LA 440Hz (montrer qu'il y a bien la composante à 440Hz lors de la FFT).

    Caractéristiques du son wav: Durée=1,00 s ; Freq d'échantillonnage=44100Hz

    J'ai lu l'aide de Matlab ainsi que beaucoup de sujets sur le forum mais après de nombreux essais je n'arrive toujours pas à mes fins:

    1) Tout d'abord, question "bête", je ne comprend pas pourquoi je n'obtient pas la même échelle (abscisses) que celle de Regressi (1sec, cf pièce jointe) avec le code de base suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >> [x,fs]=wavread('son wav');
    >> plot(x)
    2) Après lecture de l'aide j'ai donc essayer de définir le "time vector" mais j'ai du mal à saisir ce qu'il représente réellement, du coup, malgré mes nombreux tests, je n'ai jamais reussi à représenter plus de 0,25 sec de mon enregistrement avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [x,fs]=wavread('son wav');
    T=1/fs;    %Sample Time
    L=1e5;     %Length of signal
    t=(0:L-1)*T;  %Time vector
    plot (t(1:1e4),x(1:1e4))
    Si vous pouviez m'expliquer pourquoi le vecteur "t" est définit comme ceci je vous en serai très reconnaissant

    3) FFT: J'aimerai ensuite arriver un retrouver un résultat similaire à celui de la pièce jointe qui est le résultat de la fonction FFT de Regressi, j'ai essayer d'utiliser le code donné ici http://www.developpez.net/forums/d66...t-sous-matlab/ mais sans succès.

    Je cherche à avoir les fréquences en fonction de leur amplitude, ou de leur magnitude, pour pouvoir conclure quant à la présence du 440Hz

    4) En ce qui concerne le filtre, je m'y essaierai une fois les 3 premiers points assimilés


    Etant débutant en Matlab et n'ayant que 3 semaines pour faire mon programme, je voudrais savoir s'il était possible d'avoir de l'aide par rapport à mes différents (mais simples j'imagine) problemes.

    Merci de votre compréhension
    Images attachées Images attachées    

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Jette un oeil au nombre d'éléments contenus dans la variable x :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [x,fs]=wavread('son wav');
    nb = numel(x)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Ok donc après avoir modifié mon code comme ci après j'obtient bien la bonne échelle en abscisse, mais qu'elle est l'unité de l'axe des ordonnées svp ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     [x,fs]=wavread('son wav');
    T=1/fs;    %Sample Time
    L=44173;   %Length of signal
    t=(0:L-1)*T;  %Time vector
    plot(t(1:44100),x(1:44100))   %dessiner le signal
    Par contre je n'ai pas vraiment compris ce que représente "L" et "t" au final (surtout la syntaxe de "t", pourquoi faut il mettre L-1, et que signifie exactement la syntaxe du plot (le t(1:44100),x(1:44100)))... j'ai modifié mon précédent code grace à ta remarque mais j'aimerai comprendre
    Dsl pour le dérrengement

    Merci pour ta réponse. (PS j'avais oublié les pièces jointes dans mon premier message, veuillez m'excuser).

  4. #4
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Pourquoi pas un filtre en peigne?
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Hum... parce que je ne connais pas ^^, en quoi il consiste ? Il faut juste que je "centre" mon étude autour de la fréquence de 440Hz pour montrer sa présence donc j'ai pensé au passe bande... qu'est ce qu'un filtre en peigne et comment s'écrit-il ?

    J'ai fais la fft en m'inspirant de l'aide de matlab et de certains topic et ca à l'air de fonctionner, j'ai juste un "warning" à la fin :
    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
    %Récupération de l'enregistrement à étudier
    [x,fs]=wavread('son wav');
    T=1/fs;     		      	 %Période
    L=length(x);   		      	 %Longueur du signal
    t=(0:L-1)*T;  		      	 %Vecteur temps
    plot(t(1:44100),x(1:44100))  %dessiner le signal
    title('Signal bruité enregistré')
    xlabel('Temps (secondes)')
    %Fast Fourier Transform (FFT)
    Y=fft(x/L);
    f=fs/2*linspace(0,1,L/2+1);
    %plot single-sided amplitude spectrum
    plot(f,2*abs(Y(1:L/2+1)))
    title('Single-Sided Amplitude Spectrum of x(t)')
    xlabel('Frequency (Hz)')
    ylabel('|Y(f)|')
    Warning: Integer operands are required for colon operator when used as index
    que faut-il que je change ? (cf pièce jointe fftMATLAB pour le résultat)
    De plus, j'aimerai changer l'échelle des fréquences (abscisses) car ce qui m'interesse sont les fréquences aux alentours de 440Hz (comme sur la pièce jointe "fftREGRESSI" du premier message), est-ce là que le filtre intervient ? ou faut-il changer autre chose ?
    Pour finir, est ce que (en plus des questions précédentes ) vous pouriez m'expliquer clairement ce que signifient les deux lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f=fs/2*linspace(0,1,L/2+1);
    %plot single-sided amplitude spectrum
    plot(f,2*abs(Y(1:L/2+1)))
    Merci beaucoup pour votre aide

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Pour changer les limites des axes, tu utilises la fonction XLIM.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    D'accord, merci pour ta réponse, ma fft à une bonne tête maintenant .
    Je vais m'essayer au filtrage maintenant, mais avant j'aimerai savoir s'il était possible de m'expliquer pourquoi le vecteur temps se définit comme cela (pourquoi L-1) et de la même manière, que signifient exactement les deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f=fs/2*linspace(0,1,L/2+1);
    %plot single-sided amplitude spectrum
    plot(f,2*abs(Y(1:L/2+1)))
    désolé pour les répétitions mais j'aime bien comprendre exactement ce que je fais, et pas seulement m'inspirer de l'aide et de topics (étant débutant, c'est pas une mince affaire ).

    Merci d'avance

  8. #8
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    L est la longueur de ton signal (variable x).
    Tu construit donc ton vecteur t qui doit être de la même longueur que x (pour le PLOT) : celui-ci semble avoir pour contraintes de : commencer à 0 et avoir un pas de T (la multiplication par T).
    Pour qu'il ait une longueur de L, on commence donc à 0 et on s'arrête à (L-1)*T.

    Je suis pas sure que ce soit plus clair
    Règles du Forum

    Adepte de la maïeutique

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup, tu as été très clair oui (je m'en veux de ne pas avoir trouvé ca tout de même ).
    Niquel, si vous pouviez m'apporter de l'aide de la même facon quant à fs/2*linspace(0,1,L/2+1) et 2*abs(Y(1:L/2+1) ce serait parfait .

    Deuxieme chose, comment faire pour obtenir un graphe de la magnitude (et non de l'amplitude) en fonction de la fréquence, cf pièce jointe trouvée sur le web ?

    Enfin, quelqu'un peut m'expliquer d'où vient l'erreur à la fin de mon code et que faire pour y remédier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Integer operands are required for colon operator when used as index
    Merci d'avance
    Images attachées Images attachées  

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Salut tout le monde, la partie Fourier marche bien, mais pour ce qui concerne mon filtre passe bande, j'ai un peu de mal, je n'arrive pas à tracer mon signal issus de la FFT, filtré de 400Hz à 500Hz (pour observer l'amplitude de la fréquence de 440Hz). Voici mon code :
    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
    [x,fs,Nbits]=wavread('son wav');
    fs;
    Nbits;
    T=1/fs;
    L=length(x);
    %Définition du vecteur temps "t"
    t=(0:L-1)*T;
    %DESSINER LE SIGNAL
    plot(t(1:fs),x(1:fs))
    title('Signal bruité enregistré')
    xlabel('Temps (secondes)')
    %TRANSFORMEE DE FOURIER (Fast Fourier Transform)
    Y=fft(x,L)/L;
    %Définition du vecteur fréquence
    f=linspace(0,fs,L);
    %DESSINER LA FFT
    figure;plot(f,abs(Y))
    xlim([20 4000])
    title('Single-Sided Amplitude Spectrum of x(t)')
    xlabel('Frequency (Hz)')
    ylabel('|Y(f)|');grid
    %filtre passe bande
    n=6; Wn=[400 500]/fs;
    ftype='bandpass';
    [b,a]=butter(n,Wn,ftype);
    Y_filt=filter(b,a,Y)
    Merci d'avance pour vos réponses, (je dois absolument finir tout cela cette semaine, merci encore pour l'aide.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Code de détection Matlab (traitement d’un signal audio)
    Par Maxime.Robertet dans le forum Signal
    Réponses: 1
    Dernier message: 03/04/2013, 12h01
  2. Enveloppe spectrale dans le traitement du signal
    Par AsmaHaj dans le forum MATLAB
    Réponses: 4
    Dernier message: 05/04/2007, 00h28
  3. [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
  4. 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