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

MATLAB Discussion :

Produit de convolution et fonction conv


Sujet :

MATLAB

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 134
    Points : 61
    Points
    61
    Par défaut Produit de convolution et fonction conv
    Bonjour à tous,

    j'ai un vecteur A, par exemple A = [0 0 1 5 2 8 6 0 0 0 0 1 3 4 6 3 0 0]

    Je souhaite "lisser" ces valeurs, c'est à dire remplacer chaque valeur par la moyenne des valeurs alentours, à l'aide d'un produit de convolution.

    Il me semble qu'il faut utiliser la fonction conv(), mais je ne sais pas comment (même après avoir lu la notice).

    L'idée serait de convoluer A(i) avec une fonction de Gauss de largeur 3 par exemple.

    Quelqu'un saurait-il comment faire ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Bonjour,

    Pour avoir une gaussienne, tu peux utiliser ceci


  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    clear all
    A = [0 0 1 5 2 8 6 0 0 0 0 1 3 4 6 3 0 0]
    filtre = [1 1 1]; % un filtre de largeur 3, qui fait une moyenne glissante sur 3 éléments
    filtre = filtre./sum(filtre) % On normalise les coefficients du filtre
     
    B = conv(A,filtre); %B a 3 + 18 -1 éléments (longueur du filtre + longueur de A -1)
    B2 = B(1,length(filtre)-1:length(B)-1)%On supprime les extrémités, créées par lopération de convolution 
     
    hold on
    plot(A,'-+')
    plot(B2,'r-*')
    Avec ce code, tu lisse ta courbe grâce à un filtre "moyenneur". Si tu changes les coefficients du filtre (par exemple [0.5 1 0.5]) tu donne plus de poids à l'élément central (moyenne pondéré)

    Avec l'opération de convolution, tu récupère un vecteur plus grand que celui d'entrée, tu dois récupérer le partie qui t'intéresse (au centre)

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 134
    Points : 61
    Points
    61
    Par défaut
    OK merci.

    J'ai maintenant appliqué cette méthode, mais avec un filtre gaussien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    filtre = gausswin(length(A),2)
    B = conv(A,filtre)
    Mon problème est que les valeurs de B, en plus d'avoir été lissées par rapport à A, ont été sensiblement augmentées (certaines valeurs de B dépassent 10 par exemple). Comment faire pour que le maximum de A reste aussi le maximum de B ?

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    c'est normal que ton filtre soit de la même taille que ton vecteur? (je demande car dans ton message, tu voulais appliquer un filtre de longueur 3)

    Pour ta question, le maximum du résultat est forcément modifié par le filtre, si tu veux le même maximum qu'initialement :
    - divise par le maximum de B (normalisation par rapport à 1)
    - multiplie par le maximum de A (normalisation par rapport au maximum de B)
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 134
    Points : 61
    Points
    61
    Par défaut
    En fait ça a l'air de marcher en mettant un filtre de même longueur que mon vecteur, donc je ne me suis pas embêté à créer un filtre d'une longueur spécifique.

    Je pense que les valeurs du filtre égales à zéro ne sont pas prises en compte, et puis c'est tout.

    Pour la solution que tu proposes, à quel vecteur dois-je appliquer ces opérations ?

    Le maximum de B est 1, donc ça ne fera aucun changement.

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par fuyo2004 Voir le message
    Le maximum de B est 1, donc ça ne fera aucun changement.
    Dans ce cas, il suffit de multiplier par le maximum de A.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Oui, tu multiplie B par le max de A.
    par contre je trouve bizarre de filtrer par un filtre de même longueur que le vecteur d'entrée, tu ne vas pas du tout avoir l'effet de lissage, et si tu affiche B, tu vas plutôt obtenir une gaussienne.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 134
    Points : 61
    Points
    61
    Par défaut
    Oui mais ça marche. Mon filtre est composé de zéro sur une grande partie, c'est ce qui doit faire que ça marche.

    C'est bon pour la normalisation.

    Merci à tous.

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

Discussions similaires

  1. produit de convolution sans passer par 'conv
    Par sergy01 dans le forum Mathématiques
    Réponses: 0
    Dernier message: 11/06/2012, 12h37
  2. [Débutant] Fonction artificielle & Produit de convolution
    Par sky-mars dans le forum Signal
    Réponses: 12
    Dernier message: 28/02/2010, 16h06
  3. Produit de convolution
    Par top111 dans le forum MATLAB
    Réponses: 9
    Dernier message: 19/06/2008, 14h48
  4. fft en 3 dimension pour un produit de convolution
    Par mattthieu dans le forum Calcul scientifique
    Réponses: 9
    Dernier message: 09/06/2008, 11h38
  5. produit de convolution en C
    Par nickoko dans le forum C
    Réponses: 8
    Dernier message: 21/06/2006, 16h10

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