exponenta event banner

cordiccos

Аппроксимация косинуса на основе CORDIC

Синтаксис

y = cordiccos(theta, niters)

Описание

y = cordiccos(theta, niters) вычисляет косинус theta с использованием аппроксимации алгоритма CORDIC.

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

theta

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

niters

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

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

y

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

Примеры

свернуть все

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

% 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
cosThRef = cos(double(thRadFxp));   % reference results

% Use 12-bit quantized inputs and vary the number
% of iterations from 2 to 10.
% Compare the  fixed-point CORDIC results to the
% double-precision trig function results.
for niters = 2:2:10
    cdcCosTh  = cordiccos(thRadFxp,niters);
    errCdcRef = cosThRef - double(cdcCosTh);    
end

figure
hold on
axis([0 2*pi -1.25 1.25]);
    plot(thRadFxp,cosThRef,'b');
    plot(thRadFxp,cdcCosTh,'g');
    plot(thRadFxp,errCdcRef,'r');
    ylabel('cos(\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: cos(double(\Theta))';
    cdc_str = sprintf('12-bit CORDIC cosine; N = %d',niters);
    err_str = sprintf('Error (max = %f)', max(abs(errCdcRef)));
    legend(ref_str,cdc_str,err_str);

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Reference: cos(double(\Theta)), 12-bit CORDIC cosine; N = 10, Error (max = 0.005187).

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

Подробнее

свернуть все

CORDIC

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

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

Подробнее

Алгоритмы

свернуть все

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

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

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

Значение z0  инициализируется с   помощью входного аргумента , значение 0  инициализируется с 1ANy0   инициализируется с помощью значения 0

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

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

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

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

.
Представлен в R2010a