Main Content

変数ログを使用した固定小数点の数値的問題のデバッグ

この例では、組み込みの変換より優れた変換が必要となる場合に、固定小数点コードをデバッグするためのベスト プラクティスをいくつか示します。

必要条件

  1. ローカルの作業フォルダー (例: c:\kalman_filter) を作成します。

  2. ローカルの作業フォルダーで以下のファイルを作成します。

    •  関数 kalman_filter

    •  関数 kalman_stm

    •  関数 matrix_solve

    •  関数 lu_replacement

    •  関数 forward_substitute

    •  関数 back_substitute

    •  関数 divide_no_zero

    •  テスト ファイル kalman_filter_tb

既定の構成を使用した固定小数点への変換

  1. アプリ ギャラリーから固定小数点コンバーター アプリを開きます。

  2. [選択] ページで kalman_filter.m ファイルを探して [開く] をクリックします。

  3. [次へ] をクリックします。[入力の型を定義] ページで kalman_filter_tb ファイルを参照します。[入力の型の自動定義] をクリックします。

    テストファイルが実行され、ノイズを含む入力信号、フィルター処理された信号、理想的なフィルターで処理された信号、およびフィルター処理された信号と理想的なフィルターで処理された信号の間の差がプロットされます。

  4. [次へ] をクリックします。[固定小数点に変換] ページで [解析] をクリックし、既定の設定を使用して範囲情報の収集およびデータ型の推奨を行います。

  5. [変換] をクリックし、推奨されたデータ型を適用します。

  6. [テスト] 矢印をクリックし、[比較プロット用の入力と出力を記録] チェック ボックスをオンにします。[テスト] をクリックします。固定小数点コンバーターはテスト ファイル kalman_filter_tb.m を実行し、生成された固定小数点のコードをテストします。浮動小数点と固定小数点のシミュレーションが実行され、入力変数と出力変数の誤差が計算されます。

    生成されたプロットによって、現在の固定小数点の実装では良好な結果が得られないことが示されます。

    出力変数 y の誤差は非常に大きく、282% を超えています。

数値的問題の発生元の特定

数値的問題の原因として考えられる任意の関数の入力変数と出力変数を、最上位関数の出力引数に記録します。

  1. [ソース コード] ペインで kalman_filter をクリックし、浮動小数点コードに戻ります。

    [テスト] フェーズ中に [比較プロット用の入力と出力を記録] オプションを選択すると、最上位関数 kalman_filter の入力変数と出力変数がプロット用に自動的に記録されます。

  2. 関数 kalman_filter は関数 matrix_solve を呼び出します。この関数には他の複数の関数への呼び出しが含まれます。数値的問題の発生元が関数 matrix_solve であるかどうかを調査するには、[ソース コード] ペインで kalman_filtermatrix_solve を選択します。

    [ログ データ] 列で、記録する関数の入力変数と出力変数を選択します。この例では、ab、および x の 3 つをすべて選択します。

  3. [テスト] をクリックします。

    生成されたプロットによって関数 matrix_solve の出力変数の大きな誤差が示されます。

fimath 設定の調整

  1. [固定小数点に変換] ページで [設定] をクリックします。

    [fimath][丸め方法][最も近い正の整数方向] に設定します。[オーバーフロー アクション][飽和] に設定します。

  2. [変換] をクリックして新しい設定を適用します。

  3. [テスト] の隣の矢印をクリックし、[比較プロット用の入力と出力を記録] が選択されていることを確認します。関数の入力変数または出力変数のログを有効にします。[テスト] をクリックします。

    最上位関数の出力変数 y のプロットを確認します。

    新しい fimath の設定によって出力は向上しましたが、まだ多少の誤差が残っています。

語長設定の調整

既定の語長を調整することによって、生成される固定小数点設計の精度が向上します。

  1. [設定] をクリックして既定の語長を 32 に変更します。[変換] をクリックして新しい設定を適用します。

  2. [テスト] をクリックします。出力変数 y の誤差が累計されます。

  3. 固定小数点コンバーターおよびプロット ウィンドウを閉じます。

定数関数の置換

関数 kalman_stm が状態遷移マトリックスを計算すると、結果は定数になります。この関数を固定小数点に変換する必要はありません。計算による不必要な量子化を避けるために、この関数を倍精度の定数で置き換えます。関数を定数に置き換えることにより、状態遷移マトリックスが量子化されるのは 1 回のみになります。

  1. [ソース コード] ペインで関数 kalman_filter をクリックします。関数 kalman_filter を編集します。関数 kalman_stm の呼び出しを等価な double の定数で置き換えます。

    A = [0.992114701314478, -0.125333233564304;
        0.125333233564304, 0.992114701314478];
    変更内容を保存します。

  2. [解析] をクリックして推奨を更新します。

  3. [変換] をクリックして新しい推奨を適用します。

  4. [テスト] をクリックします。関数の出力 y のプロットの誤差は 10-6 の次数になり、この設計で許容できます。