Précédent   Forum du club des développeurs et IT Pro > Autres langages > Algorithmes > Traitement d'images
Traitement d'images Forum d'entraide sur le traitement d'images et l'analyse d'images et de vidéos. Avant de poster : Cours de traitement d'images
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/06/2010, 15h20   #1
archive
Invité de passage
 
Inscription : 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 ?
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2010, 23h46   #2
Champialex
Membre régulier
 
Alexandre
Inscription : mai 2010
Messages : 49
Détails du profil
Informations personnelles :
Nom : Alexandre
Âge : 23

Informations forums :
Inscription : mai 2010
Messages : 49
Points : 75
Points : 75
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...
Champialex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2010, 10h23   #3
Nebulix
Membre chevronné
 
Inscription : avril 2004
Messages : 592
Détails du profil
Informations personnelles :
Localisation : France, Essonne (Île de France)

Informations forums :
Inscription : avril 2004
Messages : 592
Points : 759
Points : 759
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)
Nebulix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2010, 10h26   #4
archive
Invité de passage
 
Inscription : juin 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 11
Points : 0
Points : 0
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)
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2010, 10h53   #5
Nebulix
Membre chevronné
 
Inscription : avril 2004
Messages : 592
Détails du profil
Informations personnelles :
Localisation : France, Essonne (Île de France)

Informations forums :
Inscription : avril 2004
Messages : 592
Points : 759
Points : 759
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)
Nebulix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2010, 12h00   #6
archive
Invité de passage
 
Inscription : juin 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 11
Points : 0
Points : 0
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)).
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2010, 21h18   #7
Champialex
Membre régulier
 
Alexandre
Inscription : mai 2010
Messages : 49
Détails du profil
Informations personnelles :
Nom : Alexandre
Âge : 23

Informations forums :
Inscription : mai 2010
Messages : 49
Points : 75
Points : 75
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...
Champialex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2010, 21h22   #8
Champialex
Membre régulier
 
Alexandre
Inscription : mai 2010
Messages : 49
Détails du profil
Informations personnelles :
Nom : Alexandre
Âge : 23

Informations forums :
Inscription : mai 2010
Messages : 49
Points : 75
Points : 75
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.
Champialex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2010, 21h50   #9
archive
Invité de passage
 
Inscription : juin 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 11
Points : 0
Points : 0
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)
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 01h23   #10
Champialex
Membre régulier
 
Alexandre
Inscription : mai 2010
Messages : 49
Détails du profil
Informations personnelles :
Nom : Alexandre
Âge : 23

Informations forums :
Inscription : mai 2010
Messages : 49
Points : 75
Points : 75
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.
Champialex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 09h56   #11
Nebulix
Membre chevronné
 
Inscription : avril 2004
Messages : 592
Détails du profil
Informations personnelles :
Localisation : France, Essonne (Île de France)

Informations forums :
Inscription : avril 2004
Messages : 592
Points : 759
Points : 759
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)
Nebulix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 11h13   #12
archive
Invité de passage
 
Inscription : juin 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 11
Points : 0
Points : 0
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)
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 11h52   #13
Nebulix
Membre chevronné
 
Inscription : avril 2004
Messages : 592
Détails du profil
Informations personnelles :
Localisation : France, Essonne (Île de France)

Informations forums :
Inscription : avril 2004
Messages : 592
Points : 759
Points : 759
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

Citation:
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
Citation:
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.
Citation:
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)
Nebulix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 12h10   #14
archive
Invité de passage
 
Inscription : juin 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 11
Points : 0
Points : 0
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
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 13h00   #15
Champialex
Membre régulier
 
Alexandre
Inscription : mai 2010
Messages : 49
Détails du profil
Informations personnelles :
Nom : Alexandre
Âge : 23

Informations forums :
Inscription : mai 2010
Messages : 49
Points : 75
Points : 75
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!!)
Champialex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 13h25   #16
archive
Invité de passage
 
Inscription : juin 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 11
Points : 0
Points : 0
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 ?
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 14h17   #17
Champialex
Membre régulier
 
Alexandre
Inscription : mai 2010
Messages : 49
Détails du profil
Informations personnelles :
Nom : Alexandre
Âge : 23

Informations forums :
Inscription : mai 2010
Messages : 49
Points : 75
Points : 75
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)
Champialex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 14h37   #18
Nebulix
Membre chevronné
 
Inscription : avril 2004
Messages : 592
Détails du profil
Informations personnelles :
Localisation : France, Essonne (Île de France)

Informations forums :
Inscription : avril 2004
Messages : 592
Points : 759
Points : 759
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)
Nebulix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 15h02   #19
archive
Invité de passage
 
Inscription : juin 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 11
Points : 0
Points : 0
Merci beaucoup pour vos explications et votre temps
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2010, 18h11   #20
archive
Invité de passage
 
Inscription : juin 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 11
Points : 0
Points : 0
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) ?
archive est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h08.


 
 
 
 
Partenaires

Hébergement Web