В этом примере показано, как и когда использовать normalizedReciprocal
function и Normalized Returrocal HDL Optimized блок для вычисления нормализованной взаимности входа.
Взаимное значение может иметь большую область значений, а фиксированные точки имеют ограниченную область значений по сравнению с типами с плавающей точкой. Если значение входа u
является маленьким, то 1/u - большим, а если u - большим, то 1/u - маленьким. Поэтому тип с фиксированной точкой для 1/u должен иметь высокую точность и большую область значений, которая требует большого размера слова.
В приложениях, где известен диапазон продукта взаимной и другой переменной, тогда эффективно вычислить нормированную обратную, умножить его на другую переменную и затем применить сдвиг к конечному выходу. Для примера это является случаем в приложениях с наименьшими квадратами, где в обратной подстановке требуется деление на элемент поворота.
Задан вход u
, Normaled Returcal вычисляет нормализованный обратный, y
, и экспонента, e
, таким что
(2.^e).*y = 1./u,
и
0.5 < |y| <= 1.
Если u = 0
и u
является фиксированной точкой или масштабированно-двойной, затем y = 2 - eps(y)
.
Если u = 0
и u
- тип с плавающей точкой, затем y = inf
.
Если u~=0
, эта функция возвращает эквивалент
[y,e] = log2(1./abs(double(u))) y(u<0) = -y(u<0)
кроме того, что он вычисляется с использованием только сдвигов и добавлений.
Для генерации кода C и разработки системы используйте функцию MATLAB normalizedReciprocal
. Эта функция не вычисляется с задержкой. Для симуляции скомпилируйте функцию в файл MEX для скорости, используя fiaccel
, buildInstrumentedMex
, или codegen
.
Чтобы сгенерировать оптимизированный HDL-код, используйте Normalized Reciprocal HDL Optimized
блок. Этот блок оптимизирован для высокой производительности и малой площади в HDL и моделирует с той же задержкой, что и в сгенерированном HDL-коде.
Блок и функция формируют одинаковые числовые выходы.
Вычислите нормированную обратную сторону входа с фиксированной точкой, u
, затем сравните это значение с фактическим значением обратного.
u = fi([-pi,0.01,pi])
u = -3.1416 0.0100 3.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13
[y,e] = normalizedReciprocal(u)
y = -0.6367 0.7806 0.6367 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 14 e = 1x3 int32 row vector -1 7 -1
computed_reciprocal = 2.^double(e).* double(y)
computed_reciprocal = -0.3183 99.9141 0.3183
actual_reciprocal = 1./double(u)
actual_reciprocal = -0.3183 99.9024 0.3183
Вы можете увидеть, что нормализованная обратная и фактическая обратная близки по значению.
Задайте вход с фиксированной точкой, u
, чтобы принять нормированную обратную сторону использования Normalized Returcal HDL Optimized блока.
x = linspace(0.001,100,100); x = [fliplr(-x),x]; u = fi(x,1,18);
Блок Normalized Returrocal HDL Optimized работает путем нормализации входов с помощью двоичного поиска, который имеет задержку приблизительно логарифмическую 2 от размера слова входа, далее следует CORDIC обратное ядро, которое имеет задержку примерно такой же как размер слова входа.
Блок Normalized Returrocal HDL Optimized всегда готов принять данные. После начальной задержки допустимые выборки выводят каждую выборку. Задержка в выборках для входного сигнала с фиксированной точкой u
является
D = ceil(log2(u.WordLength)) + u.WordLength + 5
Можно использовать функцию normalizedReciprocalLatency
, включенный в этот пример, чтобы вычислить задержку для входов с фиксированными точками, двойными точками или одинарными числовыми типами.
Чтобы выровнять входные выборки с выходом Normalized Returrocal HDL Optimized блока, используйте latency D
с задержкой.
D = normalizedReciprocalLatency(u)
D = 28
В качестве простого примера, где известен диапазон продукта взаимной и другой переменной, вычислите нормированную обратную значения и умножите его самостоятельно, поэтому конечный продукт должно есть равный единице. Даже при том, что входное значение и обратное имеют большие области значений, продукт значения и его обратное имеют известную область значений.
Обратите внимание, что продукт u*y
может быть вычислен в том же типе, что и u
потому что 0.5 < abs(y) <= 1
и так продукт не становится больше по величине.
model = 'NormalizedReciprocalModel';
open_system(model)
out = sim(model);
На следующих графиках можно увидеть, что вход u
и взаимной 1/u
имеют большие области значений, но нормализованные обратные y
находится в области значений от -1 до 1.
Вход, u
, является вектором значений fi, которые охватывают область значений от -100 до 100.
normalizedReciprocalPlot(1,u,out.y,out.e,out.z);
Фактическое значение обратного, 1/u
, почти идентичен нормированному обратному, (2.^e).*y
. Ответная 1/u
имеет большую область значений, что означает, что для вычисления прямого обратного сигнала в фиксированной точке потребуется тип данных с высоким динамическим диапазоном (т.е. большой размер слова и большая длина дроби).
normalizedReciprocalPlot(2,u,out.y,out.e,out.z);
Нормализованный обратный, y
, находится в области значений
0.5 < |y| <= 1
и может быть эффективно и точно сохранен в типе данных с тем же размером слова, что и u
. Числовой тип y
имеет длину дроби, равную двум, меньше, чем размер слова u
. Этот дополнительный целочисленный бит гарантирует, что y
может быть положительным или отрицательным, а также может точно представлять значения -1 и + 1.
normalizedReciprocalPlot(3,u,out.y,out.e,out.z);
Нормированная экспонента, e
и величину входа, u
, имеют обратную связь. Когда u
является большим по величине, тогда e
является большим отрицательным значением. Когда u
близко к нулю, тогда e
является большим положительным значением. Отношения
(2.^e).*y = 1./u,
normalizedReciprocalPlot(4,u,out.y,out.e,out.z);
Модель умножает нормированную обратную y
по входу u
а затем масштабирует результат путем сдвига на e
. Начиная с y
имеет величину менее 1, продукт может быть сделано в типе u
с фиксированной точкой. Выход, z = 2 ^ e (y * u), приблизительно равен 1.
normalizedReciprocalPlot(5,u,out.y,out.e,out.z);
Выход, z
, имеет небольшую ошибку округления в результате вычисления нормализованного обратного с типами данных с фиксированной точкой.
normalizedReciprocalPlot(6,u,out.y,out.e,out.z);