2016-10-20 4 views
0

私は画像とカーネルでfftconvolveを実行するために与えられた例(https://github.com/ContinuumIO/numbapro-examples/blob/master/convolution/fftconvolve.py)に従っており、どちらも2次元配列です。私の使用例では、2つの1D配列を使ってfftconvolveを実行して、一致と遅延の可能性を探します。私は例を1Dに変換しようとしましたが、いくつかのエラーを受けました。おそらく、numbaproを通してCUDAを使って1次元配列fftconvolveを実行すると良い例はありますか?ありがとうnumbapro cudaとdimftal fftconvolve

答えて

2

1つのドメインで畳み込みを行うことは、フーリエ領域でfftを実行することと同じです。これは信号処理の基本の1つです。

したがって、vector1とvector2の畳み込みを行うには、単純にfft(1D)をvector1とvector2に適用し、2つの複素数変換を掛け合わせて(フィルタリング)、元のドメインに戻します。 CUDAで

、このようなものでなければなりません:

cufftHandle _planKernel // you fft handle 
cufftPlan1d(&_planKernel, _fftLen, CUFFT_C2C,    1); // create 1D fft handle 
cufftComplex* VECTOR1, *VECTOR2, *PRODUCT; 
MakeVector1Complex<<<blockSize, GridSize>>>() // simply set real part of the VECTOR1 = vector1, and set the imaginary part VECTOR to 0 
MakeVector2Complex<<<blockSize, GridSize>>>() // simply set real part of the VECTOR2 = vector2, and set the imaginary part VECTOR to 0 
cufftExecC2C(planKernel, VECTOR1, VECTOR1, CUFFT_FORWARD); // apply fft to VECTOR1 
cufftExecC2C(planKernel, VECTOR2, VECTOR2, CUFFT_FORWARD); // apply fft to VECTOR2 
ComplexMutiplication<<<blockSize, GridSize>>>(VECTOR1, VECTOR2) // complex multiplication of VECTOR1 and VECTOR2 

cufftExecC2C(planKernel, PRODUCT, PRODUCT, CUFFT_INVERSE); // inverse fft on the product of VECTOR1 AND VECTOR2 

MakeProductReal<<<blockSize, GridSize>>>(PRODUCT) // extract the real part of PRODUCT 

今、あなたの仕事が行われています。また、simpleCUFFTと呼ばれる例があります。C:¥ProgramData¥NVIDIA Corporation¥CUDAサンプル

関連する問題