programme pour transformé de fourier discrète
Forum Programmation : programme pour transformé de fourier discrète
bonjour tout le monde !
Voilà je dois obtenir un programme qui me permettrait d'obtenir le spectre d'une courbe que j'acquière à l'aide d'un accéléromètre. Grâce au logiciel fourni avec l'accéléromètre, je peux obtenir un tableau de valeur (j'obtiens l'amplitude de l'accélération toutes le mms soit 30000 points pour 30s) et je voudrais à l'aide de ce tableau obtenir le spectre du signal.
Pouvez vous m'aider à le réaliser svp
soit avec visal c++
soit avec mathematica
PS : il existe bien une fonction sous mathematica mais j'obtiens vraiment des trucs bizarre
A choisir, il vaut mieux utiliser mathematica ou mapple.
Et si c'est pour faire sa propre fonction, je pense qu'il vaut mieux rester sous mathematica, ça te sera plus simple pour faire les calculs.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
je sais mais j'ai beau essayé je n'y arrive pas ...
ma liste de valeur est la liste 1 et j'ai rentré le code:
ListPlot[Abs[Fourier[liste1]], Joined -> True]
mais j'obtiens vraiment un truc étrange
et quand j'essaye avec un sinus je n'obtiens pas du tout le spectre :
data = Table[Sin[30 2 Pi n/200], {n, 200}];
ListLinePlot[Abs[Fourier[data]], PlotRange -> All]
enfin j'obtiens deux raies : une à 30 et l'autre à 170
Message édité par samc12 le 29-03-2008 à 18:40:50
Celle à 170 est grande ? parce que c'est peut-être dû à la précision (dans l'arrondi et le nombre de valeurs).
As-tu essayé de prendre une puissance de 2 pour n? par exemple 1024.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
elles ont la même taille toute les deux
Sinon j'obtiens la même chose sauf que le spectre est déplacé, j'ai vraiment l'impression que l'abscisse ne correspond pas à la frequence et qu'il y a une sorte de symétre
Non, je disais n'importe quoi. Cette symétrie est normale puisque la transformée de Fourier du sinus est représentée par 2 pic de Dirac, donc c'est normal.
Ton abscisse va de 0 à 200, c'est l'échantillonnage.
Comme sin(an)=(e^(i.a.n) - e^(-i.a.n)) / 2i, et que ta transformée de Fourier sont des coefficients fréquentiels de e^(i.la suite), c'est normal que tu as 2 valeurs, il faut voir ça dans le plan complexe et pas le plan réel.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
est-ce que tu as une idée pour que je repère facilement les fréquences qui m'intéressent ...
je ne sais pas ... en rajoutant un sinus dont on connait la fréquence ou en divisant par l'echantillonage
quand je dis fréquence qui m'intersse je veux dire là où il y a des pics plus importants
les 2 pics sont importants pour reconnaitre le sinus, Tu peux te contenter de ne prendre que la moitié [0, Pi] au mieu de [0, 2Pi] si tu n'analyses que des compositions sinusoïdales, mais pour des décomposition de signaux quelconque, il vaut mieux tout garder.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
qu'est ce que tu veux dire par
| Citation : Tu peux te contenter de ne prendre que la moitié [0, Pi] au lieu de [0, 2Pi] |
car ce qui est étrange également c'est que "mon spectre" s'étend en abscisse de 0 au nombre de valeurs de valeurs dans mon tableau ...(que ce soit pour le tableau à partir du sinus ou des résultats expérimentaux)
Message édité par samc12 le 30-03-2008 à 17:35:15
oui c'est normal pour le calcul des coefficients se fait de 0 à n, où n est le nombre d'échantillon (200). Ton spectre n'est donc que dans tes 200 valeurs, ça te retourne tous les coeff de la série de Fourier.
pour chaque valeur, c'est le coefficient multiplié par la fonction exponentielle complexe, la somme de toutes ces fonctions donne le signal initial. Ici, tu as une soustraction de 2 exponentielles qui donne un sinus.
Tu peux reporter tes valeurs de [0, 200] sur [-Pi, Pi]
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Salut tout ça
On est le 4 Avril, il est 6h43 et j'ai jusqu'à 15h pour faire marcher mon programme de fft en C/C++.
Toute aide est la bienvenue d'autant que j'ai commencé ce projet dans l'esprit gérer des cartes d'acquisition.
Une sorte d'échange de bons procédés, que même si personne ne m'aide, je mettrai un lien au plus tard à 15h02 vers mon code source.
En attendant, voici la version qui donne :
[Etienne@boiboite FFT]$ g++ essai.cpp
essai.cpp: In function ‘long int inverse(int, int)’:
essai.cpp:58: attention : converting to ‘int’ from ‘double’
essai.cpp:59: attention : converting to ‘int’ from ‘double’
essai.cpp: In function ‘int main()’:
essai.cpp:74: attention : converting to ‘int’ from ‘double’
[Etienne@boiboite FFT]$ ./a.out
Erreur de segmentation
code source :
http://rafb.net/p/6nKL9g87.html
Au fait le converting to ‘int’ from ‘double’ c'est pas grave.
Merci d'avance.
http://rafb.net/p/RsZvrB12.html
Probleme d'algorithme maintenant...
Peux-tu commenter et espacer ton code ? (je n'exécute aucun code)
Après je regarderai.
Déjà, de ton côté, rien qu'en faisant cette revue de code tu peux trouver des erreurs.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Il y a 243 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
