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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Pour avoir une gaussienne, tu peux utiliser ceci


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

    Informations forums :
    Inscription : Mars 2010
    Messages : 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 confirmé
    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
    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
    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 confirmé
    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
    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.

+ 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