Вычисление комплексного дБ с помощью интерполяционной таблицы

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

$$ dB = 20\times{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);

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