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 :

Problème de lissage d'un signal


Sujet :

Signal

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 230
    Points : 96
    Points
    96
    Par défaut Problème de lissage d'un signal
    Bonjour;
    Je suis débutant en traitement de signal. Je veux utiliser Matlab pour lisser une courbe. J'ai trop cherché sur matlab, j'ai essayé des fct d'interpolation par spline cubique (interp1), de filtrage (filter), mais rien ne change à chaque fois.
    Ce que je veux obtenir c'est la courbe en haut, comme une "enveloppe" supérieure de la courbe en rouge (voir pièce jointe).
    Est ce que quelqu'un peut m'aider à trouver la bonne méthode de filtrage?
    Merci d'avance.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Points : 1 256
    Points
    1 256
    Par défaut
    salut,

    tu peux poster les données que tu plot ?

    ++
    AlloSchool, votre école sur internet.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 230
    Points : 96
    Points
    96
    Par défaut
    Bonjour;
    En fait, je veux faire le calcul de la fonction d'auto-correlation d'un signal audio (vecteur 1D).
    J'ai un vecteur que je veux voir la forme de sa fct d'autocorrélation pour détécter les patterns (les ressemblances entre ses parties).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x=wavread('son.wav');
    y=xcorr(x);
    figure(); plot(y);
    La figure que j'ai posté précédemment est une portion de la courbe obtenue.
    Le fait d'avoir cette forme de courbe trop en zigzag me fausse les calculs. C'est pourquoi je voudrais lisser la courbe ou obtenir l'enveloppe supérieure.
    Merci pour toute aide.

  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!
    Tout d'abord, ta question ne concerne pas un problème de MatLab, mais un problème d'algorithme. Tu dois d'abord être au clair sur ce que tu veux calculer et par quel algorithme, et cela indépendamment de l'outil ou du langage informatique que tu veux utiliser.
    Pour résumer, tu as un tableau y dont les composantes sont notées y(k) pour k allant de 0 à n. Sur la figure que tu as jointe à ton premier message, les valeurs de k sont reportées sur l'axe des abscisses, et celles de [B]y(k)/B] sur celui des ordonnées. Tu cherches une fonction z(k) qui soit assez régulière et qui passe par les maxima de y(k).
    Je te conseille de procéder par étapes, comme ceci:
    1. Tu parcours ton vecteur y(k) pour k allant de 1 à n-1. Pour chaque point, s'il correspond à un maximum, tu stockes la valeur de k dans un vecteur auxiliaire j et celle de y(k) dans un vecteur w. Par l'instruction plot, tu peux visualiser w en fonction de j.
    2. Tu interpoles la fonction w(j) par un spline cubique. Prends garde au fait que les termes de j ne sont pas équidistants. Tu ne pourras donc pas utiliser l'instruction interp1 et tu devras programmer toi-même le calcul des coefficients de ton spline.

    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
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 230
    Points : 96
    Points
    96
    Par défaut
    Merci FR119492 pour votre réponse.
    En fait, la raison pour laquelle je voudrais faire le lissage est que la dérivée de ma courbe donne n'importe quoi. Et du coup, je peux pas détecter les maxima (un maximum = passage par zero en croissance de la dérivée).
    C'est pourquoi je voudrais avoir l'enveloppe supérieure de mon vecteur pour avoir qque chose de significatif en la dérivant.
    Merci pour tte aide.
    PS : si vous suggérez que je dois transférer le message vers le forum algorithme, je le ferais tout de suite.

  6. #6
    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!
    la dérivée de ma courbe donne n'importe quoi
    Le calcul numérique de la dérivée donne presque foujours n'importe quoi à cause du bruit, des erreurs d'arrondi, etc.
    transférer le message vers le forum algorithme
    Ce n'est plus la peine, mais ça sera pour la prochaine fois!
    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)

  7. #7
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Je ne sais pas si ça peut aider, mais j'ai données que je dois analyser, et en particulier, je dois trouver des pics également (dans des spectres). Pour ce faire, je fais un produit de convolution du signal avec une fonction porte. En gros, à partir d'un point de ton signal (en x), tu additionnes toutes les intensités des z points à gauche et tu soustraies toutes les intensités des z points à droite du point, 2z+1 étant la largeur de ta porte (et tu fais ça pour chaque points compris entre 1+z et length(signal-z). Cela te donne la dérivée du signal en gommant une très grande partie du bruit. Il te suffit juste ensuite de répérer les valeurs qui sont le plus proches de 0 (maxima). Pour améliorer la méthode, tu peux ensuite faire une interpolation autour de ce 0 pour mieux situer le maximum et faire un test sur la dérivée pour savoir si c'est un maximum ou minimum.

    Bon courage et a plus!!!
    Matlab 7.14.0.739 (R2012a)
    C/C++, python, R, SQL, Pig, MR

    Ma philosophie: Ne rien faire, mais le faire bien.

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 230
    Points : 96
    Points
    96
    Par défaut
    Bonjour;
    Merci Dam2227 pour votre idée. Mais, j'ai pas bien compris le principe.
    Est ce que vous pouvez me donnez un petit algorithme explicatif.
    J'ai eu une idée : j'ai filtré la fct d'autocorrealtion bruitée du signal avec une fenetre glissante puis je l'ai dérivé. Ca m'a donnée un bon résultat pour la détection des pics, mais pas avec tous les signx (ca ne marche pas toust le temps), car le filtrage n'est pas toujours suffisant pour obtenir une courbe claire et nette sans bruit.
    Merci pour tte proposition.

  9. #9
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Oui, voici ce que je voulais dire :

    Tu as un jeu de données dans des vecteurs x et y. Dans un premier temps, il faut fixer un seuil (coupures), pour éliminer la base du signal, qui ne sert à rien.

    Une fois que c'est fait, il reste à convoluer le signal. Comme je li disais, il suffit d'additionner z nombres de points sur la gauche et de soustraire z nombres de points sur la droite, 2z+1 étant la largeur de la 'boîte'. Pas est ici mon nombre z et dery la dérivée de y.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i=(1+pas):1:(length(y)-pas)
        m=m+1;
        dery(m)=sum(y((i-pas):(i-1)))-sum(y((i+1):(i+pas)));
    end
    Ensuite, ce que j'ai fait, c'est que j'ai agrandit le vecteur dery pour qu'il est la même taille que y (j'ai rajouté des 0 en gros) et j'ai plotté les deux graphes, en supprimant les valeurs de dery qui étaient trop grandes (parce que je ne veux que que celles autour de 0). Tu verras qu'a chaque pic, dery va changer de signe (passer par 0). Pour avoir la position du pic, il suffit de répérer cette valeur.

    Voilà, j'espère que c'est plus. Maintenant, tu peux essayer sur un exemple tout simple et voir si ça marche!

    Bon courage et A+
    Matlab 7.14.0.739 (R2012a)
    C/C++, python, R, SQL, Pig, MR

    Ma philosophie: Ne rien faire, mais le faire bien.

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 230
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    Je suis enfin convaincu, FR119492, que la dérivation de mon signal n'est pas la bonne méthode meme après le filtrage et je dois utiliser une autre méthode.
    Le fait de mettre des zeros en dessous d'un seuil me parait pratique parce que après le filtrage de mon signal ils restent des fluctuations juste en bas. Mais la valeur du seuil doit etre dynamique (dépend du signal)

    J'essayerai le petit bout de code de Dam2227 et je vous parviendrais du résultat.

    Merci pour toute aide et bon courage

  11. #11
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Juste pour info : ton signal comporte beaucoup de bruit (plein de pics très fins). Le résultat du petit bout de code que je t'ai donné dépend fortement du pas choisi dans le code. Il faudra donc que tu prennes un pas assez conséquent. C'est grâce à ce pas que tu peux 'gommer' le bruit.
    Matlab 7.14.0.739 (R2012a)
    C/C++, python, R, SQL, Pig, MR

    Ma philosophie: Ne rien faire, mais le faire bien.

Discussions similaires

  1. problème de derive d'un signal
    Par mariono dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 26/12/2013, 18h06
  2. Problème de connexion entre un signal et un slot
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 11/01/2011, 12h40
  3. problème d'affichage d'un signal
    Par lionidos dans le forum Simulink
    Réponses: 1
    Dernier message: 27/04/2010, 04h37
  4. [Signal] Pb de lissage d'un signal audio
    Par Contact2012 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 14/10/2008, 11h01
  5. problème de lissage
    Par chabfive dans le forum OpenGL
    Réponses: 10
    Dernier message: 28/04/2006, 09h39

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