# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Transforme de Fourier : comment visualiser le spectre ?

## archive

Bonjour,  :;): 

Je dveloppe actuellement un algo pour calculer une transforme de Fourier,  partir d'un ensemble de valeurs.

Jusque l, a marche, sauf qu'aprs, une fois que j'ai les valeurs des coefficients, je ne sais pas comment tracer le graphe : amplitude en fonction de la frquence (le spectre quoi). (C'est pas un problme 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 ?

----------


## Champialex

Dj,  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 discrtisation du spectre. Il y a plein de faon de faire. Tu peux dcider de relier deux points par un segment de droite, ou par une courbe du second degr ou... ou simplement faire ca en mode histogramme...

----------


## Nebulix

Attention la FT transforme un tableau de nombres complexes en un autre tableau de nombres complexes.
Il peut y avoir des conditions non formules qui dterminent ce que tu dois considrer 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 dpend de ton problme physique de dpart.
Cel peut tre l'amplitude et la phase de chaque complexe ou partie relle et partie imaginaire ou densit de puissance (=carr de l'amplitude)

----------


## archive

Merci  vous  :;): 


Donc l'amplitude vaut An = sqrt(an + bn).
avec an la partie relle et bn la partie imaginaire

Ok, c'est bien ce que j'avais fait. 
De mme, la phase est dfinis par 
tan(Phi) = bn/an <=> Phi = arctan(bn/an)
et la frquence
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-ime 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 (relles) et je veux approcher la courbe grce  fourier, et aussi avoir son spectre (sous forme d'histogramme)

----------


## Nebulix

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 problme *physique* qui t'a amen  ce calcul

----------


## archive

> Ce l n'a rien avoir avec l'informatique mais avec le problme *physique* qui t'a amen  ce calcul


Oui, je suis d'accord, mais je n'ai justement aucune ide de ce que je dois utiliser comme valeurs  ::(: 

Mais peut tre pourrez-vous me rpondre.

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 frquence.

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

----------


## Champialex

Comme l'as dit Nebulix, c'est  toi de choisir! Tu dois d'abord dterminer ce qui t'intresse 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 frquence donne de faon globale, mais tu perd les informations lies  la phase...

----------


## Champialex

Peut tre que la rponse que tu attend c'est plutt ca : si tu choisis de tracer le module en fonction de la frquence, ca sera : pour la frquence n*f, le module vaut An.

----------


## archive

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  :


```

```

Ce qui ne correspond pas au graphe qu'on devrait obtenir : (cf http://lsiwww.epfl.ch/LSI2001/teachi.../lec6.html#4.2)

----------


## Champialex

Une premire remarque, le motif priode d'un signal rigoureusement carr ressemblerais plutt  : 1 1 1 1 -1 -1 -1 -1
De plus, dans le lien que tu donne, la TF est calcule en temps continue, toi tu dois faire une TFD, qui sera priodique de priode 1 et paire (ce qui est d'ailleurs le cas de ton spectre, puisqu'en ralit, l'chelle que tu as mise en Hz en dessous n'est pas en Hz mais en frquence rduite, puisque tu as fait une TFD).
En bref, fait attention, ne mlange pas temps continu et temps discret!!! Je suis dsol, j'ai pas t trs clair, mais il faudrait faire tout  un cour. Regarde  TFD sur wikipedia, ce n'est pas trs complet mais bon, tu peux complter avec l'article en anglais, et ya surement des truc biens sur google.
Et si tu veux augmenter le nbr de pics, augmente la frquence d'chantillonnage.

----------


## Nebulix

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 frquence d'chantillonnage (critre de Shannon) de faon  avoir suffisamment d'harmoniques pour que les queues des distributions ne se chevauchent pas trop.

----------


## archive

Merci pour vos rponses  :;): 

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 mme allure pour le spectre ?

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


J'ai recalcul des valeurs en appliquant les rectifications :

Je travaille dsormais 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 frquence 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 ime valeur)
La frquence 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 frquence de cette harmonique est : F = 12 Hz 

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

----------


## Nebulix

> est ce que le premier coefficient que j'obtiens avec fourier (le 0) correspond  la frquence nulle ?


Oui




> Si j'ai bien compris, la frquence fondamentale est celle de l'harmonique ayant la plus grande amplitude.


NON c'est la frquence 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 dcroissent de 1 7. Vrifie ton algo.



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


En partie seulement. Il y a surtout le fait que tu travailles avec un nombre fini de points.

----------


## archive

> NON c'est la frquence la + basse, ici 1


OK. Donc les frquences augmentent de 1 Hz  chaque valeur ? (0, 1, 2 etc hz) 
C'est toujours vrai avec une TFD ?




