Main Content

直接ルックアップ テーブルを使用した複雑な dB の計算

以下の式を使用して複雑なデシベル レベルを計算できます。

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

ただし、この方程式には、ハードウェアに効率良く実装されない対数計算などの式が含まれています。直接ルックアップ テーブルを使用すると、ハードウェア上で効率良くこの式を非常に厳密に近似できます。

最初に、ルックアップ テーブルで近似する関数を定義します。

f = @(re,im) 20*log10(sqrt(re.^2 + im.^2));

受け入れ可能な許容誤差、およびルックアップ テーブルで使用する目的の語長を指定するには、FunctionApproximation.Options オブジェクトを使用します。直接ルックアップ テーブルを生成するには、Options オブジェクトの Interpolation プロパティを 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)
Maximum for input 2 has been set to the maximum representable value of the type numerictype(0,5,0) = 31.

Maximum 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 オブジェクトで定義された元の関数とルックアップ テーブルの近似の出力を示します。右側のプロットは、元の関数の出力と、生成されたルックアップ テーブルの近似の対応する出力間の違いを示します。2 つの出力の違いは、Options オブジェクトで指定された許容誤差より小さくなります。

compareData = compare(solution)
compareData = 

  1x2 struct array with fields:

    Breakpoints
    Original
    Approximate

MATLAB® アプリケーションでルックアップ テーブルを使用するには solutionTableData プロパティにアクセスします。

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 Coder™ を使用してルックアップ テーブルが HDL コード生成と互換するか確認するには、関数 checkhdl を使用します。