Transformée de Fourier discrète: Comment utiliser fftshift correctement avec la fft

Je veux calculer numériquement la FFT sur un tableau numpy Y. Pour les tests, je suis en utilisant la fonction Gaussienne Y = exp(-x^2). L' (symbolique) de transformée de Fourier est Y' = constante * exp(-k^2/4).

import numpy
X = numpy.arange(-100,100)
Y = numpy.exp(-(X/5.0)**2)

L'approche naïve échoue:

from numpy.fft import *
from matplotlib import pyplot

def plotReIm(x,y):
    f = pyplot.figure()
    ax = f.add_subplot(111)
    ax.plot(x, numpy.real(y), 'b', label='R()')
    ax.plot(x, numpy.imag(y), 'r:', label='I()')
    ax.plot(x, numpy.abs(y), 'k--', label='abs()')
    ax.legend()


Y_k = fftshift(fft(Y))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)

réel(Y_k) sauts entre des valeurs positives et négatives, ce qui correspond à un saut de phase, ce qui n'est pas présent dans la symbolique résultat. Ce n'est certainement pas souhaitable. (Le résultat est techniquement correcte, dans le sens que l'abs(Y_k) donne les amplitudes comme prévu ifft(Y_k) est Y.)

Ici, la fonction fftshift() rend la matrice k monotone croissante et les changements Y_k en conséquence. Les paires zip(k, Y_k) ne sont pas modifiées par l'application de cette opération, les deux vecteurs.

Cela change semble corriger le problème:

Y_k = fftshift(fft(ifftshift(Y)))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)

Est-ce la bonne façon d'employer la fft() la fonction si monotone Y et Y_k sont nécessaires?

L'opération inverse de ci-dessus est:

Yx = fftshift(ifft(ifftshift(Y_k)))
x = fftshift(fftfreq(len(Y_k), k[1] - k[0]))
plotReIm(x,Yx) 

Pour ce cas, le la documentation stipule clairement que Y_k doivent être triés compatible avec la sortie de la fft() et fftfreq(), que l'on peut obtenir en appliquant ifftshift().

Ces questions ont été me tracasse depuis un certain temps et Sont de sortie et d'entrée des tableaux de à la fois fft() et ifft() toujours tel que a[0] should contain the zero frequency term, a[1:n/2+1] should contain the positive-frequency terms, and a[n/2+1:] should contain the negative-frequency terms, in order of decreasingly negative frequency [numpy de référence], où "fréquence" est la variable indépendante?

La réponse sur Transformée de Fourier d'une Gaussienne est pas une Gaussienne ne pas répondre à ma question.

InformationsquelleAutor Jan | 2011-10-12