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)
où 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.
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
@ 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 –
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