2016-10-20 79 views
0

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

回答

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