Вычислите Комплексный дБ Используя Прямую Интерполяционную таблицу

Можно вычислить комплексные уровни децибела с помощью следующей формулы.

$$ dB = 20\times\textup{log}_{10}(\sqrt{\Re^{2}+ \Im^{2}}) $$

Однако это уравнение содержит выражения, такие как логарифмическое вычисление, которые не эффективны, чтобы реализовать на оборудовании. Используя прямую интерполяционную таблицу, можно очень тесно аппроксимировать это выражение способом, которое эффективно на оборудовании.

Чтобы начаться, задайте функцию, чтобы аппроксимировать интерполяционной таблицей.

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 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 функция.