Как выполнить cufft fwd и inv transform для определенной области интереса (ROI) в большем массиве?

Рассмотрим изображение размером 1920х1080. Как сделать манжету R2C и C2R для ROI 720х960?

1 ответ

Как отмечалось в комментариях, CUfft полностью поддерживает выполнение преобразований и обратных преобразований для подмножества данных в массивах с помощью расширенных функций компоновки данных API. Цитирование из документации:

Расширенная компоновка может восприниматься как дополнительный уровень абстракции над доступом к массивам данных ввода / вывода. Элемент координат [z][y][x] в сигнале с номером b в пакете будет связан со следующими адресами в памяти:

1D

input[ b * idist + x * istride]

output[ b * odist + x * ostride]

2D

input[b * idist + (x * inembed[1] + y) * istride]

output[b * odist + (x * onembed[1] + y) * ostride]

3D

input[b * idist + ((x * inembed[1] + y) * inembed[2] + z) * istride]

output[b * odist + ((x * onembed[1] + y) * onembed[2] + z) * ostride]

Параметры istride и ostride обозначают расстояние между двумя последовательными входными и выходными элементами в наименее значимом (то есть самом внутреннем) измерении соответственно. В одном одномерном преобразовании, если каждый входной элемент должен использоваться в преобразовании, istride должен быть установлен в 1; если любой другой элемент ввода должен использоваться в преобразовании, тогда istride должен быть установлен в 2 . Аналогично, в одном одномерном преобразовании, если требуется компактно выводить конечные элементы один за другим, ostride должен быть установлен в 1; если требуется расстояние между выходными данными наименее значимого измерения, ostride должно быть установлено расстояние между элементами.

Вы можете найти пример работы с расширенными макетами данных в cuFFT в этом вопросе о переполнении стека.

Другие вопросы по тегам