cordicsin

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

Синтаксис

y = cordicsin(theta,niters)

Описание

y = cordicsin(theta,niters) вычисляет синус theta с помощью приближения алгоритма CORDIC.

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

theta

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

niters

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

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

y

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

Примеры

свернуть все

Сравните результаты, приведенные различными итерациями алгоритма cordicsin к результатам функции sin с двойной точностью.

% Create 1024 points between [0, 2*pi)
stepSize = pi/512;
thRadDbl = 0:stepSize:(2*pi - stepSize);
thRadFxp = sfi(thRadDbl, 12);		% signed, 12-bit fixed point
sinThRef = sin(double(thRadFxp));	% reference results

% Use 12-bit quantized inputs and vary the number of iterations
% from 2 to 10.
% Compare the fixed-point cordicsin function results to the
% results of the double-precision sin function.

for niters = 2:2:10
    cdcSinTh  = cordicsin(thRadFxp,  niters);
    errCdcRef = sinThRef - double(cdcSinTh); 
end

figure
hold on
axis([0 2*pi -1.25 1.25])
plot(thRadFxp, sinThRef,  'b');
plot(thRadFxp, cdcSinTh,  'g');
plot(thRadFxp, errCdcRef, 'r');
ylabel('sin(\Theta)');
gca.XTick = 0:pi/2:2*pi;
gca.XTickLabel = {'0','pi/2','pi','3*pi/2','2*pi'};
gca.YTick = -1:0.5:1;
gca.YTickLabel = {'-1.0','-0.5','0','0.5','1.0'};
ref_str = 'Reference: sin(double(\Theta))';
cdc_str = sprintf('12-bit CORDIC sine; N = %d', niters);
err_str = sprintf('Error (max = %f)', max(abs(errCdcRef)));
legend(ref_str, cdc_str, err_str);

После 10 итераций алгоритм CORDIC аппроксимировал синус theta к в 0.005492 из результата синуса с двойной точностью.

Больше о

свернуть все

CORDIC

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

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

Алгоритмы

свернуть все

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

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

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

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

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

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

Представленный в R2010a

Для просмотра документации необходимо авторизоваться на сайте