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