cordicsincos

Основанное на CORDIC приближение синуса и косинуса

Синтаксис

[y, x] = cordicsincos(theta,niters)

Описание

[y, x] = cordicsincos(theta,niters) вычисляет синус и косинус theta использование приближения алгоритма CORDIC. y содержит аппроксимированный результат синуса и x содержит аппроксимированный результат косинуса.

Входные параметры

theta

theta может быть скаляр без знака или со знаком, вектор, матрица или N- размерный массив, содержащий угловые значения в радианах. Все значения theta должно быть действительным и в области значений [–2π 2π). Когда theta имеет тип данных с фиксированной точкой, он должен быть подписан.

niters

niters количество итераций, которые выполняет алгоритм CORDIC. Это - дополнительный аргумент. Когда задано, niters должен быть положительный, скаляр с целочисленным знаком. Если вы не задаете niters или если вы задаете значение, которое является слишком большим, алгоритм использует максимальное значение. Для операции фиксированной точки максимальное количество итераций является тем меньше, чем размер слова theta. Для операции с плавающей точкой максимальное значение 52 для двойного или 23 для сингла. Увеличение числа итераций может привести к более точным результатам, но это также увеличивает расход расчета и добавляет задержку.

Выходные аргументы

y

Основанный на CORDIC аппроксимированный синус theta. Когда вход к функции является плавающей точкой, тип выходных данных совпадает с типом входных данных. Когда вход является фиксированной точкой, выход имеет тот же размер слова как вход и дробная длина, равная WordLength– 2 .

x

Основанный на CORDIC аппроксимированный косинус theta. Когда вход к функции является плавающей точкой, тип выходных данных совпадает с типом входных данных. Когда вход является фиксированной точкой, выход имеет тот же размер слова как вход и дробная длина, равная WordLength– 2 .

Примеры

Следующий пример иллюстрирует эффект количества итераций на результате cordicsincos приближение.

wrdLn = 8;
theta = fi(pi/2, 1, wrdLn);
fprintf('\n\nNITERS\t\tY (SIN)\t ERROR\t LSBs\t\tX (COS)\t ERROR\t LSBs\n');
fprintf('------\t\t-------\t ------\t ----\t\t-------\t ------\t ----\n');
for niters = 1:(wrdLn - 1)
  [y, x] = cordicsincos(theta, niters);
  y_FL   = y.FractionLength;
  y_dbl  = double(y);
  x_dbl  = double(x);
  y_err  = abs(y_dbl - sin(double(theta)));
  x_err  = abs(x_dbl - cos(double(theta)));
  fprintf(' %d\t\t%1.4f\t %1.4f\t %1.1f\t\t%1.4f\t %1.4f\t %1.1f\n', ...
   niters, y_dbl,y_err, (y_err * pow2(y_FL)), x_dbl,x_err, ...
   (x_err * pow2(y_FL)));
end
fprintf('\n');

Выходная таблица появляется следующей:

NITERS    Y (SIN)  ERROR   LSBs   X (COS)  ERROR   LSBs
------    -------  ------  ----   -------  ------  ----
1         0.7031   0.2968  19.0   0.7031   0.7105  45.5
2         0.9375   0.0625  4.0    0.3125   0.3198  20.5
3         0.9844   0.0156  1.0    0.0938   0.1011  6.5
4         0.9844   0.0156  1.0   -0.0156   0.0083  0.5
5         1.0000   0.0000  0.0    0.0312   0.0386  2.5
6         1.0000   0.0000  0.0    0.0000   0.0073  0.5
7         1.0000   0.0000  0.0    0.0156   0.0230  1.5

Больше о

свернуть все

CORDIC

CORDIC является акронимом для Координатного Компьютера Вращения. Основанный на вращении алгоритм CORDIC Givens является одним из самых эффективных оборудованием алгоритмов, доступных, потому что это требует только итеративных операций shift-add (см. Ссылки). Алгоритм CORDIC избавляет от необходимости явные множители. Используя CORDIC, можно вычислить различные функции, такие как синус, косинус, арксинус, арккосинус, арктангенс и векторная величина. Можно также использовать этот алгоритм в делении, квадратном корне, гиперболических, и логарифмических функциях.

Увеличение числа итераций CORDIC может привести к более точным результатам, но выполнение так также увеличивает расход расчета и добавляет задержку.

Алгоритмы

свернуть все

Схемы потока сигналов

Ядро вращения CORDIC

X представляет синус, Y представляет косинус, и Z представляет тету. Точность ядра вращения CORDIC зависит от выбора начальных значений для X, Y и Z. Этот алгоритм использует следующие начальные значения:

z0  инициализируется к  θ   значение входного параметраx0  инициализируется к 1ANy0  инициализируется к 0

Правила Распространения fimath

Функции CORDIC отбрасывают любой локальный fimath присоединенный к входу.

Функции CORDIC используют свой собственный внутренний fimath при выполнении вычислений:

  • OverflowActionWrap

  • RoundingMethodпол

Выход присоединил не fimath.

Ссылки

[1] Volder, JE. “Тригонометрический Вычислительный Метод CORDIC”. Транзакции IRE на Электронно-вычислительных машинах. Издание EC-8, сентябрь 1959, стр 330–334.

[2] Andraka, R. “Обзор алгоритма CORDIC для основанных на FPGA компьютеров”. Продолжения 1998 шестых международных симпозиумов ACM/SIGDA по Программируемым пользователем вентильным матрицам. 22-24 февраля 1998, стр 191–200.

[3] Вальтер, J.S. “Объединенный Алгоритм для Элементарных функций”. Hewlett-Packard Company, Пало-Альто. Компьютерная Конференция по Соединению Spring, 1971, стр 379–386. (из набора Компьютерного Исторического музея). www.computer.org/csdl/proceedings/afips/1971/5077/00/50770379.pdf

[4] Schelin, Чарльз В. “Приближение функций калькулятора”. Американская Mathematical Monthly. Издание 90, № 5, май 1983, стр 317–325.

Расширенные возможности

Введен в R2010a

Для просмотра документации необходимо авторизоваться на сайте