cordiccexp

Основанное на CORDIC приближение комплексного экспоненциала

Синтаксис

y = cordiccexp(theta,niters)

Описание

y = cordiccexp(theta,niters) вычисляет cos (theta) + j *sin (theta) с помощью приближения алгоритма CORDIC. y содержит аппроксимированный комплексный результат.

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

theta

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

niters

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

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

y

y является аппроксимированным комплексным результатом функции cordiccexp. Когда вход к функции является плавающей точкой, тип выходных данных совпадает с типом входных данных. Когда вход является фиксированной точкой, вывод имеет тот же размер слова как вход и дробная длина, равная WordLength2.

Примеры

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

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)
  cis    = cordiccexp(theta, niters);
  fl     = cis.FractionLength;
  x      = real(cis);
  y      = imag(cis);
  x_dbl  = double(x);
  x_err  = abs(x_dbl - cos(double(theta)));
  y_dbl  = double(y);
  y_err  = abs(y_dbl - sin(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(fl)), x_dbl, x_err,(x_err * pow2(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

  • RoundingMethodFloor

Вывод присоединил не 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