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

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

свернуть все

Массив ввода данных, заданный как положительная скалярная величина, вектор, матрица или многомерный массив фиксированной точки или встроенных типов данных. Когда входной массив содержит значения между 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 имя аргумента и 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

  • RoundingMethodпол

Выход присоединил не 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