Salut,
Auriez-vous une formule, un lien, un bout de programme, qui indique comment calculer la dérivée (ou simplement le nombre dérivé en un point) d'un signal d'après sa transformée de Fourier ?
Merci pour l'aide à un non matheux.
Salut,
Auriez-vous une formule, un lien, un bout de programme, qui indique comment calculer la dérivée (ou simplement le nombre dérivé en un point) d'un signal d'après sa transformée de Fourier ?
Merci pour l'aide à un non matheux.
bonjour,
Si F = TFourier{ f(x) }, alors TFourier{ df(x)/dx } = i.2PI.k.F(k)
Est-ce cela que tu cherchais ?
Peut-être, mais la transcription en code de ta formule n'est pas tout à fait dans mes cordes
Je vois que le message a été déplacé dans le forum mathématiques, ce qui n'est pas fait pour me rassurer
En attendant, j'ai bricolé ceci à partir d'une autre formule.
Comme je ne maîtrise pas non plus le pseudocode, je le laisse en java plutôt que de faire un méli-mélo bâtard ; ne pas tenir compte des petites idiosyncrasies :
Ceci s'applique lorsque le signal est une série de réels purs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 double[] dérivée(double[] réel, double[] imag) { int N = réel.length; double dpiN = 2d*Math.PI/(double)N; double[] signal = new double[N]; double facteur, angle; for(int t=0; t<N; t++){ for(int n=1; n<(N/2); n++) { facteur = -2d*dpiN*(double)n; angle = dpiN*(double)n*(double)t; signal[t] += facteur * ( (réel[n]*Math.sin(angle)) + (imag[n]*Math.cos(angle)) ) ; } /* cas n = N/2 */ facteur = -Math.PI; angle = Math.PI*(double)t; signal[t] += facteur * ( (réel[N/2]*Math.sin(angle)) + (imag[N/2]*Math.cos(angle)) ) ; /* Applique le facteur d'échelle */ signal[t] /= (double)N; } return signal; }
Apparemment, il faut calculer séparément le cas où n = N/2.
En fait j'ai rien compris, mais ça a l'air de marcher d'après un affichage graphique.
Reste à voir si ta formule conduit à un code plus simple ou plus rapide.
Edit : après relecture du code, je pense que les parametres de la fonction doivent être le résultat d'une FFT.
En fait, pour un recréer le signal à partir des coefs de la FFT on peut écrire:
et donc, il suffit de dériver (rappel: cos'(u)=-u'.sin(u) et sin'(u)=u'.cos(u))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 N-1 f(t) = 1/N . Somme{ reel[n]*cos(2pi.t.n/N) - imag[n]*sin(2pi.t.n/N) } n=0
Dans le cas d'un signal réel, on a coef[k]=coef[N-k]. On peut donc se contenter de calculer la somme entre 0 et N/2 puis la multiplier par 2. La seule exception etant pour k=N/2 si N est pair.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 N-1 f'(t) = 1/N . Somme{ reel[n]*-(2pi.n/N)*sin(2pi.t.n/N) - imag[n]*(2pi.n/N)*cos(2pi.t.n/N) } n=0 N-1 f'(t) = 1/N . Somme{ -(2pi.n/N).(reel[n]*sin(2pi.t.n/N) + imag[n]*cos(2pi.t.n/N)) } n=0
Non, c'est la meme formule. Elle est juste ecrite sous forme complexe.Reste à voir si ta formule conduit à un code plus simple ou plus rapide.
Ah, ben oui, alors, tout s'éclaire.
Merci d'avoir expliqué et... confirmé que la méthode est correcte
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager