我一直在关注一个例子(https://github.com/ContinuumIO/numbapro-examples/blob/master/convolution/fftconvolve.py),它给fftconvolve一个图像和一个内核,两个都是2D数组。在我的用例中,我想用两个1D数组进行fftconvolve以寻找可能的匹配和延迟。我试图将示例转换为1D,但收到了一些Invalid type combination
错误。使用CUDA通过numbapro可能有一个更好的例子来跟随1维数组fftconvolve吗?感谢
答案 0 :(得分:2)
在时域中进行卷积相当于在傅立叶域中进行fft。这是信号处理的基础之一。
因此,要对vector1和vector2进行卷积,您可以简单地将fft(1D)应用于vector1和vector2,并将两个复数变换相乘(过滤),然后将产品反转回原始域。
在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
现在你的工作已经完成。 cuda工具包中还有一个名为“ simpleCUFFT ”的示例,您可以在 C:\ ProgramData \ NVIDIA Corporation \ CUDA Samples
中找到它。