Можно вычислить комплексные уровни децибела по следующей формуле.
Однако это уравнение содержит выражения, такие как вычисление журнала, которые неэффективны для реализации на оборудовании. Используя прямую интерполяционную таблицу, можно очень близко аппроксимировать это выражение эффективным на оборудовании способом.
Чтобы начать, задайте функцию для аппроксимации с помощью интерполяционной таблицы.
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);
The 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: {[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
функция.