> Faux. Les coeff impairs dcroissent de 1 7. Vrifie ton algo.


 ::?:  J'ai utilis maple pour les calculer. Je vais vrifier mes notations. Je reposterai ensuite.




> En partie seulement. Il y a surtout le fait que tu travailles avec un nombre fini de points.


D'accord

----------


## Champialex

Juste un petit truc : une TFD est une fonction de R dans C... Elle n'est pas discrte!! Mais elle n'est pas forcment continue (en ralit ce n'est pas une fonction mais une distribution!!)

----------


## archive

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 rsultats.

Je travaille avec les mmes valeurs que prcdemment (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



> coeff impairs dcroissent 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 considrer que la moiti de ces valeurs, ou la totalit ; vu que quand je trace avec la moiti (les 8 premires) 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 donnes, 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 ?

----------


## Champialex

En ralit, seule la premire moiti des valeurs t'intresse pour passer de discret  continu. La deuxime moiti apparait parce que tu fait une TFD qui est une 1 priodique 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 frquences entre 0 et fe/2 ou fe est la frquence d'chantillonnage de ton signal de dpart, soit ici la premire 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 frquence 2*fe (qui n'est donc pas le mme que ton signal de dpart, 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 frquence d'chantillonnage au dpart (le nombre de 1 et de -1 que tu prend dans un motif priode)

----------


## Nebulix

0, 2.56, 0, 0.9, 0, 0.601, 0, 0.510, 0, 0.510, 0, 0.601, 0, 0.9, 0, 2.56
 ::ccool:: 
Tu pars de 16 donnes (8 nombres complexes), la FT en calcule autant et la FT inverse pareil. Aux points d'abscisse entire, tu dois retrouver tes valeurs de dpart.* L'interpolation entre ces points ne peut tre calcule.*
Ton chantillonnage ne peut pas distinguer entre une frquence 1 et un frquence 15 c'est ce que l'on appelle de l'aliasing.
Si tu attribues  la frquence 15 ce qui vient de la frquence 1, tu cres des oscillations.

----------


## archive

Merci beaucoup pour vos explications et votre temps  :;):

----------


## archive

Une dernire question  ::):  :

valeurs d'entre : 
1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1

Voici les modules obtenus :


```

```

Ce qui donne le graphe suivant :






il n'y a pas de symtrie : que fait le pic tout  gauche ?
Comment ce fait-il qu'il n'y ai pas de symtrie ?
Je ne sais pas o "couper" les donnes du coup (pas de "plan" de symtrie) ?

----------


## vadimcaen

Bonjour  tous, 

Je sais que je dterre un peu (beaucoup ?) ce sujet, mais je suis face  un problme similaire.

Pour commencer, je prcise tout de suite que je suis en 2eme anne de DUT informatique, donc le traitement du signal c'est pas ma spcialit  :;): 

Alors voil mon problme : j'ai besoin de savoir si un son (un enregistrement de la voix plus exactement) est vois (sonore) ou non (sourd). C'est  dire voir si on fait vibrer les cordes vocales ou pas.
J'ai trouv sur le net que l'une des spcification d'un son vois et qu'il est plus priodique qu'un son sourd et que donc on pouvait facilement voir cette diffrence via un transforme de fourrier. J'ai un son que j'ai transform avec une FFT, (algo trouv sur le site de apache) et donc j'ai bien mes nombres complexes. Sauf que maintenant j'aimerai bien les afficher sur un histogramme pour voir comment faire l'algo par la suite. 
Mais je n'ai aucune ide de comment faire. Je ne sais pas vraiment ce que reprsentent ces nombres (j'ai une vague ide grce  mon prof de maths) donc je ne sais pas comment faire le graphique. Tout ce que je sais c'est que je veux afficher le spectre.

Merci d'avance pour votre aide  ::): .

----------


## pseudocode

> J'ai un son que j'ai transform avec une FFT, (algo trouv sur le site de apache) et donc j'ai bien mes nombres complexes. Sauf que maintenant j'aimerai bien les afficher sur un histogramme pour voir comment faire l'algo par la suite.


La FFT donne une valeur complexe c(f) pour chaque frquence f.
Ce complexe c(f) reprsente l'amplitude et la phase de l'harmonique f.

pour complexe c(f) = a+ib, alors on a:
amplitude = racine(a+b)phase = 2.arctan(y/(x+amplitude))

(cf. coordonnes cartsiennes et polaires)

L'histogramme du spectre, c'est la valeur de l'amplitude de c(f) en fonction de la frquence f.

----------


## vadimcaen

Merci Beaucoup ! Tu viens de me dbloquer totalement  ::D:

----------

