Можно вычислить комплексные уровни децибела с помощью следующей формулы.
Однако это уравнение содержит выражения, такие как логарифмическое вычисление, которые не эффективны, чтобы реализовать на оборудовании. Используя прямую интерполяционную таблицу, можно очень тесно аппроксимировать это выражение способом, которое эффективно на оборудовании.
Чтобы начаться, задайте функцию, чтобы аппроксимировать интерполяционной таблицей.
f = @(re,im) 20*log10(sqrt(re.^2 + im.^2));
Чтобы задать допуски, которые приемлемы, и желаемые размеры слова, чтобы использовать в интерполяционной таблице, используйте FunctionApproximation.Options
объект. Чтобы сгенерировать прямую интерполяционную таблицу, установите Interpolation
свойство Options
возразите против None
. Используйте ApproximateSolutionType
свойство задать, возвратить ли интерполяционную таблицу как подсистему Simulink™ или как функция MATLAB®.
options = FunctionApproximation.Options('Interpolation', 'None', 'AbsTol', 0.25, 'RelTol', 0, 'WordLengths', 5:10, 'ApproximateSolutionType', 'Simulink'); % Problem setup problem = FunctionApproximation.Problem(f, 'Options', options); problem.InputTypes = [numerictype(0,5,0) numerictype(0,5,0)]; problem.InputLowerBounds = [1 1]; problem.InputUpperBounds = [Inf Inf]; % upper bound will clip to input types range problem.OutputType = numerictype(0,10,4);
solve
функция возвращает оптимальную интерполяционную таблицу как FunctionApproximation.LUTSolution
объект. Когда программное обеспечение оптимизирует параметры интерполяционной таблицы, информации об отображениях MATLAB® о каждой итерации оптимизации, включая общую память, используемую интерполяционной таблицей, размеры слова, используемые для данных в интерполяционной таблице и максимальной разницы в выходе между исходной функцией и приближением интерполяционной таблицы. Лучшее решение задано как интерполяционная таблица с помощью наименьшей памяти, которая соответствует допускам и другим ограничениям, заданным в Options
объект.
solution = solve(problem)
Upper bound for input 2 has been set to the maximum representable value of the type numerictype(0,5,0) = 31. Upper bound for input 1 has been set to the maximum representable value of the type numerictype(0,5,0) = 31. | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 0 | 10240 | 1 | [32 32] | [5 5] | 10 | 2.500000e-01, 3.119254e-02 | | 1 | 9216 | 1 | [32 32] | [5 5] | 9 | 2.500000e-01, 6.228219e-02 | | 2 | 8192 | 1 | [32 32] | [5 5] | 8 | 2.500000e-01, 1.248211e-01 | | 3 | 7168 | 1 | [32 32] | [5 5] | 7 | 2.500000e-01, 2.481815e-01 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 3 | 7168 | 1 | [32 32] | [5 5] | 7 | 2.500000e-01, 2.481815e-01 | solution = 1x1 FunctionApproximation.LUTSolution with properties: ID: 3 Feasible: "true"
Сравните выход исходной функции и приближение интерполяционной таблицы. Левый график показывает выход исходной функции, определяемой в Problem
объект и приближение интерполяционной таблицы. График справа показывает различие между выходом исходной функции и соответствующим выходом от сгенерированного приближения интерполяционной таблицы. Различие между этими двумя выходными параметрами меньше допуска, заданного в Options
объект.
compareData = compare(solution)
compareData = 1x2 struct array with fields: Breakpoints Original Approximate
Доступ к TableData
свойство solution
использовать интерполяционную таблицу в приложении MATLAB®.
tableData = solution.TableData
tableData = struct with fields: BreakpointValues: {1x2 cell} BreakpointDataTypes: [2x1 embedded.numerictype] TableValues: [32x32 double] TableDataType: [1x1 embedded.numerictype] IsEvenSpacing: 1 Interpolation: None
Используйте approximate
функция, чтобы сгенерировать подсистему Simulink™, содержащую приближение интерполяционной таблицы.
approximate(solution)
Можно использовать сгенерированную подсистему, содержащую интерполяционную таблицу в приложении HDL. Чтобы проверять, что интерполяционная таблица совместима с генерацией HDL-кода с помощью HDL Coder™, используйте checkhdl
функция.