2011-04-19 65 views
2

我目前使用下面的MATLAB功能的MATLAB FFT轉換爲CUDA FFT

function out = fft_2d(in) 

out = fftshift(fft2(ifftshift(in))); 

據我瞭解,這需要一個「自然秩序」的輸入,在和「互換」,它要傳遞給fft2,然後使用fftshift再次移動fft2的結果,讓我回到自然的排序輸出。它是否正確?

我正在將此代碼移植到C,並且我想使用CUFFT來執行此操作。根據該文件,我想我會用:

/* Create a 2D FFT plan. */ 
cufftPlan2d(&plan, NX, NY, CUFFT_C2R); 
/* Use the CUFFT plan to transform the signal out of place. */ 
cufftExecC2R(plan, idata, odata); 

但我將不得不做出來cufftExecC2R的數據是什麼樣移?此外,odata是否需要成爲NX * NY連續數據塊?它是否必須在列或行的主要順序?我會猜測,因爲那就是C是什麼。

由於

+0

我不知道ifftshift是什麼,爲什麼你需要它,但cuda fft部分看起來不錯。根據matlab的 – fabrizioM 2011-04-19 22:47:19

+0

幫助它撤銷fftshift的結果 – Derek 2011-04-20 17:35:36

回答

2

輸入到FFT CUDA:

墊寬度細胞(寬度/ 2 + 1)* 2由於在頻域的復格式。 這個初始填充將是結果圖像的大小 - >必須裁剪結果。

然後填充2個實數浮點矩陣的2 *整數冪的整數冪(從右下角填零)。

輸出,r,i,r,i,...甚至複數浮點值(實數列,虛數列,實數列,...),零填充在中心附近。

在頻域中使用複數乘法,而不是常規乘法。

IFFT後,裁剪圖像的邊緣以接收高度*細胞(寬度/ 2 + 1)* 2中心。 再次裁剪以刪除可能的多餘的線(如果有的話)(裁切爲高度*寬度)。

不要忘記FIT-shift。我不記得當然, 因此,如果結果是錯誤的,那麼在fft之後嘗試轉移ifft snd。

嘗試乘以delta內核進行測試。

內核應填充中心,而不是角落。

對於偶數矩陣,中心位於中心位置的右半格。

您可以編寫自定義的CUDA內核來執行填充操作,而另一個可以執行unpaddings並一次移動。