2017-10-10 16 views
0

저는 python을 사용하여 split-step 푸리에 변환 메소드를 작성했습니다. 나는 대체로 무슨 일이 벌어지고 있는지 이해하고 있다고 생각하지만, 나는 단지 하나의 변수로 작동하려고 할 때 많은 변수들이 왜 바뀌는 지 이해할 수 없다.pyFFTW가 예상보다 많은 변수를 연결합니다.

아래 코드에서 1D 배열 (complex128) 인 E으로 시작하고 처음에는 a에 할당합니다. 그런 다음 DFT를 계획하여 시간과 주파수 사이에서 앞뒤로 움직이는 2 가지 작업을 수행합니다.

내 코드 : 나는 코드의 두 번째 부분에 일단

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 

문제는 a[:] = np.power(np.absolute(A0),2)를 할당한다뿐만 아니라 aA0을 변경하는 것 같다.

Iz = np.power(np.absolute(A0),2) + fft_object()에서도 마찬가지입니다. a 또는 b을 할당 한 각 변수는 임시 변수가 아니라 링크 된 상태로 유지됩니다.

무슨 일 이니?

답변

0

Ea (확인 : E is a으로 확인)입니다. FFTW 개체의 두 번째 인수는 출력 배열이며 ifft_object() 일 때 반환되는 출력 배열이기 때문입니다.

그런 다음 EA0을 할당, 그래서 당신은 a을 변경할 때이 같은 객체이기 때문에 절대적으로, 당신은 또한, A0을 변경합니다.

FFTW 개체를 사용하는 경우 이러한 것들을 조심해야합니다. 복사본을 최소화하기 위해 설계되었으므로 배열을 올바로 맞춰야합니다. 이 작업을 원하지 않으면 pyfftw.builders 인터페이스를 사용하는 것이 좋습니다.