cordicsqrt

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

Синтаксис

y=cordicsqrt(u)
y=cordicsqrt(u, niters)
y=cordicsqrt(___, 'ScaleOutput', B)

Описание

пример

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')

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

свернуть все

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

Типы данных: 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 должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

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

Типы данных: логический

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

свернуть все

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

Больше о

свернуть все

CORDIC

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

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

Алгоритмы

свернуть все

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

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

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

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

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

Пред - и постнормализация

Для входных значений за пределами области значений [0.5, 2), пред - и процесс постнормализации происходит. Этот процесс выполняет сдвиги разряда на входном массиве прежде, чем передать его ядру CORDIC. Результат затем переключен назад в правильную выходную область значений во время этапа постнормализации. Для получения дополнительной информации на этом процессе видят, что “Ограничения Входного диапазона Алгоритма Преодоления” в Вычисляют Квадратный корень Используя CORDIC.

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

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

Введенный в R2014a

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