ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

自動スケーリングと曲線近似

取り上げる用途とトピック

この例は、路上での車線の自動トラッキングを想定しています。ここでは、車両の前方の車線境界線を表すノイズ データに多項式を近似する方法を示します。

この例では、この曲線近似を使用して、以下に示すトピックについて説明します。

  • 暗黙的な逆行列を使用した任意次数の多項式のノイズ データへの近似

  • 自動スケーリング ツールを使用した浮動小数点モデルから固定小数点モデルへの変換

  • 不変信号を使用した計算の削減と "オフライン" 計算のモデル化

曲線近似を利用する多くの場合、その目的は低次多項式の係数を推定することです。多項式は観測されるノイズ データのモデルとして使用されます。たとえば、2 次多項式を使用する場合は、3 つの係数 (abc) を推定します。

$$ax^2 + bx + c$$

最も近似する多項式が、その多項式とノイズ データの間の 2 乗誤差和を最小にする多項式として定義されます。この最小二乗問題を解くには、過決定線形システムを取得して解きます。明示的な逆行列は、システムを解くのに実際は必要ありません。

この例では、MATLAB® のこれらのポイントを説明してから、Simulink® モデルの説明に進みます。

道路用の信号モデル

アルゴリズムをテストするために、連続した曲線道路のモデル、つまり、加法性ノイズによって歪んだ正弦波を使用します。モデルの正弦波の周波数を変化させることで、アルゴリズムにさまざまな量の応力を加えます。以下のコードは、道路モデルを使用してノイズを含むセンサー出力をシミュレートします。

