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

r

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

niters

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

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

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

'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 - это аббревиатура для COordinate Rotation DIgital Computer. Алгоритм CORDIC, основанный на вращении Givens, является одним из самых аппаратно эффективных алгоритмов, доступных, потому что он требует только итерационных операций shift-add (см. «Ссылки»). Алгоритм CORDIC устраняет необходимость в явных множителях. Используя CORDIC, можно вычислить различные функции, такие как синус, косинус, дуга синус, дуга косинус, дуга тангенс и векторная величина. Можно также использовать этот алгоритм для деления, квадратного корня, гиперболических и логарифмических функций.

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

Подробнее о

Алгоритмы

свернуть все

Сигнальные блок-схемы

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

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

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

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

У выхода нет присоединенных fimath.

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

.

См. также

| |

Введенный в R2011a