0

我一直在关注一个示例(https://github.com/ContinuumIO/numbapro-examples/blob/master/convolution/fftconvolve.py),用图像和内核进行fftconvolve,它们都是二维数组。在我的用例中,我想对两个一维数组进行 fftconvolve 以寻找可能的匹配和延迟。我试图将示例转换为 1D,但收到了一些Invalid type combination错误。对于通过 numbapro 使用 CUDA 的一维数组 fftconvolve 是否有更好的示例?谢谢

4

1 回答 1

2

在时域做卷积相当于在傅里叶域做fft。这是信号处理的基础之一。

因此,要对vector1和vector2进行卷积,您可以简单地将fft(1D)应用于vector1和vector2,并将两个复数变换相乘(过滤),然后将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

现在你的工作完成了。在 cuda 工具包中还有一个名为“ simpleCUFFT ”的示例,您可以在C:\ProgramData\NVIDIA Corporation\CUDA Samples中找到该示例

于 2016-10-21T02:04:18.797 回答