% Model of roadway
Duration = 2;        % Distance that we look ahead
N = 25;              % Total number of sensors providing estimates of road boundary
Ts = Duration / N;   % Sample interval
FracPeriod = 0.5;    % Fraction of period of sinusoid to match
% y will contain the simulated sensor outputs
y = sin(2*pi* [0:(N-1)]' * (FracPeriod/N)) + sqrt(0.3) * randn(N,1);

行列因数分解を使用して線形システムを解く

この例では、多項式内の各項の係数が不明です。モデルとして使用する多項式は、常に路上の現在の位置を起点とするため、多項式内の定数項はゼロと仮定され、線形項および高次項の係数のみを推定すればよいことになります。行列式 Ax=y を以下のように設定します。

  • y にはセンサー出力が含まれています。

  • x には取得する多項式の係数が含まれています。

  • A は多項式の次数とセンサーの位置に関連した定数行列です。

以下のように AQR 因数分解を使用して方程式を解きます。

$$Ax = QRx=y$$

および

$$x = pinv(A) * y = R^{-1}Q^T*y$$

ここで、pinv() は疑似逆行列を表します。行列 A では、次のコードを使用してこの行列方程式の解を求めます。A を因数分解すると、システムを簡単に解くことができます。

[Q, R] = qr(A);
z = Q' * y;
x = R \ z;
yhat = A * x;
plot(0:N-1,y,'k',0:N-1,yhat,'rs')

ヴァンデルモンド行列 A が次のコードで作成できることも説明しておきます。

Npoly = 3; % Order of polynomial to use in fitting
v = [0:Ts:((N-1)*Ts)]';
A = zeros(length(v), Npoly);
for i = Npoly : -1 : 1
    A(:,i) = v.^i;
end

A は定数であるため、Q および R も同様に定数です。これらの値は事前に計算できます。したがって、新しいセンサー データの取得時に必要な計算は、x=R\(Q'*y) のみです。

多項式の係数を推定した後は、多項式を必要に応じて詳細に再作成できます。再作成は、もともとデータがある箇所だけに限定されません。

Simulink® への移行と固定小数点実装の準備

次に、Simulink 環境でこの問題とその解を再作成します。最終目標は、組み込み環境での配布に適したアルゴリズムのランタイム部分の固定小数点実装です。

この曲線近似を実装するモデルは、概念的に以下の 4 つの部分に分かれています。

  • データ生成 - 曲線近似デバイスに依存しないセンサーに対応するため、浮動小数点で実装できます。

  • オフライン計算 - 不変信号を使用して浮動小数点で実装できます。

  • ランタイム計算 - 固定小数点で実装しなければなりません。

  • データの可視化 - 浮動小数点で実装できます。

サンプル モデルは、前述の MATLAB コードと同じ方法でパラメーター化されています。モデルのパラメーターを表示するには、モデル エクスプローラーのモデル ワークスペースに移動します。[表示]、[モデル エクスプローラー] を選択し、中央のペインから [モデル ワークスペース] を選択し、以下の手順を実行します。

  • 多項式の次数を 1 (Npoly=1) に設定し、ワークスペースを再初期化します。モデルは直線をノイズを含む入力データに近似するようになります。

  • FracPeriod を 0.3 に設定し、データの曲率を小さくします。データの曲率が小さくなったことで、曲線近似の精度が上がります。

固定小数点演算を使用してこのモデルを実装することを目的としているため、必要なコンポーネントが固定小数点をサポートするかどうかをまず確認しなければなりません。DSP System Toolbox™ の QR Factorization ブロックは、現在固定小数点データ型をサポートしていません。それでは、実装は不可能であるかというと、そうではありません。因数分解される行列はランタイム データに依存しません。実際には、多項式の次数、サンプル時間、観測ウィンドウなどにのみ依存します。したがって、A 行列は "オフライン" で因数分解されます。オフライン計算は、不変信号を使用して Simulink でモデル化できます。

関連ソース ブロックのサンプル時間を Inf に設定し、[コンフィギュレーション パラメーター] ダイアログの [インライン パラメーター] 最適化をオンにすると、Simulink 内の信号は不変になります。このモデルでは、サンプル時間の色分け表示がオンになっています ([表示]、[サンプル時間]、[色])。モデルのマゼンタ部分のサンプル時間は無限大です。生成された出力は、モデルのシミュレーション開始前に 1 度計算され、実行時にモデルの他の部分で使用されます。表されるオフライン計算は、実際には浮動小数点で計算できます。この後、生成された出力は実行時にモデルの他の部分で使用できるように固定小数点に変換されます。

モデルを実行すると、連続して実行する場合を除き、前述の MATLAB コードのような出力が生成されます。モデルの出力のスナップショットは以下のようになります。

浮動小数点から固定小数点への変換のワークフロー

それでは、固定小数点データを使用してこのシステムを再実装する手順を説明していきましょう。固定小数点システムが最終的な成果物である場合でも、最初に浮動小数点で実装してから、その関数実装を固定小数点に変換することをお勧めします。この例の残りの部分では、前述のモデルを浮動小数点から固定小数点に変換して、このワークフローを示します。Simulink の固定小数点ツールを使用すると、このワークフローを簡単に実行できます。モデルからこのツールを開くには、[解析] メニューから [固定小数点ツール...] を選択します。使用する主な機能はデータ型のオーバーライドと自動スケーリングです。データ型のオーバーライドは、モデル全体またはサブシステムで浮動小数点演算と固定小数点演算を切り替える場合に便利です。自動スケーリングは、モデルまたはサブシステム内のさまざまな固定小数点量に対して必要なスケーリングを自動的に提案します。スケーリングは、2 進小数点の位置を各量に指定されたワード サイズ内で指定します。

固定小数点モデルによるデータ型オーバーライドの使用

モデルの固定小数点の動作を最適化するには、多くの場合、浮動小数点と固定小数点の間でデータ型を切り替えると便利です。通常、固定小数点の動作は浮動小数点の動作にできる限り一致することが望ましいです。サンプル モデルでデータ型のオーバーライドの効果を確認するには、以下の手順を実行します。

  • 固定小数点ツールを開き、[データ型オーバーライド] が [double] に設定されていることを確認します。これにより、モデルは現在、倍精度浮動小数点データを使用して実行されています。

  • [データ型のオーバーライド][ローカル設定を利用] に設定し、各サブシステムで最初に指定したデータ型を使用します。

  • モデルを実行します。組み込む対象のモデルのランタイム部分に固定小数点データ型が使用されるようになりました。出力結果は、次のプロットに示すように不正確です。また、多数の警告が MATLAB コマンド ウィンドウに表示されます。不正確な結果と警告は、モデルが固定小数点の実行用に正しく設定されていないことが原因で生じます。

最適化固定小数点設定の提案とモデルの自動スケーリング

固定小数点データでモデルを実行すると、モデルが正しくスケーリングされていないことがわかります。それでは、この問題を修正してみましょう。

固定小数点システムの設定は難しい作業です。各固定小数点量に、符号付き/なし、語長、および小数部の長さ (2 進小数点の位置) を設定しなければなりません。多くの場合、語長と符号付き/なしは判明していますが、2 進小数点の位置は設定しなければなりません。DSP System Toolbox では、小数部の長さ量を使用して、2 進小数点の位置を設定します。小数部の長さは 2 進小数点の右側のビット数です。

スケーリングを設定するには、前述の「浮動小数点から固定小数点への変換のワークフロー」の一般的な手順に従います。特に、以下の点に注意してください。

  • 固定小数点ツールで、[データ型オーバーライド] を [double] に、その [固定小数点の計測モード] を [最小値、最大値およびオーバーフロー] にそれぞれ設定します。

  • モデルを実行します。停止時間が [Inf] に設定されたままの場合は、モデルを手動で停止する必要があります。

  • 固定小数点ツールの [小数部の長さを推定] ボタンをクリックします。

  • 固定小数点ツールの中央のペインで、推定された各小数部の長さを許諾または拒否します。承諾する前に、推定された小数部の長さの列のエントリ (ProposedDT) が編集可能であることに注意してください。最初に推定された小数部の長さは、現在のデータでオーバーフローを生成しない可能な最大値であるため、オーバーフローを回避しながら最大の解像度を示します。固定小数点ツールの [安全余裕の割合] パラメーターを使用すると、余分なヘッド ルームを統合することもできます。

  • 選択した小数部の長さをモデルに再適用するには、固定小数点ツールの [選択した小数部の長さを適用] ボタンをクリックします。選択した各小数部の長さは、関連するブロックのダイアログで変更します。選択した小数部の長さをモデルで有効にするには、ブロックの固定小数点の設定を [Same as input (入力と同じ)] または [Inherit via internal rule (内部ルールによる継承)] などの継承モードに設定できません。2 進小数点スケーリングなどの明示的なモードに設定しなければなりません。

  • 自動スケーリングの後は、[データ型のオーバーライド][ローカル設定を利用] に設定し、モデルを再実行します。これで、固定小数点の結果が浮動小数点を使用して観測された結果に類似します。

この情報は役に立ちましたか?