В этом примере показано, как и когда использовать normalizedReciprocal функция и блок оптимизации нормализованного возвратно-поступательного ЛПВП для вычисления нормализованного возвратно-поступательного сигнала входного сигнала.
Обратное значение значения может иметь большой диапазон, а типы с фиксированной точкой имеют ограниченный диапазон по сравнению с типами с плавающей точкой. Если входное значение u мал, то 1/u велик, а если u велик, то 1/u мал. Поэтому тип с фиксированной точкой для 1/u должен иметь высокую точность и большой диапазон, что требует большой длины слова.
В приложениях, где диапазон произведения обратной и другой переменной известен, тогда эффективно вычислить нормализованное обратное, умножить его на другую переменную, а затем применить сдвиг к конечному выходу. Например, это имеет место в приложениях с наименьшими квадратами, где при обратной замене требуется деление на поворотный элемент.
Ввод данных u, Нормализованный взаимный вычисляет нормализованный взаимный, 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 блок. Этот блок оптимизирован для высокой пропускной способности и малой площади в ЛПВП и моделируется с одинаковой задержкой, присутствующей в сгенерированном коде ЛПВП.
Блок и функция производят одинаковые числовые выходы.
Вычислите нормализованную обратную величину ввода с фиксированной точкой, 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, для получения нормализованного возвратно-поступательного использования блока нормализованного возвратно-поступательного HDL Optimized.
x = linspace(0.001,100,100); x = [fliplr(-x),x]; u = fi(x,1,18);
Блок Normalized Feateral HDL Optimized работает, нормализуя вход с помощью двоичного поиска, который имеет задержку приблизительно log2 длины слова входа, за которым следует обратное ядро CORDIC, которое имеет задержку приблизительно такую же, как длина слова входа.
Нормализованный блок оптимизации обратной ЛПВП всегда готов к приему данных. После начальной задержки действительные выборки выводятся на каждую выборку. Задержка в выборках для ввода с фиксированной точкой u является
D = ceil(log2(u.WordLength)) + u.WordLength + 5
Можно использовать функцию normalizedReciprocalLatency, включенной в этот пример, для вычисления задержки для входов с фиксированными точками, двойными или одиночными числовыми типами.
Чтобы выровнять входные выборки с выходом нормализованного блока оптимизации обратного HDL, используйте задержку 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);
