cordicsincos

CORDIC-основанное приближение синуса и косинуса

Синтаксис

[y, x] = cordicsincos(theta,niters)

Описание

[y, x] = cordicsincos(theta,niters) вычисляет синус и косинус theta использование приближения алгоритма CORDIC. y содержит аппроксимированный результат синуса, и x содержит аппроксимированный результат косинуса.

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

theta

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

niters

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

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

y

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

x

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

Примеры

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

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)
  [y, x] = cordicsincos(theta, niters);
  y_FL   = y.FractionLength;
  y_dbl  = double(y);
  x_dbl  = double(x);
  y_err  = abs(y_dbl - sin(double(theta)));
  x_err  = abs(x_dbl - cos(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(y_FL)), x_dbl,x_err, ...
   (x_err * pow2(y_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 - это аббревиатура для COordinate Rotation DIgital Computer. Алгоритм CORDIC, основанный на вращении Givens, является одним из самых аппаратно эффективных алгоритмов, доступных, потому что он требует только итерационных операций shift-add (см. «Ссылки»). Алгоритм CORDIC устраняет необходимость в явных множителях. Используя CORDIC, можно вычислить различные функции, такие как синус, косинус, дуга синус, дуга косинус, дуга тангенс и векторная величина. Можно также использовать этот алгоритм для деления, квадратного корня, гиперболических и логарифмических функций.

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

Подробнее о

Алгоритмы

свернуть все

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

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

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

z0  инициализируется  в θ   входной параметрx0  инициализируется в 1ANy0  инициализируется в 0

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

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

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

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

.
Введенный в R2010a