exponenta event banner

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, алгоритм является наиболее точным. Процесс пред- и постнормализации выполняется для входных значений за пределами этого диапазона. Дополнительные сведения об этом процессе см. в разделе Предварительная и последующая нормализация.

Типы данных: 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 является одним из наиболее аппаратных алгоритмов, поскольку требует только итеративных операций добавления сдвига (см. Ссылки). Алгоритм 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] Вольдер, JE. «Метод тригонометрических вычислений CORDIC». Транзакции IRE на электронных компьютерах. т. EC-8, 1959 сентября, с. 330-334.

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

[3] Уолтер, J.S. «Унифицированный алгоритм для элементарных функций». Hewlett-Packard Company, Пало Альто. Весенняя совместная компьютерная конференция, 1971 год, стр. 379-386. (из собрания Музея компьютерной истории). www.computer.org/csdl/proceedings/afips/1971/5077/00/50770379.pdf

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

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

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