Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 23
  1. #1
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut Transformée de Fourier : comment visualiser le spectre ?

    Bonjour,

    Je développe actuellement un algo pour calculer une transformée de Fourier, à partir d'un ensemble de valeurs.

    Jusque là, ça marche, sauf qu'après, une fois que j'ai les valeurs des coefficients, je ne sais pas comment tracer le graphe : amplitude en fonction de la fréquence (le spectre quoi). (C'est pas un problème de programmation, c'est juste que je ne connais pas les équations )

    Exemple :
    input : 1,2,3,4
    output : 5, -1+i, -1, -1-i

    OK !
    Mais comment tracer le graphe Amplitude = f( Hz ) ?

    J'ai cherché sur le net des documents, mais j'ai rien trouvé qui me convienne.
    Avez vous des liens svp ? ou des explications ?

  2. #2
    Membre régulier
    Profil pro Alexandre
    Inscrit en
    mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Nom : Alexandre
    Âge : 25

    Informations forums :
    Inscription : mai 2010
    Messages : 49
    Points : 73
    Points
    73

    Par défaut

    Déjà, à moins que tu fasse ton graphe en 3D, t'es obligé de prendre le module des coefficients. En gros ce que t'obtiens c'est une discrétisation du spectre. Il y a plein de façon de faire. Tu peux décider de relier deux points par un segment de droite, ou par une courbe du second degré ou... ou simplement faire ca en mode histogramme...

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    avril 2004
    Messages
    600
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 600
    Points : 745
    Points
    745

    Par défaut

    Attention la FT transforme un tableau de nombres complexes en un autre tableau de nombres complexes.
    Il peut y avoir des conditions non formulées qui déterminent ce que tu dois considérer en sortie. Ainsi la fonction dont tu parles est en fait :
    1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,....
    Ce que tu dois tracer dépend de ton problème physique de départ.
    Celà peut être l'amplitude et la phase de chaque complexe ou partie réelle et partie imaginaire ou densité de puissance (=carré de l'amplitude)
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  4. #4
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut

    Merci à vous


    Donc l'amplitude vaut An = sqrt(an² + bn²).
    avec an la partie réelle et bn la partie imaginaire

    Ok, c'est bien ce que j'avais fait.
    De même, la phase est définis par
    tan(Phi) = bn/an <=> Phi = arctan(bn/an)
    et la fréquence
    f = 1/(N * dt)
    où N est le nombre de valeurs (ici, 4) et dt l'intervalle de temps entre 2 mesures.

    On sait que le signal est donné par la somme des harmoniques.
    La n-ième harmonique s'écrit
    An*cos(n*2*Pi*f*t - Phi)

    Pourtant, lorsque je trace :

    Ao + An * cos(2*Pi*f*t - arctan(bn/an)) + An * cos(2*2*Pi*f*t - arctan(bn/an)) + ...

    je ne retrouve pas du tout mon signal d'origine !




    @Nebulix : d'accord. Mais comment savoir ce que je dois choisir ?
    Moi, j'ai un ensemble de valeurs (réelles) et je veux approcher la courbe grâce à fourier, et aussi avoir son spectre (sous forme d'histogramme)

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    avril 2004
    Messages
    600
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 600
    Points : 745
    Points
    745

    Par défaut

    La fonction arctan te renvoie une valeur entre -pi/2 et pi/2 alors que la phase de -1-i est -3*pi/4
    Comment savoir ce que tu dois choisir ? Ce là n'a rien avoir avec l'informatique mais avec le problème physique qui t'a amené à ce calcul
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  6. #6
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut

    Citation Envoyé par Nebulix Voir le message
    Ce là n'a rien avoir avec l'informatique mais avec le problème physique qui t'a amené à ce calcul
    Oui, je suis d'accord, mais je n'ai justement aucune idée de ce que je dois utiliser comme valeurs

    Mais peut être pourrez-vous me répondre.

    En fait, le signal sur lequel je travaille est un son. Mes valeurs sont donc l'amplitude du son en fonction du temps.
    Et j'ai besoin de fourier pour tracer l'amplitude en fonction de la fréquence.

    Ma question est : comment exploiter les données issues de fourier pour tracer ce graphe (l'amplitude en fonction de la fréquence (sous forme d'histogramme par exemple)).

  7. #7
    Membre régulier
    Profil pro Alexandre
    Inscrit en
    mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Nom : Alexandre
    Âge : 25

    Informations forums :
    Inscription : mai 2010
    Messages : 49
    Points : 73
    Points
    73

    Par défaut

    Comme l'as dit Nebulix, c'est à toi de choisir! Tu dois d'abord déterminer ce qui t'intéresse dans le spectre. Pourquoi en a-tu besoin? Par exemple, si tu choisit de ne tracer que le module, tu obtiens des infos sur l'importance que prend une fréquence donnée de façon globale, mais tu perd les informations liées à la phase...

  8. #8
    Membre régulier
    Profil pro Alexandre
    Inscrit en
    mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Nom : Alexandre
    Âge : 25

    Informations forums :
    Inscription : mai 2010
    Messages : 49
    Points : 73
    Points
    73

    Par défaut

    Peut être que la réponse que tu attend c'est plutôt ca : si tu choisis de tracer le module en fonction de la fréquence, ca sera : pour la fréquence n*f, le module vaut An.

  9. #9
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut

    OK.

    Prenons l'exemple d'un signal carré.
    Je prends donc comme valeurs :
    0
    1
    1
    1
    0
    -1
    -1
    -1

    En appliquant fourier, j'obtiens :

    0
    2(1+sqrt(2))*i
    0
    2(-1+sqrt(2))*i
    0
    -2(-1+sqrt(2))*i
    0
    -2(1+sqrt(2))*i

    soit en module :
    0 (0 Hz)
    4.828 (5 Hz)
    0 (10 Hz)
    0.828 (15 Hz)
    0 (20 Hz)
    0.828 (25 Hz)
    0 (30 Hz)
    4.828 (35 Hz)

    Le graphe ressemble donc à :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    +--+                          +--+
    |..|                          |..|
    |..|                          |..|
    |..|                          |..|
    |..|                          |..|
    |..|      +--+      +--+      |..|
    |..|      |..|      |..|      |..|
    +--+ +--+ +--+ +--+ +--+ +--+ +--+
    5 Hz 10 Hz
    Ce qui ne correspond pas au graphe qu'on devrait obtenir : (cf http://lsiwww.epfl.ch/LSI2001/teachi.../lec6.html#4.2)

  10. #10
    Membre régulier
    Profil pro Alexandre
    Inscrit en
    mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Nom : Alexandre
    Âge : 25

    Informations forums :
    Inscription : mai 2010
    Messages : 49
    Points : 73
    Points
    73

    Par défaut

    Une première remarque, le motif période d'un signal rigoureusement carré ressemblerais plutôt à : 1 1 1 1 -1 -1 -1 -1
    De plus, dans le lien que tu donne, la TF est calculée en temps continue, toi tu dois faire une TFD, qui sera périodique de période 1 et paire (ce qui est d'ailleurs le cas de ton spectre, puisqu'en réalité, l'échelle que tu as mise en Hz en dessous n'est pas en Hz mais en fréquence réduite, puisque tu as fait une TFD).
    En bref, fait attention, ne mélange pas temps continu et temps discret!!! Je suis désolé, j'ai pas été très clair, mais il faudrait faire tout un cour. Regarde à TFD sur wikipedia, ce n'est pas très complet mais bon, tu peux compléter avec l'article en anglais, et ya surement des truc biens sur google.
    Et si tu veux augmenter le nbr de pics, augmente la fréquence d'échantillonnage.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    avril 2004
    Messages
    600
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 600
    Points : 745
    Points
    745

    Par défaut

    Ce que tu prends pour le signal à 35Hz est essentiellement du signal à -5Hz qui se retrouve "replié" à la fin de l'intervalle. Tu auras toujours cet effet. Si tu veux te rapprocher de la figure, il te faut augmenter la fréquence d'échantillonnage (critère de Shannon) de façon à avoir suffisamment d'harmoniques pour que les queues des distributions ne se chevauchent pas trop.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  12. #12
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut

    Merci pour vos réponses

    Je viens de lire des articles sur les TFD notamment, et j'ai 3 questions :

    1. que l'on travaille en temps continu ou temps discret, ne doit on pas obtenir la même allure pour le spectre ?

    2. est ce que le premier coefficient que j'obtiens avec fourier (le 0) correspond à la fréquence nulle ?


    J'ai recalculé des valeurs en appliquant les rectifications :

    Je travaille désormais avec un ensemble de 16 valeurs :
    1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1

    J'obtiens :
    0, 0.02+0.048i, 0, 3.93+1.62i, 0, -0.0078-0.02i, 0, 9.44+3.86i, 0, 0.0199-0.0082i, 0, 4.03-9.44i, 0, 0.0478-0.0198i, 0, -1.48+3.96i

    soit en module :
    0, 0, 0, 4.34, 0, 0.0215, 0, 10.2, 0, 0, 0, 10.3, 0, 0.0517, 0, 4.23


    Si j'ai bien compris, la fréquence fondamentale est celle de l'harmonique ayant la plus grande amplitude. C'est donc celle de l'harmonique ayant une amplitude de 10.3 (12 ième valeur)
    La fréquence de cette harmonique est n/(N.dt), non ?
    avec n = 12 ; N = 16 échantillons, et dt l'intervalle entre 2 mesures donc 1/16
    Donc la fréquence de cette harmonique est : F = 12 Hz

    3. Est ce correct ? (j'en doute)

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    avril 2004
    Messages
    600
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 600
    Points : 745
    Points
    745

    Par défaut

    Citation Envoyé par archive Voir le message
    est ce que le premier coefficient que j'obtiens avec fourier (le 0) correspond à la fréquence nulle ?
    Oui

    Si j'ai bien compris, la fréquence fondamentale est celle de l'harmonique ayant la plus grande amplitude.
    NON c'est la fréquence la + basse, ici 1
    J'obtiens :
    0, 0.02+0.048i, 0, 3.93+1.62i, 0, -0.0078-0.02i, 0, 9.44+3.86i, 0, 0.0199-0.0082i, 0, 4.03-9.44i, 0, 0.0478-0.0198i, 0, -1.48+3.96i

    soit en module :
    0, 0, 0, 4.34, 0, 0.0215, 0, 10.2, 0, 0, 0, 10.3, 0, 0.0517, 0, 4.23
    Faux. Les coeff impairs décroissent de 1 à7. Vérifie ton algo.
    1. que l'on travaille en temps continu ou temps discret, ne doit on pas obtenir la même allure pour le spectre ?
    En partie seulement. Il y a surtout le fait que tu travailles avec un nombre fini de points.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  14. #14
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut

    Citation Envoyé par Nebulix Voir le message
    NON c'est la fréquence la + basse, ici 1
    OK. Donc les fréquences augmentent de 1 Hz à chaque valeur ? (0, 1, 2 etc hz)
    C'est toujours vrai avec une TFD ?

    Citation Envoyé par Nebulix Voir le message
    Faux. Les coeff impairs décroissent de 1 à7. Vérifie ton algo.
    J'ai utilisé maple pour les calculer. Je vais vérifier mes notations. Je reposterai ensuite.

    Citation Envoyé par Nebulix Voir le message
    En partie seulement. Il y a surtout le fait que tu travailles avec un nombre fini de points.
    D'accord

  15. #15
    Membre régulier
    Profil pro Alexandre
    Inscrit en
    mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Nom : Alexandre
    Âge : 25

    Informations forums :
    Inscription : mai 2010
    Messages : 49
    Points : 73
    Points
    73

    Par défaut

    Juste un petit truc : une TFD est une fonction de R dans C... Elle n'est pas discrète!! Mais elle n'est pas forcément continue (en réalité ce n'est pas une fonction mais une distribution!!)

  16. #16
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut

    Ok merci pour votre aide !

    J'ai refait les calculs avec maple (en utilisant FourierTransform() au lieu de fft()) et je trouve (bizarrement) d'autres résultats.

    Je travaille avec les mêmes valeurs que précédemment (16 valeurs).

    voici les modules :
    0, 2.56, 0, 0.9, 0, 0.601, 0, 0.510, 0, 0.510, 0, 0.601, 0, 0.9, 0, 2.56

    il me semble que les
    Citation Envoyé par Nebulix Voir le message
    coeff impairs décroissent de 1 à7
    Ca doit être bon

    J'ai deux questions :
    1. si je veux retracer la fonction, à partir des valeurs obtenues par fourier, dois-je considérer que la moitié de ces valeurs, ou la totalité ; vu que quand je trace avec la moitié (les 8 premières) j'obtiens un graphe qui colle vraiment au signal d'origine, alors qu'avec toutes les valeurs non.

    2. D'ailleurs, l'amplitude du signal (cf graphes) est de 2, alors que mon signal carré a une amplitude de 1. Pourquoi ?

    EDIT :

    Note : j'ai tracé le graphe ci dessous avec la (1 ère) moitié des données, ie :

    2.56.cos(2.Pi.t - arctan(-2.51/0.5)) + 0.9.cos(2.Pi.3t - arctan(-0.74/0.5)) + 0.601.cos(2.Pi.5t - arctan(-0.33/0.5)) + 0.510.cos(2.Pi.7t - arctan(-0.099/0.5))




    Le graphe qui suit a été tracé avec toutes les valeurs : il est pourtant beaucoup moins bien :

    2.56.cos(2.Pi.t - arctan(-2.51/0.5)) + 0.9.cos(2.Pi.3t - arctan(-0.74/0.5)) + 0.601.cos(2.Pi.5t - arctan(-0.33/0.5)) + 0.510.cos(2.Pi.7t - arctan(-0.099/0.5)) + 0.510.cos(2.Pi.9t - arctan(0.099/0.5)) + 0.601.cos(2.Pi.11t - arctan(0.33/0.5)) + 0.9.cos(2.Pi.13t - arctan(0.74/0.5)) + 2.56.cos(2.Pi.15t - arctan(2.51/0.5))


    Pouvez-vous m'expliquer svp ?

  17. #17
    Membre régulier
    Profil pro Alexandre
    Inscrit en
    mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Nom : Alexandre
    Âge : 25

    Informations forums :
    Inscription : mai 2010
    Messages : 49
    Points : 73
    Points
    73

    Par défaut

    En réalité, seule la première moitié des valeurs t'intéresse pour passer de discret à continu. La deuxième moitié apparait parce que tu fait une TFD qui est une 1 périodique et impaire, renseigne toi sur l'échantillonnage. En simple, pour reconstruire le signal continue à partir de la TFD, il faut que tu garde seulement les fréquences entre 0 et fe/2 ou fe est la fréquence d'échantillonnage de ton signal de départ, soit ici la première moitié du spectre que tu trace!
    Si tu garde le signal entier, ca veut dire que tu reconstruit un signal qui aurait été échantillonné à la fréquence 2*fe (qui n'est donc pas le même que ton signal de départ, puisque celui la tu l'as échantillonné à fe)
    Si tu veut un signal final plus proche du "vrai" signal carré, il faut que t'augmente la fréquence d'échantillonnage au départ (le nombre de 1 et de -1 que tu prend dans un motif période)

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    avril 2004
    Messages
    600
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 600
    Points : 745
    Points
    745

    Par défaut

    0, 2.56, 0, 0.9, 0, 0.601, 0, 0.510, 0, 0.510, 0, 0.601, 0, 0.9, 0, 2.56

    Tu pars de 16 données (8 nombres complexes), la FT en calcule autant et la FT inverse pareil. Aux points d'abscisse entière, tu dois retrouver tes valeurs de départ. L'interpolation entre ces points ne peut être calculée.
    Ton échantillonnage ne peut pas distinguer entre une fréquence 1 et un fréquence 15 c'est ce que l'on appelle de l'aliasing.
    Si tu attribues à la fréquence 15 ce qui vient de la fréquence 1, tu crées des oscillations.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  19. #19
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut

    Merci beaucoup pour vos explications et votre temps

  20. #20
    Invité de passage
    Inscrit en
    juin 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 11
    Points : 0
    Points
    0

    Par défaut

    Une dernière question :

    valeurs d'entrée :
    1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1

    Voici les modules obtenus :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    0.500
    2.32
    0.501
    0.421
    0.500
    0.703
    0.501
    0.966
    0.500
    0.966
    0.501
    0.703
    0.500
    0.421
    0.501
    2.32
    Ce qui donne le graphe suivant :






    il n'y a pas de symétrie : que fait le pic tout à gauche ?
    Comment ce fait-il qu'il n'y ai pas de symétrie ?
    Je ne sais pas où "couper" les données du coup (pas de "plan" de symétrie) ?

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •