Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: atan
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
TigerSHARC
Ищу реализацию функции арктангенса для целых чисел(int16). В идеале хочется получить таблицу констант и одну функцию.
V_G
Делал таблично, с точностью 1 градус. 90 ячеек из таблицы Брадиса со значениями тангенса, поиск ближайшего в таблице методом дихотомии (7-8 итераций). Адрес ячейки и есть арктангенс.
Процессоры 51, AVR (не-DSP).
TigerSHARC
Цитата(V_G @ Nov 7 2012, 18:03) *
Делал таблично, с точностью 1 градус. 90 ячеек из таблицы Брадиса со значениями тангенса, поиск ближайшего в таблице методом дихотомии (7-8 итераций). Адрес ячейки и есть арктангенс.
Процессоры 51, AVR (не-DSP).


не поделитесь реализацией? если конечно вы не на асме писали...


(продублировался топик)
V_G
На асме, на асме...
А в чем проблема - алгоритм поска в таблице значений монотонной функции предельно простой.
Становитесь в центр таблицы, если значение из таблицы меньше аргумента арктангенса - прыгаете вверх на четверть длины, нет - вниз. Дальше аналогично - на 1/8 длины и т.д.
fontp
QUOTE (V_G @ Nov 8 2012, 01:52) *
На асме, на асме...
А в чем проблема - алгоритм поска в таблице значений монотонной функции предельно простой.
Становитесь в центр таблицы, если значение из таблицы меньше аргумента арктангенса - прыгаете вверх на четверть длины, нет - вниз. Дальше аналогично - на 1/8 длины и т.д.



Бинарный поиск по обратной таблице. Тоже хороший алгоритм уравновешивания, без деления. На последнем шаге можно ещё повысить точность линейной интерполяцией. Эта процедура сильно напоминает векторное квантование в кодерах. Понятно, что таким способом можно обратить любую функцию двух переменных, монотонно зависящих только от y/х

QUOTE (TigerSHARC @ Nov 7 2012, 22:03) *
не поделитесь реализацией? если конечно вы не на асме писали...


можете посмотреть реализацию на C atng2(int x, int y), между других табличных функций
http://zalil.ru/33938780
TSerg
CORDIC-реализация ( алгоритм Волдера ), как вариант.
TSerg
Для сетки 16р этот вариант избыточен, но тем не менее:

arctg(x) ~ x * P(z);
z = x^2;
x =(0,1);
Lg(err) < 6

P(z) = A0 + A1*z + A2*z^2 + A3*z^3 + A4*z^4 + A5*z^5 + A6*z^6; ( оптимизировать по схеме Горнера )

jumble
Арктангенс от по известной действительной и мнимой части. Возвращает результат от -pi до pi. Вычисления на основе CORDIC алгоритма.
Нажмите для просмотра прикрепленного файла
Необходимо поменять расширенеие с .txt на .с. А то мне почему то не разрешено загружать файлы *.с wacko.gif
fontp
QUOTE (jumble @ Nov 12 2012, 19:31) *
Арктангенс от по известной действительной и мнимой части. Возвращает результат от -pi до pi. Вычисления на основе CORDIC алгоритма.
Нажмите для просмотра прикрепленного файла
Необходимо поменять расширенеие с .txt на .с. А то мне почему то не разрешено загружать файлы *.с wacko.gif



Я сравнил результаты Вашей реализации CORDIC со своею отладочной
http://electronix.ru/forum/index.php?showtopic=107649
Благо там всё есть, чтобы измерить точность, а именно очень хороший генератор случайных чисел. Среднеквадратичная ошибка оказалась у Вас завышена в 1.7 по энергии, стандартное отклонение 0.01 градуса вместо 0.0076 на случайных данных. Потеря точности нашлась сразу - у Вас не округлена таблица арктангенсов, вместо того что есть, должно бы быть
int imath_atan_table [] =
{
0x00002000, 0x000012E4, 0x000009FB, 0x00000511,
0x0000028B, 0x00000146, 0x000000A3, 0x00000051,
0x00000029, 0x00000014, 0x0000000A, 0x00000005,
0x00000003, 0x00000001, 0x00000001, 0x00000000
};

Мелочь, но всё таки, зачем терять точность, если можно не терять и это ничего не стоит.
Максимальная ошибка тоже побольше вблизи точки [0,0], но это понятно, поскольку входные аргументы short, а не int

Ну а вообще так, годится ))
jumble
Да, действительно значения арктангенса не округлял. Спасибо Вам fontp за ценный совет. Учту.
rx9cim
Неплохая апроксимация описана у Лайонса. Вот пример:
float arctg (int I, int Q)
{
/*функция вычисляет арктангенс Q/I*/
volatile float var1, var2, rez;
var1=(float)(I*Q);
var2=(float)(I*I+(float)(0.28125*Q*Q));
rez=(float)(Pi/2)-(float)(var1/var2);
return rez;
}
beaRTS
Цитата(TigerSHARC @ Nov 7 2012, 13:28) *
Ищу реализацию функции арктангенса для целых чисел(int16). В идеале хочется получить таблицу констант и одну функцию.

гляньте здесь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.