exponenta event banner

cordicrotate

Поворот входных данных с использованием аппроксимации на основе CORDIC

Синтаксис

v = cordicrotate(theta,u)
v = cordicrotate(theta,u,niters)
v = cordicrotate(theta,u,Name,Value)
v = cordicrotate(theta,u,niters,Name,Value)

Описание

v = cordicrotate(theta,u) поворачивает вход u около theta с использованием аппроксимации алгоритма CORDIC. Функция возвращает результат u . * e ^ (j *theta).

v = cordicrotate(theta,u,niters) выступает niters итерации алгоритма.

v = cordicrotate(theta,u,Name,Value) масштабирует выходные данные в зависимости от логического значения, b.

v = cordicrotate(theta,u,niters,Name,Value) указывает как количество итераций, так и Name,Value для определения необходимости масштабирования выходных данных.

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

theta

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

u

u может быть скалярным значением со знаком или без знака или иметь те же размеры, что и theta. u может быть вещественным или комплексным.

niters

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

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

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

'ScaleOutput'

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

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

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

v

v содержит аппроксимированный результат алгоритма вращения CORDIC. Когда вход u с плавающей запятой, вывод v имеет тот же тип данных, что и входные данные.

Когда вход u - целое число со знаком или тип данных с фиксированной точкой, вывод v является подписанным fi объект. Это fi объект имеет длину слова, которая на два бита больше длины слова u. Его длина фракции равна длине фракции u.

Когда вход u является целым числом без знака или фиксированной точкой, выход v является подписанным fi объект. Это fi объект имеет длину слова, которая на три бита больше длины слова u. Его длина фракции равна длине фракции u.

Примеры

Выполните следующий код и оцените точность комплексного поворота на основе CORDIC.

wrdLn = 16;
theta = fi(-pi/3, 1, wrdLn);
u     = fi(0.25 - 7.1i, 1, wrdLn);
uTeTh = double(u) .* exp(1i * double(theta));

fprintf('\n\nNITERS\tReal\t ERROR\t LSBs\t\tImag\tERROR\tLSBs\n');
fprintf('------\t-------\t ------\t ----\t\t-------\t------\t----\n');
for niters = 1:(wrdLn - 1)
 v_fi   = cordicrotate(theta, u, niters);
 v_dbl  = double(v_fi);
 x_err  = abs(real(v_dbl) - real(uTeTh));
  y_err  = abs(imag(v_dbl) - imag(uTeTh));
 fprintf('%d\t%1.4f\t %1.4f\t %1.1f\t\t%1.4f\t %1.4f\t %1.1f\n',...
   niters, real(v_dbl),x_err,(x_err * pow2(v_fi.FractionLength)), ...
   imag(v_dbl),y_err, (y_err * pow2(v_fi.FractionLength)));
end
fprintf('\n');

Выходная таблица выглядит следующим образом:

NITERS  Real     ERROR    LSBs    Imag     ERROR    LSBs
------	-------	 ------	 ----		-------	 ------	 ------
1      -4.8438   1.1800   4833.5  -5.1973  1.4306  5859.8
2      -6.6567   0.6329   2592.5  -2.4824  1.2842  5260.2
3      -5.8560   0.1678   687.5   -4.0227  0.2560  1048.8
4      -6.3098   0.2860   1171.5  -3.2649  0.5018  2055.2
5      -6.0935   0.0697   285.5   -3.6528  0.1138  466.2
6      -5.9766   0.0472   193.5   -3.8413  0.0746  305.8
7      -6.0359   0.0121   49.5    -3.7476  0.0191  78.2
8      -6.0061   0.0177   72.5    -3.7947  0.0280  114.8
9      -6.0210   0.0028   11.5    -3.7710  0.0043  17.8
10     -6.0286   0.0048   19.5    -3.7590  0.0076  31.2
11     -6.0247   0.0009   3.5   	 -3.7651  0.0015  6.2
12     -6.0227   0.0011   4.5  	  -3.7683  0.0017  6.8
13     -6.0237   0.0001   0.5   	 -3.7666  0.0001  0.2
14     -6.0242   0.0004   1.5   	 -3.7656  0.0010  4.2
15     -6.0239   0.0001   0.5   	 -3.7661  0.0005  2.2

Подробнее

свернуть все

CORDIC

CORDIC - аббревиатура от COORDinate Rotation DIgital Computer. Алгоритм CORDIC на основе ротации Givens является одним из наиболее аппаратных алгоритмов, поскольку требует только итеративных операций добавления сдвига (см. Ссылки). Алгоритм CORDIC устраняет необходимость в явных множителях. С помощью CORDIC можно вычислить различные функции, такие как синус, косинус, синус дуги, косинус дуги, касательная дуги и величина вектора. Этот алгоритм можно также использовать для функций деления, квадратного корня, гиперболических и логарифмических функций.

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

Подробнее

Алгоритмы

свернуть все

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

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

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

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

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

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

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

.

См. также

|

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