exponenta event banner

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 - соответствующее значение. 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 является одним из наиболее аппаратных алгоритмов, поскольку требует только итеративных операций добавления сдвига (см. Ссылки). Алгоритм CORDIC устраняет необходимость в явных множителях. С помощью CORDIC можно вычислить различные функции, такие как синус, косинус, синус дуги, косинус дуги, касательная дуги и величина вектора. Этот алгоритм можно также использовать для функций деления, квадратного корня, гиперболических и логарифмических функций.

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

Подробнее

Алгоритмы

свернуть все

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

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

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

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

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

Выход не подключен fimath.

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

.

См. также

| |

Представлен в R2011a