0

イメージとカーネルで fftconvolve を実行するために指定された例 ( https://github.com/ContinuumIO/numbapro-examples/blob/master/convolution/fftconvolve.py ) に従っています。どちらも 2D 配列です。私の使用例では、2 つの 1D 配列で fftconvolve を実行して、可能な一致と遅延を探したいと考えています。この例を 1D に変換しようとしましたが、いくつかInvalid type combinationエラーが発生しました。numbapro を介して CUDA を使用して 1 次元配列 fftconvolve に従うより良い例はありますか? ありがとう

4

1 に答える 1

2

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

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

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

これで作業は完了です。C:\ProgramData\NVIDIA Corporation\CUDA Samplesにある cuda ツールキットには、 「 simpleCUFFT 」という例もあります。

于 2016-10-21T02:04:18.797 に答える