2017-10-10 1 views
0

J'utilise python pour écrire une méthode de transformation de Fourier en deux étapes en utilisant pyfftw. Je pense que je comprends la plupart du temps ce qui se passe, mais je ne peux pas comprendre pourquoi tant de mes variables changent quand j'essaie d'opérer sur un seul.pyFFTW liens plus de variables que prévu

Dans le code ci-dessous, je commence par un tableau 1D (complexe128), E, et l'affecte initialement à a. Ensuite, je passe par la planification des DFT afin que j'ai 2 opérations qui vont et viennent entre temps et fréquence.

Mon code:

a = pyfftw.empty_aligned(npts, dtype='complex128') 
b = pyfftw.empty_aligned(npts, dtype='complex128') 

a[:] = pyfftw.interfaces.numpy_fft.fftshift(E); 

fft_object = pyfftw.FFTW(a, b) 
EFT = fft_object() 

ifft_object = pyfftw.FFTW(b, a, direction='FFTW_BACKWARD') 
E = ifft_object() 

A0 = E; 
a[:] = np.power(np.absolute(A0),2) 
IFT = fft_object() 
b[:] = chi*IFT 
Iz = np.power(np.absolute(A0),2) + ifft_object() 
NLfn = A0 * Iz 

Le problème est une fois que je reçois dans la deuxième partie du code, l'attribution a[:] = np.power(np.absolute(A0),2) semble modifier A0 ainsi que a.

Cela se produit également dans Iz = np.power(np.absolute(A0),2) + fft_object(), où dans chaque cas, les variables que j'ai affecté a ou b semblent rester liées plutôt que d'être des variables temporaires.

Que se passe-t-il ???

Répondre

0

E est a (vérifiez en faisant E is a). Cela est dû au fait que le deuxième argument de l'objet FFTW est le tableau de sortie, qui est ce qui est renvoyé lorsque vous exécutez ifft_object().

Vous assignez ensuite A0 être E, donc tout à fait quand vous changez a, vous changez aussi A0, car ils sont le même objet.

Si vous utilisez l'objet FFTW, vous devez faire attention à de telles choses. Il est conçu pour minimiser les copies, donc c'est à vous de choisir les tableaux corrects. Si vous ne voulez pas faire cela, je suggère d'utiliser l'interface pyfftw.builders.