cordicpol2cart

Основанное на CORDIC приближение полярного-к-декартову преобразования

Синтаксис

[x,y] = cordicpol2cart(theta,r)
[x,y] = cordicpol2cart(theta,r,niters)
[x,y] = cordicpol2cart(theta,r,Name,Value)
[x,y] = cordicpol2cart(theta,r,niters,Name,Value)

Описание

[x,y] = cordicpol2cart(theta,r) возвращает Декартовы координаты xy r* e^(j*theta) с помощью приближения алгоритма CORDIC.

[x,y] = cordicpol2cart(theta,r,niters) выполняет итерации niters алгоритма.

[x,y] = cordicpol2cart(theta,r,Name,Value) масштабирует вывод в зависимости от булева значения b.

[x,y] = cordicpol2cart(theta,r,niters,Name,Value) задает и количество итераций и пару Name,Value для того, масштабировать ли вывод.

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

theta

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

r

r содержит входные значения значения и может быть скаляром или иметь те же размерности как theta. r должен быть действителен оцененный.

niters

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

Аргументы в виде пар имя-значение

Дополнительные пары, разделенные запятой аргументов Name,Value, где Name является именем аргумента и Value, являются соответствующим значением. Имя должно находиться внутри одинарных кавычек (' ').

'ScaleOutput'

ScaleOutput является булевым значением, которое задает, масштабировать ли вывод обратным фактором усиления CORDIC. Этот аргумент является дополнительным. Если вы устанавливаете ScaleOutput на true или 1, выходные значения умножаются на константу, которая подвергается дополнительным вычислениям. Если вы устанавливаете ScaleOutput на false или 0, вывод не масштабируется.

Значение по умолчанию: tRUE

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

[x,y]

[x,y] содержит аппроксимированные Декартовы координаты. Когда вход r является плавающей точкой, вывод [x,y] имеет совпадающий тип данных как вход.

Когда вход r является целым числом со знаком или типом данных фиксированной точки, выходные параметры [x,y] являются подписанными объектами fi. Эти объекты fi имеют размеры слова, которые на два бита больше, чем тот из r. Их дробные длины совпадают с дробной длиной r.

Когда вход r является беззнаковым целым или фиксированной точкой, выходные параметры [x,y] являются подписанными объектами fi. Эти объекты fi имеют размеры слова, на три бита больше, чем тот из r. Их дробные длины совпадают с дробной длиной r.

Примеры

Запустите следующий код и оцените точность основанного на CORDIC Полярного-к-декартову преобразования.

wrdLn = 16;
theta = fi(pi/3, 1, wrdLn);
u     = fi( 2.0, 1, wrdLn);

fprintf('\n\nNITERS\tX\t\t ERROR\t LSBs\t\tY\t\t ERROR\t LSBs\n');
fprintf('------\t-------\t ------\t ----\t\t-------\t ------\t ----\n');
for niters = 1:(wrdLn - 1)
 [x_ref, y_ref] = pol2cart(double(theta),double(u));
 [x_fi,  y_fi] = cordicpol2cart(theta, u, niters);
 x_dbl  = double(x_fi);
 y_dbl  = double(y_fi);
 x_err  = abs(x_dbl - x_ref);
 y_err  = abs(y_dbl - y_ref);
 fprintf('%d\t%1.4f\t %1.4f\t %1.1f\t\t%1.4f\t %1.4f\t %1.1f\n',...
   niters,x_dbl,x_err,(x_err * pow2(x_fi.FractionLength)),...
   y_dbl,y_err,(y_err * pow2(y_fi.FractionLength)));
end
fprintf('\n');

NITERS  X        ERROR    LSBs      Y      ERROR   LSBs
------	-------	 ------	 ----		-------	 ------	 ----
   1	   1.4142   0.4142   3392.8  1.4142   0.3178   2603.8
   2	   0.6324   0.3676   3011.2  1.8973   0.1653   1354.2
   3	   1.0737   0.0737   603.8   1.6873   0.0448   366.8
   4	   0.8561   0.1440   1179.2  1.8074   0.0753   617.2
   5	   0.9672   0.0329   269.2   1.7505   0.0185   151.2
   6	   1.0214   0.0213   174.8   1.7195   0.0126   102.8
   7	   0.9944   0.0056   46.2    1.7351   0.0031   25.2
   8	   1.0079   0.0079   64.8    1.7274   0.0046   37.8
   9	   1.0011   0.0011   8.8     1.7313   0.0007   5.8
   10   0.9978   0.0022   18.2    1.7333   0.0012   10.2
   11   0.9994   0.0006   5.2     1.7323   0.0003   2.2
   12   1.0002   0.0002   1.8     1.7318   0.0002   1.8
   13   0.9999   0.0002   1.2     1.7321   0.0000   0.2
   14   0.9996   0.0004   3.2     1.7321   0.0000   0.2
   15   0.9998   0.0003   2.2     1.7321   0.0000   0.2

Больше о

свернуть все

CORDIC

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

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

Алгоритмы

свернуть все

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

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

X представляет действительную часть, Y представляет мнимую часть, и Z представляет тету. Этот алгоритм принимает свои начальные значения для X, Y и Z от входных параметров, r и theta.

Правила Распространения 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.

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

Смотрите также

| |

Введенный в R2011a