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

Traitement du signal Discussion :

interpolation d'une courbe avec FFT


Sujet :

Traitement du signal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut interpolation d'une courbe avec FFT
    Bonjour à tous,

    Dans le but de modéliser une courbe fermée, j'utilise la transformée de fourier discrète. J'aimerai ré-échantillonner cette courbe à l'aide de la librairie C++ FFTW3. Pour se faire, je détermine les coefficients de fourrier de la courbe et je calcule la transformée de fourier inverse en souhaitant obtenir en sortie un tableau de la taille de l'échantillon voulu. Cependant, la fonction de la transformée inverse que j'ai implémenté ne peut pas utiliser un tableau de taille différente que la courbe.
    Comment puis-je faire une interpolation en utilisant cette librairie ?

    Code C : 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
     
    #include <complex>
    #include <fftw3.h>
     
    void transformeeFourierComplex(complex<double> *curve, complex<double> *descriptor, int n)
    {
     
      fftw_plan plan;
     
      plan = fftw_plan_dft_1d(n, reinterpret_cast<fftw_complex*>(curve), reinterpret_cast<fftw_complex*>(descriptor), FFTW_FORWARD, FFTW_ESTIMATE);
      fftw_execute(plan);
     
       /*liberation de la memoire*/
      fftw_destroy_plan(plan);
     
      return;
    }
     
    void transformeeFourierInv(complex<double> *descriptor, complex<double> *curve, int n)
    {
     
      fftw_plan plan;
     
      plan = fftw_plan_dft_1d(n, reinterpret_cast<fftw_complex*>(descriptor), reinterpret_cast<fftw_complex*>(curve), FFTW_BACKWARD, FFTW_ESTIMATE);
      fftw_execute(plan);
     
      fftw_destroy_plan(plan);
    }

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

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

    Puisque le but est d'interpoler, je ne vois pas pourquoi passer par la transformée de Fourier inverse.
    A partir du moment où tu as les coefficients de Fourier, tu peux réaliser ton interpolation en n'importe quel point, et donc construire ton signal ré-échantillonné.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Hum je n'ai pas trop compris.
    Je pensais que pour une interpolation il fallait déterminer les coefficients de Fourier puis passer par la transformée inverse pour trouver le points interpolé de la courbe.
    Comment fait-tu uniquement avec les descripteurs de Fourier pour faire l'interpolation ?

    J'ai recodé la transformée inverse mais mon souci c'est que mon implémentation est trop lente, c'est pour cela que je veux utiliser FFTW3.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Citation Envoyé par takout Voir le message
    Comment fait-tu uniquement avec les descripteurs de Fourier pour faire l'interpolation ?
    Et bien si tu connais les coefficients de Fourier A_i, B_i , alors la fonction d'interpolation, valide sur tout l'intervalle est de la forme:
    F(x) = Somme_i A_i cos(...k_i...x) + B_i sin(...k_i...x)
    (la forme exacte dépend de l'intervalle considéré [-pi;pi] [0:2pi] et/ou si la représentation est sous forme réelle ou complexe)
    Qu'il suffit alors d'appliquer pour les valeurs de x auxquelles tu souhaites ré-échantillonner.
    Non?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    bonjour tous,

    je suis désolé de l'incruster dans la discussion mais j'ai une question
    car je n'ai jamais vu d'interpolation par FFT, comment ça marche ?

    -> tu fais une FFT sur ta courbe expérimentale afin d'avoir les amplitudes des différentes fréquences.

    -> ensuite tu considère que les "pics" qui ont une amplitudes suffisante sont les plus représentatifs et tu les conserves (comment savoir le nombre de pics à conserver?)

    Ce qui me gène dans cette histoire c'est que si tu as pas trop de points expérimentaux alors du va louper pas mal de frequences dans ton signal et donc au final ton résultat sera surement moins bon qu'avec une interpolation de type polynomiale ou spline ?

    en gros quel est l'intéret de ce type d'interpolation ?

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par membreComplexe12 Voir le message
    bonjour tous,

    je suis désolé de l'incruster dans la discussion mais j'ai une question
    car je n'ai jamais vu d'interpolation par FFT, comment ça marche ?
    On considère que les données de départ sont le résultat de l'échantillonnage d'un signal continu réel (qui est inconnu).

    Avec la transformée de Fourier discrète, on construit une fonction qui représente le signal continu.

    Dans le domaine temporel, cette fonction f(t) est une somme de cosinus/sinus. On peut donc l'évaluer pour n'importe quelle valeur de "t", et donc faire un nouvel échantillonnage.

    Cette technique s'appelle le resampling.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Citation Envoyé par membreComplexe12 Voir le message
    Ce qui me gène dans cette histoire c'est que si tu as pas trop de points expérimentaux alors du va louper pas mal de frequences dans ton signal et donc au final ton résultat sera surement moins bon qu'avec une interpolation de type polynomiale ou spline ?

    en gros quel est l'intéret de ce type d'interpolation ?
    Il faut effectivement se poser la question de la précision des valeurs des points sur lesquels on base toute interpolation et du possible niveau de bruit associé.

    Ceci dit, si on souhaite une interpolation aussi précise que possible, alors une interpolation via une FFT est bien meilleure (convergence exponentielle vers la solution en fonction du nombre de points utilisés) qu'une interpolation de type spline ou polynomiale (typiquement d'une convergence d'ordre 2 ou 3).

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par takout Voir le message
    Cependant, la fonction de la transformée inverse que j'ai implémenté ne peut pas utiliser un tableau de taille différente que la courbe.
    Comment puis-je faire une interpolation en utilisant cette librairie ?
    Il te faut augmenter la taille de ton tableau en insérant des zéros pour les fréquences hautes (pour lesquelles on n'a pas d'information dans le signal original).

    google: fftw3 interpolation zero padding
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Merci Pseudocode,

    Pour un sur-échantillonnage le zero-padding fonctionne mais tu fais comment pour un sous-échantillonnage ?

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par takout Voir le message
    Merci Pseudocode,

    Pour un sur-échantillonnage le zero-padding fonctionne mais tu fais comment pour un sous-échantillonnage ?
    Réciproquement, tu raccourcis le tableau en supprimant les fréquences hautes avant de faire la transformée inverse.

    Pour du sous-échantillonnage, je ne suis pas certain que passer par FFT/iFFT soit réellement plus performant que de faire une convolution dans le domaine temporel. Tout dépend de la taille du signal et du filtre utilisé.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/12/2007, 16h17
  2. comment tracer une courbe avec gtk
    Par killer_instinct dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 01/10/2007, 22h53
  3. dessiner une courbe avec OleExcel
    Par blondelle dans le forum C++Builder
    Réponses: 9
    Dernier message: 28/09/2006, 22h05
  4. Tracer une courbe avec 2 tableau de points
    Par babarpapa dans le forum 2D
    Réponses: 3
    Dernier message: 19/04/2006, 15h24
  5. Interpolation sur une polyline avec tangentes
    Par Pedro dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 12/01/2006, 23h10

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