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