cordicsqrt

CORDIC-основанное приближение квадратного корня

Описание

пример

y=cordicsqrt(u) вычисляет квадратный корень u использование реализации алгоритма CORDIC.

пример

y=cordicsqrt(u, niters) вычисляет квадратный корень u выполнением niters итерации алгоритма CORDIC.

пример

y=cordicsqrt(___, 'ScaleOutput', B) масштабирует выход в зависимости от логического значения B.

Примеры

свернуть все

Найдите квадратный корень fi x объекта использование реализации CORDIC.

x = fi(1.6,1,12);
y = cordicsqrt(x)
y = 
    1.2646

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 12
        FractionLength: 10

Потому что вы не уточнили nitersфункция выполняет максимальное количество итераций, x.WordLength - 1.

Вычислите различие между результатами cordicsqrt функция и двойная точность sqrt функция.

err = abs(sqrt(double(x))-double(y))
err = 1.0821e-04

Вычислите квадратный корень x с тремя итерациями ядра CORDIC.

x = fi(1.6,1,12);
y = cordicsqrt(x,3)
y = 
    1.2646

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 12
        FractionLength: 10

Вычислите различие между результатами cordicsqrt функция и двойная точность sqrt функция.

err = abs(sqrt(double(x))-double(y))
err = 1.0821e-04
x = fi(1.6,1,12);
y = cordicsqrt(x, 'ScaleOutput', 0)
y = 
    1.0479

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 12
        FractionLength: 10

Выход, y, не был масштабирован обратным коэффициентом усиления CORDIC.

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

% Create 500 points between [0, 2)
stepSize = 2/500;
XDbl = 0:stepSize:2;
XFxp = fi(XDbl, 1, 12);    % signed, 12-bit fixed-point
sqrtXRef = sqrt(double(XFxp));   % reference results

% Use 12-bit quantized inputs and set the number
% of iterations to 10.
% Compare the  fixed-point CORDIC results to the
% double-precision sqrt function results.

niters = 10;
cdcSqrtX  = cordicsqrt(XFxp,  niters);
errCdcRef = sqrtXRef - double(cdcSqrtX);
figure
hold on
axis([0 2 -.5 1.5])
plot(XFxp, sqrtXRef,  'b')
plot(XFxp, cdcSqrtX,  'g')
plot(XFxp, errCdcRef, 'r')
ylabel('Sqrt(x)')
gca.XTick = 0:0.25:2;
gca.XTickLabel = {'0','0.25','0.5','0.75','1','1.25','1.5','1.75','2'};
gca.YTick = -.5:.25:1.5;
gca.YTickLabel = {'-0.5','-0.25','0','0.25','0.5','0.75','1','1.25','1.5'};
ref_str = 'Reference: sqrt(double(X))';
cdc_str = sprintf('12-bit CORDIC square root; N = %d', niters);
err_str = sprintf('Error (max = %f)', max(abs(errCdcRef)));
legend(ref_str, cdc_str, err_str, 'Location', 'southeast')

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Reference: sqrt(double(X)), 12-bit CORDIC square root; N = 10, Error (max = 0.002009).

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

свернуть все

Массив входа данных, заданный как положительная скалярная величина, векторный, матричный или многомерный массив типов данных с фиксированной или встроенной точкой. Когда массив входа содержит значения от 0,5 до 2, алгоритм является наиболее точным. Процесс до и после нормализации выполняется на входных значениях за пределами этой области значений. Для получения дополнительной информации об этом процессе смотрите Pre- и Post-Normalization.

Типы данных: fi| single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

Типы данных: fi| single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: y= cordicsqrt(x,'ScaleOutput', 0)

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

Типы данных: logical

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

свернуть все

Выходной массив, возвращенный в виде скаляра, вектора, матрицы или многомерного массива.

Подробнее о

свернуть все

CORDIC

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

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

Алгоритмы

свернуть все

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

Для получения дополнительной информации о процессе до и после нормализации смотрите Pre- и после нормализации.

Гиперболическое ядро CORDIC

X инициализируется в u'+.25, и Y инициализируется в u'-.25, где u' является нормированным входным параметром функции.

С повторными итерациями гиперболического ядра CORDIC X приближается ANu', где AN представляет коэффициент усиления CORDIC. Y подходы 0.

Предварительная и последующая нормализация

Для входных значений за пределами области значений [0,5, 2) происходит процесс до и после нормализации. Этот процесс выполняет bitshifts на массиве входа перед передачей его в ядро CORDIC. Результат затем смещается назад в правильную выходную область значений на этапе после нормализации. Для получения дополнительной информации об этом процессе смотрите «Преодоление ограничений входной области значений алгоритма» в Compute Square Root Using CORDIC.

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

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

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

Ссылки

[1] Volder, JE. Метод тригонометрических вычислений CORDIC. Транзакции IRE на электронных компьютерах. Том EC-8, 1959 сентября, с. 330-334.

[2] Andraka, R. «Опрос алгоритма CORDIC для компьютеров на основе FPGA». Материалы шестого международного симпозиума ACM/SIGDA 1998 года по программируемым массивам ворот на местах. 22-24 февраля 1998, стр 191–200.

[3] Walther, J.S. «A Unified Algorithm for Elementary Functions». Компания Хьюлетт-Паккард, Пало-Альто. Весенняя совместная компьютерная конференция, 1971, с. 379-386. (из собрания Музея компьютерной истории). www.computer.org/csdl/proceedings/afips/1971/5077/00/50770379.pdf

[4] Шелин, Чарльз У. «Калькулятор Приближения функций». Американский математический ежемесячник. Том 90, № 5, май 1983, с. 317-325.

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

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