2013-01-24 76 views
0

您好,我必須使用CUFFT來卷積兩個信號[pulseMatrixRow [i]和pulse [i]]。對於我的代碼是 INT主(INT的argc,焦炭** argv的)如何在CUDA中執行零卷積以進行卷積

{ 
FILE *fileWritePtr; 
cufftComplex h_signal[NX*BATCH]; 
cufftComplex h_filter_signal[NX*BATCH]; 
cufftComplex hf_signal[NX*BATCH]; 

// Initalize the memory for the signal 
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i) 
{ 
    h_signal[i].x = pulseMatrixRow[i]; 
    h_signal[i].y = pulseMatrixRow[i]; 
} 

// device memory allocation 
    cudaMalloc((void**)&d_signal, sizeof(cufftComplex)*NX*BATCH); 

// transfer to device memory 
cudaMemcpy(d_signal, h_signal, sizeof(cufftComplex)*NX*BATCH, cudaMemcpyHostToDevice); 



// Initalize the memory for the filter 
for (unsigned int i = 0; i < FILTER_signal_SIZE; ++i) 

{ 
    h_filter_signal[i].x = pulse[i]; 
    h_filter_signal[i].y = pulse[i]; 
} 


// device memory allocation 
    cudaMalloc((void**)&d_filter_signal, sizeof(cufftComplex)*NX*BATCH); 

// transfer to device memory 
    cudaMemcpy(d_filter_signal, h_filter_signal, sizeof(cufftComplex)*NX*BATCH,   cudaMemcpyHostToDevice); 

    // CUFFT plan 

    cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH); 

    // Transform signal and fsignal 

printf("Transforming signal cufftExecC2C\n"); 
    cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal,  CUFFT_FORWARD); 


printf("Transforming filter_signal cufftExecC2C\n"); 
cufftExecC2C(plan, (cufftComplex *)d_filter_signal, (cufftComplex  *)d_filter_signal, CUFFT_FORWARD); 



// Multiply the coefficients together 
ComplexPointwiseMulAndScale<<<blocksPerGrid, threadsPerBlock>>>(d_signal, d_filter_signal, NX, 1.0f/NX*BATCH); 


// Transform signal back 
printf("Transforming signal back cufftExecC2C\n"); 
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_INVERSE); 



// transfer results from GPU memory 


cudaMemcpy(hf_signal, d_signal, sizeof(cufftComplex)*NX*BATCH,cudaMemcpyDeviceToHost); 


fileWritePtr = fopen("OutputData1.txt","w+"); 

for(i = 0; i < NX ; i++){ 
    //printf("%f %f\n", i, hf_signal[i].x, hf_signal[i].y); 
    fprintf(fileWritePtr,"%d %f %f\n", i, hf_signal[i].x, hf_signal[i].y); 
    } 
fclose(fileWritePtr); 



//Destroy CUFFT context 
cufftDestroy(plan); 

// cleanup memory 
cudaFree(d_signal); 
cudaFree(d_filter_signal); 


// free(h_signal); 
// free(h_filter_signal); 

return 0; 

} 
由matlab產生

我pulseMatrix代碼被給定爲:

pulse = [ones(1,50) zeros(1,500-50)]; 
pulseMatrix = repmat(pulse,10,1); 
pulseMatrix = pulseMatrix.'; 
pulseMatrixRow = pulseMatrix(:); 

,但我只處理1000個樣本的pulseMatrixRow在一次和休息一組一千個。 由於我的fft是1024,請告訴我如何以及在哪個階段我必須在輸入信號的末尾填充零點,以及我的濾波器信號,它簡單地給出如下: pulse = [ones(1,50)零( 1,500-50)];

+0

這似乎是一個信號處理/ FFT/DFT理論的問題,而不是編程/ CUDA庫的問題。我認爲你可以在做fft前將'd_signal'的尾部24個元素和'd_filter_signal'的尾部524個元素設置爲零。 – kangshiyin

+0

是的先生,但我是編程新手,請告訴如何將元素設置爲零,並在什麼階段....... – Ani

回答

1

你可以使用memset()爲零主機MEM的填充,它transfering到裝置MEM之前,或

你可以使用cudaMemset()到零裝置MEM的填充,做FFT之前和主機後設備內存傳輸。

關於如何使用memset()請參考this link

請參考this link瞭解如何使用cudaMemset()

+0

先生,基本上我試圖使用此命令,但根據我的知識,它使用將某些定義的值設置爲零,就像我傳遞100個樣本一樣,它用於將該值從100設置爲零。但如果我必須傳遞100個值,然後在它的末尾填充24個零,該怎麼辦? – Ani

+0

@Ankit你可以計算出24個元素的起始地址,然後像memset(&array [1000],0,24 * sizeof(array [0]));' – kangshiyin

+0

sir,通過使用這個命令,我的第一千個值變成零,接下來的24個都是1。 – Ani