579
社区成员
发帖
与我相关
我的任务
分享
BOOL CGPULibrary::FFTC2CExec(const short *pInDataI, const short *pInDataQ, const int nCount,
double *pOutDataI, double *pOutDataQ)
{
//生成一个1维FFT句柄
cufftHandle hdFFT;
cufftResult result = cufftPlan1d(&hdFFT, nCount, CUFFT_C2C, 10); //传入的nCount为256
if(result != CUFFT_SUCCESS)
return FALSE;
//输入的I/Q两路数据初始化至cufftComplex 数组
cufftComplex *pComplex;
pComplex = new cufftComplex[nCount];
memset(pComplex, 0, nCount*sizeof(cufftComplex));
cufftComplex *pDevComplex;
cudaMalloc((void**)&pDevComplex, nCount*sizeof(cufftComplex)*10);
for (int i = 0; i < nCount; i++)
{
pComplex[i].x = pInDataI[i];
pComplex[i].y = pInDataQ[i];
}
//拷贝至设备缓冲区
cudaMemcpy(pDevComplex, pComplex, nCount*sizeof(cufftComplex), cudaMemcpyHostToDevice);
//执行FFT
cufftResult rfft = cufftExecC2C(hdFFT, pDevComplex, pDevComplex, CUFFT_FORWARD);
if(rfft == CUFFT_SUCCESS)
{
//拷贝输出结果
cudaMemcpy(pComplex, pDevComplex, nCount*sizeof(cufftComplex), cudaMemcpyDeviceToHost);
for (int i = 0; i < nCount; i++)
{
pOutDataI[i] = pComplex[i].x;
pOutDataQ[i] = pComplex[i].y;
}
}
//释放内存及句柄
delete pComplex;
cudaFree(pDevComplex);
cufftDestroy(hdFFT);
return (rfft == CUFFT_SUCCESS);
}