2017-12-19 28 views
1

저는 pyculib를 사용하여 Anaconda 3.5의 매트릭스에서 3D FFT를 수행합니다. 방금 웹 사이트에 게시 된 the example code을 따랐습니다. 그러나 나는 재미있는 것을 발견했고 그 이유를 이해하지 못합니다.pyculib를 사용한 3D FFT 결과가 잘못되었습니다.

행렬을 만들 때 numpy.arange을 사용할 때만 pyculib 행렬에서 3D FFT를 수행하는 것이 정확합니다.

from pyculib.fft.binding import Plan, CUFFT_C2C 
import numpy as np 
from numba import cuda 
data = np.random.rand(26, 256, 256).astype(np.complex64) 
orig = data.copy() 
d_data = cuda.to_device(data) 
fftplan = Plan.three(CUFFT_C2C, *data.shape) 
fftplan.forward(d_data, d_data) 
fftplan.inverse(d_data, d_data) 
d_data.copy_to_host(data) 
result = data/n 
np.allclose(orig, result.real) 

마지막으로,거짓으로 판명 : 여기

는 코드입니다. 그리고 orig결과가의 차이는 무시할 수있는 작은 숫자가 아닙니다. 다른 데이터 세트 (임의의 숫자가 아님)를 시도하고 잘못된 결과가 표시됩니다.

또한, 나는 역 FFT없이 테스트 :

from pyculib.fft.binding import Plan, CUFFT_C2C 
import numpy as np 
from numba import cuda 
from scipy.fftpack import fftn,ifftn 
data = np.random.rand(26,256,256).astype(np.complex64) 
orig = data.copy() 
orig_fft = fftn(orig) 
d_data = cuda.to_device(data) 
fftplan = Plan.three(CUFFT_C2C, *data.shape) 
fftplan.forward(d_data, d_data) 
d_data.copy_to_host(data) 
np.allclose(orig_fft, data) 

결과는 잘못된 것입니다.

웹 사이트의 테스트 코드는 numpy.arange을 사용하여 매트릭스를 만듭니다. 그리고 나는 시도했다 :

n = 26*256*256 
data = np.arange(n, dtype=np.complex64).reshape(26,256,256) 

그리고이 매트릭스의 FFT 결과가 맞다.

아무도 이유를 지적하는 데 도움이 될 수 있습니까?

답변

0

저는 CUDA를 사용하지 않지만 귀하의 문제는 본질적으로 수치라고 생각합니다. 차이점은 사용중인 두 데이터 세트에 있습니다. random.rand에는 0-1의 동적 범위와 0-26 * 256 * 256의 범위가 있습니다. FFT는 값 범위/포인트 수의 순서로 공간 주파수 구성 요소를 분석하려고 시도합니다. arange의 경우, 이것은 일치가되고, FFT는 수치 적으로 정확합니다. 랜드의 경우 1/26 * 256 * 256 ~ 5.8e-7입니다.

CUDA를 사용하지 않고 numpy 배열에서 FFT/IFFT를 실행하면 비슷한 차이가 나타납니다.

+0

동의합니다. 일부 수치상의 문제 일 수 있습니다. 흥미로운 점은 오늘도 FFTW3을 사용해 보았습니다. 똑같은 일을했습니다. 그리고 pyfftw와 numpy.fft는 numpy.rand 입력과 동일합니다. 내가 커프스에 뭔가 잘못했는지 궁금합니다. – billinair