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.
Vous devez vous connecter pour publier un commentaire.
La FFT peut être considéré comme une façon de produire un ensemble de vecteurs de chacun avec une amplitude et une phase. Le fft_shift change le point de référence pour un angle de phase de zéro, à partir du bord de la FFT de l'ouverture, au centre de l'entrée d'origine vecteur de données.
La phase (et donc la composante réelle de l'vectoriel complexe) de la résultat est parfois moins "nerveux" lorsque cela est fait, surtout si certaines d'entrée de la fonction est fenêtré, telle qu'elle est discontinue, sur les bords de la FFT ouverture. Ou si l'entrée est symétrique autour du centre de la FFT, l'ouverture, la phase de la FFT résultat sera toujours égale à zéro après une fft_shift.
Un fft_shift peut être fait par un vecteur rotation de N/2, ou en basculant simplement une alternance de signe de bits dans la FFT résultat, qui peut être de plus de CPU dcache sympathique.
La définition de la sortie de
fft
(etifft
) est ici: http://docs.scipy.org/doc/numpy/reference/routines.fft.html#background-informationC'est ce que les routines de calcul, pas plus et pas moins. Observer que la transformée de Fourier discrète est assez différente de la poursuite de la transformation de Fourier. Pour un densément échantillonné de fonction il y a un lien entre les deux, mais la relation implique également la phase de facteurs et de mise à l'échelle, en plus de
fftshift
. C'est la cause des oscillations que vous voyez dans votre parcelle de terrain. La nécessaire phase facteur que vous pouvez travailler sur vous-même à partir de la formule mathématique ci-dessus pour la DFT.