|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
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 ? |
|
|
00
|
|
|
#2 |
|
Membre régulier
![]() Alexandre Inscription : mai 2010 Messages : 49 ![]() |
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...
|
|
|
00
|
|
|
#3 |
|
Membre chevronné
![]() Inscription : avril 2004 Messages : 592 ![]() |
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) |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
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) |
|
|
00
|
|
|
#5 |
|
Membre chevronné
![]() Inscription : avril 2004 Messages : 592 ![]() |
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) |
|
|
00
|
|
|
#6 | |
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
Citation:
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)). |
|
|
|
00
|
|
|
#7 |
|
Membre régulier
![]() Alexandre Inscription : mai 2010 Messages : 49 ![]() |
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...
|
|
|
00
|
|
|
#8 |
|
Membre régulier
![]() Alexandre Inscription : mai 2010 Messages : 49 ![]() |
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.
|
|
|
00
|
|
|
#9 | ||
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
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 :
|
||
|
|
00
|
|
|
#10 |
|
Membre régulier
![]() Alexandre Inscription : mai 2010 Messages : 49 ![]() |
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. |
|
|
00
|
|
|
#11 |
|
Membre chevronné
![]() Inscription : avril 2004 Messages : 592 ![]() |
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) |
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
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) |
|
|
00
|
|
|
#13 | ||||
|
Membre chevronné
![]() Inscription : avril 2004 Messages : 592 ![]() |
Citation:
Citation:
Citation:
Citation:
__________________
Ce qui s'énonce clairement se conçoit bien ( Le hautbois) |
||||
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
OK. Donc les fréquences augmentent de 1 Hz à chaque valeur ? (0, 1, 2 etc hz)
C'est toujours vrai avec une TFD ? D'accord |
|
|
00
|
|
|
#15 |
|
Membre régulier
![]() Alexandre Inscription : mai 2010 Messages : 49 ![]() |
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!!)
|
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
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 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 ? |
|
|
00
|
|
|
#17 |
|
Membre régulier
![]() Alexandre Inscription : mai 2010 Messages : 49 ![]() |
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) |
|
|
00
|
|
|
#18 |
|
Membre chevronné
![]() Inscription : avril 2004 Messages : 592 ![]() |
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) |
|
|
00
|
|
|
#19 |
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
Merci beaucoup pour vos explications et votre temps
|
|
|
00
|
|
|
#20 | ||
|
Invité de passage
![]() Inscription : juin 2010 Messages : 11 ![]() |
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 :
![]() 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) ? |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com