2017-02-10 1 views
3

Je veux transformer une fonction de Fourier psi(x), la multiplier par une fonction d'espace-k exp(-kx^2-ky^2), puis inverser la transformation de Fourier du produit en x-espace. Mais mes grilles x-space et k-space sont centrées, et je sais que j'ai besoin de fftshift et de ifftshift pour implémenter correctement ma multiplication de l'espace k. Mais je ne comprends pas comment ils fonctionnent, donc je ne sais pas dans quel ordre les implémenter. Quelqu'un pourrait-il me dire si je l'ai fait correctement ici?Corriger l'ordre de l'implémentation de fftshift et ifftshift (en python)

import scipy.fftpack as spfft 
import numpy as np 

#Create a centred k-space grid] 

kxmax, kymax = 10,10 
kxgrid = np.linspace(-kxmax/2, kxmax/2, NX) 
kygrid = np.linspace(-kymax/2, kymax/2, NY) 
KX, KY = np.meshgrid(kxgrid, kygrid, indexing='xy') 

psi = spfft.ifft2(spfft.fftshift(np.exp(-(KX**2 + KY**2)) * spfft.fftshift(spfft.fft2(psi)))) 

Répondre

1

Non, mais ce n'est pas grave, cela peut être très déroutant. Première chose: fft et ifft exigent que l'origine soit au début du vecteur (ou dans votre cas 2D, en haut à gauche du tableau). L'origine de l'entrée psi est-elle centrée comme KX? Si c'est le cas, son origine doit être décalée au début avec ifftshift. (Sinon, le laisser seul.)

Deuxièmement: depuis KX et KY ont des origines dans leurs centres, vous devez les premières fonctions: vous avez besoin spfft.ifftshift(np.exp(-(KX**2 + KY**2)) (notez le i).

Enfin: votre sortie psi aura donc son origine au début. Si vous voulez que son origine soit centrée comme KX, fftshift il.

En résumé:

inputOriginStart = # ... 
inputOriginStartFFT = spfft.fft2(psiOriginStart) 
filterOriginStartFFT = spfft.ifftshift(np.exp(-(KX**2 + KY**2))) 
outputOriginStart = spfft.ifft2(filterOriginStartFFT * inputOriginStartFFT) 

inputOriginStart est l'entrée psi en supposant qu'il est l'origine est au début, et où outputOriginStart est la sortie psi -renamed pour plus de clarté. (Je vais toujours pour plus de clarté. Si cela ne fonctionne pas, vous pouvez comprendre plus facilement sortir.)

Modifier corrigé l'erreur indiquée par le demandeur oui, j'ai eu une erreur, laisser l » origine psiOriginStart au début; puis ifftshift la fonction d'origine centrée de KX et KY. (Si vous voulez l'origine de ses premières fonctions « outputOriginStart au centre puis utilisez fftshift.)

Edit 2 séparés du filtre (fonction de KX et KY) à partir des données pour rendre les parenthèses correctes évidente.


Comment les garder droites? Quelques trucs à retenir:

  • fft et ifft toujours besoin d'entrées et sorties donnent dont les origines remontent au début. Cela devrait être facile à retenir de l'expérience.
  • fftshift prend l'origine-origine que fft a besoin/fait et déplace l'origine vers le centre. Encore une fois, j'ai tendance à me souvenir facilement de cela à cause de la mémoire musculaire en tapant fftshift(fft(...)) mille fois.
  • Enfin, la seule chose restante est de déduire que ifftshift est l'inverse de fftshift: il prend des vecteurs/tableaux d'origine centrée et décale l'origine au début.
+0

J'ai une confusion, pourquoi 'spfft.fftshift (spfft.fft2 (psiOriginStart)))'? Une fois que j'ai transformé "psiOriginstart" de Fourier en haut à gauche, je dois rester là pour multiplier avec 'spfft.ifftshift (np.exp (- (KX ** 2 + KY ** 2))', non? Enfin, je 'ifftshift' revenir au centre.Il devrait donc être' spfft.ifft2 (spfft.ifftshift (np.exp (- (KX ** 2 + KY ** 2)) * spfft.fft2 (psiOriginStart))) '' right, – ap21

+0

@ ap21 vous avez absolument raison-vous comprenez maintenant !!! Désolé pour la confusion! J'ai édité la réponse.Il suffit d'une note: dans votre commentaire, vous avez dit, "Enfin, je reviens au centre" -pas tout à fait, vous feriez glisser l'origine depuis le début vers le centre (voir la deuxième puce) La modification inclut cette note –

+0

Je pense qu'il y a peut-être encore une erreur dans vos parenthèses. de 'exp (-kx^2 + ky^2)' comme dans 'spfft.ifftshift (np.exp (- (KX ** 2 + KY ** 2)))' au lieu de faire 'spfft.ifftshift (np .exp (- (KX ** 2 + KY ** 2)) * spfft.fft2 (psiOriginStart)) ', comme vous l'avez écrit, n'est-ce pas? – ap21