Как выполнить 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 в этом вопросе о переполнении стека.