直接ルックアップ テーブルを使用した関数の近似
ルックアップ テーブル オプティマイザーを使用して、Simulink® ブロックまたは関数を近似する直接ルックアップ テーブルを生成できます。直接ルックアップ テーブルは、計算が不要のためハードウェアに効率的に実装できます。
2 次元直接ルックアップ テーブルによる近似の生成
近似を生成する関数を指定する FunctionApproximation.Problem
オブジェクトを作成します。直接ルックアップ テーブルを生成するには、FunctionApproximation.Options
オブジェクトで内挿法を None
に設定します。
problem = FunctionApproximation.Problem('atan2'); problem.InputTypes = [numerictype(0,4,2) numerictype(0,8,4)]; problem.OutputType = fixdt(0,8,7); problem.Options.Interpolation = "None"; problem.Options.AbsTol = 2^-4; problem.Options.RelTol = 0; problem.Options.WordLengths = 1:8;
solve
メソッドを使用して最適なルックアップ テーブルを生成します。
solution = solve(problem)
| ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 0 | 32768 | 1 | [16 256] | [4 8] | 8 | 6.250000e-02, 3.902460e-03 | | 1 | 28672 | 1 | [16 256] | [4 8] | 7 | 6.250000e-02, 7.811287e-03 | | 2 | 24576 | 1 | [16 256] | [4 8] | 6 | 6.250000e-02, 1.561990e-02 | | 3 | 16384 | 1 | [16 128] | [4 7] | 8 | 6.250000e-02, 6.242016e-02 | | 4 | 14336 | 1 | [16 128] | [4 7] | 7 | 6.250000e-02, 5.707978e-02 | | 5 | 12288 | 1 | [16 128] | [4 7] | 6 | 6.250000e-02, 5.870371e-02 | | 6 | 10240 | 0 | [16 128] | [4 7] | 5 | 6.250000e-02, 8.585766e-02 | | 7 | 8192 | 0 | [16 128] | [4 7] | 4 | 6.250000e-02, 1.020576e-01 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 5 | 12288 | 1 | [16 128] | [4 7] | 6 | 6.250000e-02, 5.870371e-02 | solution = 1x1 FunctionApproximation.LUTSolution with properties: ID: 5 Feasible: "true"
compare
メソッドを使用して元の関数と近似の出力を比較します。
compare(solution);
approximate
メソッドを使用して、生成された直接ルックアップ テーブルを含む Simulink™ サブシステムを生成します。
approximate(solution)
直接ルックアップ テーブルによるサブシステムの近似の生成
この例では、直接ルックアップ テーブルで Simulink™ サブシステムを近似する方法を説明します。
近似するサブシステムを含むモデルを開きます。
functionToApproximate = 'ex_direct_approximation/MathExpression'; open_system('ex_direct_approximation');
直接ルックアップ テーブルを生成するには、内挿法を None
に設定します。
problem = FunctionApproximation.Problem(functionToApproximate);
problem.Options.Interpolation = 'None';
problem.Options.RelTol = 0;
problem.Options.AbsTol = 0.2;
problem.Options.WordLengths = [7 8 9 16];
solution = solve(problem);
| ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 0 | 2097152 | 1 | 65536 | 16 | 32 | 2.000000e-01, 0.000000e+00 | | 1 | 896 | 0 | 128 | 7 | 7 | 2.000000e-01, 2.265625e+00 | | 2 | 1024 | 0 | 128 | 7 | 8 | 2.000000e-01, 2.265625e+00 | | 3 | 1152 | 0 | 128 | 7 | 9 | 2.000000e-01, 2.265625e+00 | | 4 | 2048 | 0 | 128 | 7 | 16 | 2.000000e-01, 2.267090e+00 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 0 | 2097152 | 1 | 65536 | 16 | 32 | 2.000000e-01, 0.000000e+00 |
元のサブシステムの動作をルックアップ テーブルの近似と比較します。
compare(solution);
ルックアップ テーブルの近似を含む新しいサブシステムを生成します。
approximate(solution);
元のサブシステムを、ルックアップ テーブルの近似を含む新しいサブシステムで置き換えます。
replaceWithApproximate(solution);
関数 revertToOriginal
を使用してモデルを元の状態に戻すことができます。この関数では元のサブシステムがモデルに戻ります。
revertToOriginal(solution);