преобразование Matlab FFT в CUDA FFT - PullRequest
2 голосов
/ 20 апреля 2011

В настоящее время я использую следующую функцию Matlab:

function out = fft_2d(in)

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

Насколько я понимаю, он принимает входные данные «естественного порядка» и «обменивает» их для передачи в fft2, а затем снова сдвигает результат fft2, используя fftshift, чтобы вернуть мне вывод естественного порядка. это правильно?

Я портирую этот код на 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? Кроме того, нужно ли, чтобы данные были блоком непрерывных данных NX * NY? Должен ли он быть в главном порядке столбцов или строк? Роу, я думаю, так как это то, что С.

Спасибо

1 Ответ

2 голосов
/ 20 апреля 2011

Вход в CUDA FFT:

Ширина пада к ячейке (ширина / 2 + 1) * 2 из-за сложного формата в частотной области. Этот начальный отступ будет размером с результирующее изображение -> должен обрезать результат.

Затем добавьте к целой степени 2 * целую степень 2 реальной матрицы с плавающей точкой (ноль дополняется справа и снизу).

Выведите, r, i, r, i, ... даже комплексные значения с плавающей точкой (реальный столбец, воображаемый столбец, реальный столбец, ...), с нулем, дополненным вокруг центра.

Использовать сложное умножение в частотной области, а не обычное.

После IFFT обрежьте стороны изображений, чтобы получить высоту * ceil (width / 2 + 1) * 2 center. Снова обрежьте, чтобы удалить возможную лишнюю строку справа, если есть (обрезать до высоты * ширины).

Не забудьте FIT-shift. Я не могу вспомнить наверняка, когда, Поэтому попробуйте переключиться после ifft snd, если результат неправильный, затем после fft.

Попробуйте умножить на дельта-ядро для тестирования.

Ядро должно располагаться вокруг центра, а не угла.

Для четных матриц центр - это половина ячейки справа и под центром.

Вы можете написать собственное ядро ​​CUDA для заполнения, а другое - для распаковки и сдвига за один раз.

...