Можно вычислить комплексные уровни децибела с помощью следующей формулы.
Однако это уравнение содержит выражения, такие как логарифмическое вычисление, которые не эффективны, чтобы реализовать на оборудовании. Используя прямую интерполяционную таблицу, можно очень тесно аппроксимировать это выражение способом, которое эффективно на оборудовании.
Чтобы начаться, задайте функцию, чтобы аппроксимировать с интерполяционной таблицей.
f = @(re,im) 20*log10(sqrt(re.^2 + im.^2));
Чтобы задать допуски, которые приемлемы, и желаемые размеры слова, чтобы использовать в интерполяционной таблице, используйте объект FunctionApproximation.Options
. Чтобы сгенерировать прямую интерполяционную таблицу, установите свойство Interpolation
объекта Options
к None
.
options = FunctionApproximation.Options('Interpolation', 'None', 'AbsTol', 0.25, 'RelTol', 0, 'WordLengths', 5:10); % 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 fixdt(0,5,0) = 31. Upper bound for input 1 has been set to the maximum representable value of the type fixdt(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 | 7168 | 1 | [32 32] | [5 5] | 7 | 2.500000e-01, 2.481815e-01 | | 2 | 7168 | 1 | [32 32] | [6 5] | 7 | 2.500000e-01, 2.481815e-01 | | 3 | 7168 | 1 | [32 32] | [5 6] | 7 | 2.500000e-01, 2.481815e-01 | | 4 | 7168 | 1 | [32 32] | [7 5] | 7 | 2.500000e-01, 2.481815e-01 | | 5 | 7168 | 1 | [32 32] | [6 6] | 7 | 2.500000e-01, 2.481815e-01 | | 6 | 7168 | 1 | [32 32] | [5 7] | 7 | 2.500000e-01, 2.481815e-01 | | 7 | 8192 | 1 | [32 32] | [5 5] | 8 | 2.500000e-01, 1.248211e-01 | | 8 | 7168 | 1 | [32 32] | [8 5] | 7 | 2.500000e-01, 2.481815e-01 | | 9 | 7168 | 1 | [32 32] | [7 6] | 7 | 2.500000e-01, 2.481815e-01 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 1 | 7168 | 1 | [32 32] | [5 5] | 7 | 2.500000e-01, 2.481815e-01 | solution = 1x1 FunctionApproximation.LUTSolution with properties: ID: 1 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: {[1x32 double] [1x32 double]} BreakpointDataTypes: [2x1 embedded.numerictype] TableValues: [32x32 double] TableDataType: [1x1 embedded.numerictype] IsEvenSpacing: 1 Interpolation: None
Используйте функцию approximate
, чтобы сгенерировать подсистему Simulink™, содержащую приближение интерполяционной таблицы.
approximate(solution)
Можно использовать сгенерированную подсистему, содержащую интерполяционную таблицу в приложении HDL. Чтобы проверять, что интерполяционная таблица совместима с генерацией HDL-кода с помощью HDL Coder™, используйте функцию checkhdl
.