Мне нужны вычисления atan2(x,y)
на ПЛИС с непрерывным потоком данных ввода / вывода. Мне удалось реализовать это с использованием развернутых конвейерных ядер CORDIC, но для получения необходимой точности мне пришлось выполнить 32 итерации. Это привело к тому, что довольно большое количество LUT было посвящено этой единственной задаче. Я попытался изменить поток для использования частично развернутых ядер CORDIC, но затем мне потребовалась умноженная тактовая частота для выполнения повторяющихся циклов, при этом поддерживая непрерывный поток ввода / вывода. С этим я не смог уложиться в сроки.
Так что теперь я обращаюсь к альтернативным способам вычислений atan2(x,y)
.
Я думал об использовании таблиц поиска блочной ОЗУ с интерполяцией, но, поскольку есть две переменные, мне потребуются 2 измерения таблиц поиска, и это очень ресурсоемко с точки зрения использования блочной памяти.
Затем я подумал об использовании того факта, который atan2(x,y)
связан atan(x/y)
с корректировкой квадранта. Проблема заключается в том, что x/y
требуется истинное деление, поскольку y
оно не является постоянным, а деления на ПЛИС очень ресурсоемки.
Существуют ли более новые способы реализации atan2(x,y)
на ПЛИС, которые позволили бы снизить использование LUT, но при этом обеспечить хорошую точность?
источник
atan2
. Не уверен, что вы можете обойтись без разделения, хотя.atan2
. Вам все равно понадобится разделение.Ответы:
Вы можете использовать логарифмы, чтобы избавиться от деления. Для(x,y) в первом квадранте:
Рисунок 1. Участокatan(2z)
Вам потребуется приблизитьatan(2z) в диапазоне −30<z<30 чтобы получить требуемую точность 1E-9. Вы можете воспользоваться симметрией atan(2−z)=π2−atan(2z) или, альтернативно, убедитесь, что(x,y) находится в известном октанте. Для приблизительногоlog2(a) :
Рисунок 2. Участокlog2(c)
Для дальнейшего использования вот неуклюжий скрипт Python, который я использовал для вычисления ошибок аппроксимации:
где - вторая производная от а - локальный максимум абсолютной ошибки. С учетом вышеизложенного мы получаем приближения:f′′(x) f(x) x
Поскольку функции являются вогнутыми и выборки соответствуют функции, ошибка всегда имеет одно направление. Локальная максимальная абсолютная ошибка может быть уменьшена вдвое, если признак ошибки будет чередоваться назад и вперед один раз в каждом интервале выборки. При линейной интерполяции можно достичь близких к оптимальным результатов, предварительно отфильтровав каждую таблицу:
где и являются исходной и отфильтрованной таблицами, охватывающими а весами являются . Конечная обработка (первая и последняя строка в приведенном выше уравнении) уменьшает погрешность на концах таблицы по сравнению с использованием выборок функции за пределами таблицы, поскольку нет необходимости корректировать первую и последнюю выборку, чтобы уменьшить ошибку от интерполяции между ним и образцом прямо за столом. Субтаблицы с разными интервалами выборки должны предварительно фильтроваться отдельно. Значения весов были найдены путем минимизации последовательно для увеличения показателяx y 0≤k≤N c0=98,c1=−116,b0=1516,b1=18,b2=−116 c0,c1 N максимальное абсолютное значение приблизительной погрешности:
для интерполяционных позиций между выборками , с вогнутой или выпуклой функцией (например, ). После того, как эти весовые коэффициенты были решены, значения конечных весовых коэффициентов были найдены путем минимизации аналогичным образом максимального абсолютного значения:0≤a<1 f(x) f(x)=ex b0,b1,b2
для . Использование предварительного фильтра примерно вдвое уменьшает ошибку аппроксимации, и это проще сделать, чем полная оптимизация таблиц.0≤a<1
Рис. 4. Ошибка аппроксимации 11 образцов с предварительным фильтром и без него, а также с конечной обработкой и без нее. Без предварительной обработки префильтр имеет доступ к значениям функции только за пределами таблицы.log2(a)
В этой статье, вероятно, представлен очень похожий алгоритм: Р. Гутьеррес, В. Торрес и Дж. Вальс, « FPGA-реализация atan (Y / X), основанная на логарифмическом преобразовании и методах, основанных на LUT », Journal of Systems Architecture , vol. , 56, 2010. В аннотации говорится, что их реализация превосходит предыдущие алгоритмы на основе CORDIC по скорости и алгоритмы на основе LUT по размеру занимаемой площади.
источник