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

dsp.LMSFilter

LMS 適応フィルターの出力、誤差および重みの計算

説明

dsp.LMSFilter System object™ は、次のいずれかのアルゴリズムを使用して、入力信号を目的の信号に収束させる適応有限インパルス応答 (FIR) フィルターを実装します。

  • LMS

  • 正規化 LMS

  • 符号-データ LMS

  • 符号-誤差 LMS

  • 符号-符号 LMS

これらの各方法の詳細については、アルゴリズム を参照してください。

フィルターは、一次入力信号と目的の信号間での誤差が最小になるまで、その重みを調整します。この誤差の平均二乗 (MSE) は関数 msesim を使用して計算されます。MSE の予測バージョンは関数 msepred でウィーナー フィルターを使用して決定されます。関数 maxstep は、収束速度を制御する最大適応ステップ サイズを計算します。

適応 FIR フィルターを使用して信号をフィルター処理するには、次のようにします。

  1. dsp.LMSFilter オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とは (MATLAB)を参照してください。

作成

構文

lms = dsp.LMSFilter
lms = dsp.LMSFilter(L)
lms = dsp.LMSFilter(Name,Value)

説明

lms = dsp.LMSFilter は、最小平均二乗 (LMS) アルゴリズムを使用して指定の入力と目的の信号に対するフィルター済み出力、フィルター誤差およびフィルターの重みを計算する、LMS フィルター オブジェクト lms を返します。

lms = dsp.LMSFilter(L) は、Length プロパティが L に設定された LMS フィルター オブジェクトを返します。

lms = dsp.LMSFilter(Name,Value) は、指定した各プロパティが指定の値に設定された LMS フィルター オブジェクトを返します。各プロパティを、一重引用符で囲みます。前の入力引数でもこの構文を使用できます。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計 (MATLAB)を参照してください。

フィルターの重みを計算するメソッド。次のいずれかとして指定します。

  • 'LMS'

  • 'Normalized LMS'

  • 'Sign-Data LMS'

  • 'Sign-Error LMS'

  • 'Sign-Sign LMS'

アルゴリズムの詳細については、アルゴリズム を参照してください。

FIR フィルターの重みベクトルの長さ。正の整数として指定します。

例: 64

例: 16

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

適応ステップ サイズを指定するメソッド。次のいずれかとして指定します。

  • 'Property' –– StepSize プロパティは各適応ステップのサイズを指定します。

  • 'Input port' –– 適応ステップ サイズをオブジェクトへのいずれかの入力として指定します。

適応ステップ サイズ係数。非負のスカラーとして指定します。正規化された LMS メソッドの収束には、ステップ サイズが 0 より大きく 2 より小さい値でなければなりません。

小さいステップ サイズでは、出力 y と目的の信号d 間の定常偏差が小さくなります。ステップ サイズが小さいと、フィルターの収束速度が減少します。収束速度を向上させるには、ステップ サイズを増やします。大きいステップ サイズではフィルターが不安定になる場合があります。不安定にならずにフィルターが受け入れ可能な最大ステップ サイズを計算するには、関数 maxstep を使用します。

調整可能: Yes

依存関係

このプロパティは StepSizeSource'Property' に設定した場合に適用されます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

漏洩 LMS 法の実装時に使用される漏れ係数。範囲 [0 1] 内のスカラーとして指定します。値が 1 と等しい場合、適応されるメソッドに漏れはありません。値が 1 より小さい場合、フィルターは漏洩 LMS 法を実装します。

例: 0.5

調整可能: Yes

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

フィルターの重みの初期条件。スカラーまたは長さが Length プロパティの値に等しいベクトルとして指定します。この入力が実数の場合、このプロパティの値は実数でなければなりません。

例: 0

例: [1 3 1 2 7 8 9 0 2 2 8 2]

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
複素数のサポート: あり

フィルターの重みの調整フラグ。次のいずれかとして指定します。

  • false –– オブジェクトは継続的にフィルターの重みを更新します。

  • true –– そのアルゴリズムを呼び出すときに、適応制御入力がオブジェクトに与えられます。この入力の値が非ゼロの場合、オブジェクトは継続的にフィルターの重みを更新します。この入力の値がゼロの場合、フィルターの重みは現在の値で保持されます。

フィルターの重みのリセット フラグ。次のいずれかとして指定します。

  • false –– オブジェクトは重みをリセットしません。

  • true –– そのアルゴリズムを呼び出すときに、リセット制御入力がオブジェクトに与えられます。この設定によって WeightsResetCondition プロパティが有効になります。オブジェクトは、WeightsResetCondition プロパティとオブジェクト アルゴリズムに与えられたリセット入力の値に基づいてフィルターの重みをリセットします。

フィルターの重みのリセットをトリガーするイベント。次のいずれかとして指定します。リセット入力でリセット イベントが検出されるたびに、オブジェクトはフィルターの重みをリセットします。

  • 'Non-zero' — リセット入力がゼロではない場合に各サンプルでリセット操作をトリガーします。

  • 'Rising edge' — リセット入力が次のいずれかを行うときにリセット操作をトリガーします。

    • 負の値から正の値またはゼロに立ち上がる。

    • ゼロから正の値へ立ち上がる。この場合、立ち上がりは負の値からゼロへの立ち上がりと連続していません。

  • 'Falling edge' — リセット入力が次のいずれかを行うときにリセット操作をトリガーします。

    • 正の値から負の値またはゼロに立ち下がる。

    • ゼロから負の値に立ち下がる。この場合、立ち下がりは正の値からゼロへの立ち下りと連続していません。

  • 'Either edge' — リセット入力が立ち上がりエッジまたは立ち下がりエッジの場合にリセット操作をトリガーします。

オブジェクトは、このプロパティとオブジェクト アルゴリズムに与えられたリセット入力 r の値に基づいてフィルターの重みをリセットします。

依存関係

このプロパティは、WeightsResetInputPortプロパティを true に設定した場合に適用されます。

適応させたフィルターの重みを出力するメソッド。次のいずれかとして指定します。

  • 'Last' (既定) — オブジェクトはデータ フレームの最後のサンプルに対応する重みの列ベクトルを返します。重みベクトルの長さは Length プロパティで指定された値になります。

  • 'All' — オブジェクトは FrameLength 行 Length 列の重みの行列を返します。行列は、入力値の FrameLength サンプルすべての重みの履歴について、サンプルごとに完全に対応します。行列の各行は、対応する入力サンプルについて計算された一連の LMS フィルターの重みに対応します。

  • 'None' — この設定にすると、重みの出力が無効になります。

固定小数点プロパティ

固定小数点演算の丸めモードを指定します。詳細については、丸めモードを参照してください。

固定小数点演算のオーバーフロー アクション。次のいずれかを指定します。

  • 'Wrap' –– オブジェクトはその固定小数点演算の結果をラップします。

  • 'Saturate' –– オブジェクトはその固定小数点演算の結果を飽和します。

オーバーフロー アクションの詳細については、固定小数点演算のオーバーフロー モードを参照してください。

ステップ サイズの語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same word length as first input' –– オブジェクトはステップ サイズの語長を最初の入力と同じになるように指定します。小数部の長さは、可能な最高の精度になるように計算されます。

  • 'Custom' –– ステップ サイズのデータ型は、CustomStepSizeDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用するステップ サイズのデータ型の詳細については、固定小数点 のセクションを参照してください。

ステップ サイズの語長と小数部の長さ。語長が 16 で小数部の長さが 15 の自動符号付きの数値型として指定します。

例: numerictype([],32)

依存関係

このプロパティは、次の条件において適用されます。

  • StepSizeSource プロパティが 'Property' に、StepSizeDataType'Custom' に設定されている。

  • StepSizeSource プロパティが 'Input port' に設定されている。

漏れ係数の語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same word length as first input' –– オブジェクトは漏れ係数の語長を最初の入力と同じになるように指定します。小数部の長さは、可能な最高の精度になるように計算されます。

  • 'Custom' –– 漏れ係数のデータ型は、CustomLeakageFactorDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用する漏れ係数のデータ型の詳細については、固定小数点 のセクションを参照してください。

漏れ係数の語長と小数部の長さ。語長が 16 で小数部の長さが 15 の自動符号付きの数値型として指定します。

例: numerictype([],32)

依存関係

このプロパティは、LeakageFactorDataType プロパティを 'Custom' に設定した場合に適用されます。

重みの語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same as first input' –– オブジェクトはフィルターの重みのデータ型を最初の入力と同じになるように指定します。

  • 'Custom' –– フィルターの重みのデータ型は、CustomWeightsDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用するフィルターの重みのデータ型の詳細については、固定小数点 のセクションを参照してください。

フィルターの重みの語長と小数部の長さ。語長が 16 で小数部の長さが 15 の自動符号付きの数値型として指定します。

例: numerictype([],32,20)

依存関係

このプロパティは、WeightsDataType プロパティを 'Custom' に設定した場合に適用されます。

エネルギー積の語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same as first input' –– オブジェクトはエネルギー積のデータ型を最初の入力と同じになるように指定します。

  • 'Custom' –– エネルギー積のデータ型は、CustomEnergyProductDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用するエネルギー積のデータ型の詳細については、固定小数点 のセクションを参照してください。

依存関係

このプロパティは、Method プロパティを 'Normalized LMS' に設定した場合に適用されます。

エネルギー積の語長と小数部の長さ。語長が 32 で小数部の長さが 20 の自動符号付きの数値型として指定します。

依存関係

このプロパティは、Method プロパティを 'Normalized LMS' に、EnergyProductDataType プロパティを 'Custom' に設定した場合に適用されます。

エネルギー アキュムレータの語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same as first input' –– オブジェクトはエネルギー アキュムレータのデータ型を最初の入力と同じになるように指定します。

  • 'Custom' –– エネルギー アキュムレータのデータ型は、CustomEnergyAccumulatorDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用するエネルギー アキュムレータのデータ型の詳細については、固定小数点 のセクションを参照してください。

依存関係

このプロパティは、Method プロパティを 'Normalized LMS' に設定した場合に適用されます。

エネルギー アキュムレータの語長と小数部の長さ。語長が 32 で小数部の長さが 20 の自動符号付きの数値型として指定します。

依存関係

このプロパティは、Method プロパティを 'Normalized LMS' に、EnergyAccumulatorDataType プロパティを 'Custom' に設定した場合に適用されます。

畳み込み積の語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same as first input' –– オブジェクトは畳み込み積のデータ型を最初の入力と同じになるように指定します。

  • 'Custom' –– 畳み込み積のデータ型は、CustomConvolutionProductDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用する畳み込み積のデータ型の詳細については、固定小数点 のセクションを参照してください。

畳み込み積の語長と小数部の長さ。語長が 32 で小数部の長さが 20 の自動符号付きの数値型として指定します。

依存関係

このプロパティは、ConvolutionProductDataType プロパティを 'Custom' に設定した場合に適用されます。

畳み込みアキュムレータの語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same as first input' –– オブジェクトは畳み込みアキュムレータのデータ型を最初の入力と同じになるように指定します。

  • 'Custom' –– 畳み込みアキュムレータのデータ型は、CustomConvolutionAccumulatorDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用する畳み込みアキュムレータのデータ型の詳細については、固定小数点 のセクションを参照してください。

畳み込みアキュムレータの語長と小数部の長さ。語長が 32 で小数部の長さが 20 の自動符号付きの数値型として指定します。

依存関係

このプロパティは、ConvolutionAccumulatorDataType プロパティを 'Custom' に設定した場合に適用されます。

ステップ サイズの誤差の積の語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same as first input' –– オブジェクトはステップ サイズの誤差の積のデータ型を最初の入力と同じになるように指定します。

  • 'Custom' –– ステップ サイズの誤差の積のデータ型は、CustomStepSizeErrorProductDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用するステップ サイズの誤差の積のデータ型の詳細については、固定小数点 のセクションを参照してください。

ステップ サイズの誤差の積の語長と小数部の長さ。語長が 32 で小数部の長さが 20 の自動符号付きの数値型として指定します。

依存関係

このプロパティは、StepSizeErrorProductDataType プロパティを 'Custom' に設定した場合に適用されます。

フィルターの重み更新の積の語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same as first input' –– オブジェクトはフィルターの重み更新の積のデータ型を最初の入力と同じになるように指定します。

  • 'Custom' –– フィルターの重み更新の積のデータ型は、CustomWeightsUpdateProductDataType プロパティを使ってカスタムの数値型として指定されます。

このオブジェクトが使用するフィルターの重み更新の積のデータ型の詳細については、固定小数点 のセクションを参照してください。

フィルターの重み更新の積の語長と小数部の長さ。語長が 32 で小数部の長さが 20 の自動符号付きの数値型として指定します。

依存関係

このプロパティは、WeightsUpdateProductDataType プロパティを 'Custom' に設定した場合に適用されます。

商の語長と小数部の長さの設定。次のいずれかとして指定します。

  • 'Same as first input' –– オブジェクトは商のデータ型を最初の入力のデータ型と同じになるように指定します。

  • 'Custom' –– 商のデータ型は、CustomQuotientDataType プロパティを使ってカスタムの数値型として指定します。

このオブジェクトが使用する商のデータ型の詳細については、固定小数点 のセクションを参照してください。

依存関係

このプロパティは、Method プロパティを 'Normalized LMS' に設定した場合に適用されます。

フィルターの重み更新の積の語長と小数部の長さ。語長が 32 で小数部の長さが 20 の自動符号付きの数値型として指定します。

依存関係

このプロパティは、Method プロパティを 'Normalized LMS' に、QuotientDataType プロパティを 'Custom' に設定した場合に適用されます。

使用法

R2016b より前のバージョンでは、関数 step を使用して System object アルゴリズムを実行します。step に対する引数は作成したオブジェクトであり、この節で示す引数が次に続きます。

たとえば、y = step(obj,x)y = obj(x) は同等の演算を実行します。

構文

[y,err,wts] = lms(x,d)
[y,err] = lms(x,d)
[___] = lms(x,d,mu)
[___] = lms(x,d,a)
[___] = lms(x,d,r)
[y,err,wts] = lms(x,d,mu,a,r)

説明

[y,err,wts] = lms(x,d) は、目的の信号として d を使用して入力信号 x をフィルター処理し、フィルター処理された出力を y に、フィルター誤差を err に、推定されたフィルターの重みを wts に返します。LMS フィルター オブジェクトは、出力信号と目的の信号間での誤差を最小化するために必要なフィルターの重みを推定します。

[y,err] = lms(x,d) は、WeightsOutput プロパティが 'None' に設定されると、目的の信号として d を使用して入力信号 x をフィルター処理し、フィルター処理された出力を y に、フィルター誤差を err に返します。

[___] = lms(x,d,mu) は、StepSizeSource プロパティが 'Input port' に設定されると、目的の信号として d、ステップ サイズとして mu を使用して入力信号 x をフィルター処理します。これらの入力は、前のいずれの出力セットでも使用できます。

[___] = lms(x,d,a) は、AdaptInputPort プロパティが true に設定されると、目的の信号として d、適応制御として a を使用して入力信号 x をフィルター処理します。a が非ゼロの場合、System object は継続的にフィルターの重みを更新します。a がゼロの場合、フィルターの重みは一定になります。

[___] = lms(x,d,r) は、WeightsResetInputPort プロパティが true に設定されると、目的の信号として d、リセット信号として r を使用して入力信号 x をフィルター処理します。WeightsResetCondition プロパティはリセットのトリガー条件の設定に使用できます。リセット イベントが発生すると、System object は、フィルターの重みをその初期値にリセットします。

[y,err,wts] = lms(x,d,mu,a,r) は、目的の信号として d、ステップ サイズとして mu、適応制御として a、リセット信号として r を使用して入力信号 x をフィルター処理し、フィルター処理された出力を y に、フィルター誤差を err に、適応させたフィルターの重みを wts に返します。

入力引数

すべて展開する

LMS フィルターでフィルター処理される信号。入力 x と目的の信号 d はサイズ、データ型、実数/複素数が同じでなければなりません。入力が固定小数点の場合、データ型は符号付きでなければならず、目的の信号と同じ語長をもたなければなりません。

入力 x は可変サイズ信号にすることができます。オブジェクトがロックされていても、列ベクトルの要素数を変更できます。System object はオブジェクトを呼び出してそのアルゴリズムを実行するときにロックします。

データ型: single | double | int8 | int16 | int32 | int64 | fi
複素数のサポート: あり

LMS フィルターはそのフィルターの重み wts を調整して誤差 err を最小化し、入力信号 x を目的の信号 d に可能な限り近づけて収束させます。

入力 x と目的の信号 d はサイズ、データ型、実数/複素数が同じでなければなりません。目的の信号が固定小数点の場合、データ型は符号付きでなければならず、データ入力と同じ語長をもたなければなりません。

入力 d は可変サイズ信号にすることができます。オブジェクトがロックされていても、列ベクトルの要素数を変更できます。System object はオブジェクトを呼び出してそのアルゴリズムを実行するときにロックします。

データ型: single | double | int8 | int16 | int32 | int64 | fi
複素数のサポート: あり

適応ステップ サイズ係数。非負の数値スカラーとして指定します。正規化された LMS メソッドの収束には、ステップ サイズが 0 より大きく 2 より小さい値でなければなりません。ステップ サイズ入力のデータ型は xd のデータ型と一致しなければなりません。データ型が固定小数点の場合、データ型は符号付きでなければなりません。

小さいステップ サイズでは、出力 y と目的の信号 d 間の定常偏差が小さくなります。ステップ サイズが小さいと、フィルターの収束速度が減少します。収束速度を向上させるには、ステップ サイズを増やします。大きいステップ サイズではフィルターが不安定になる場合があります。不安定にならずにフィルターが受け入れ可能な最大ステップ サイズを計算するには、関数 maxstep を使用します。

依存関係

この入力は StepSizeSource プロパティが 'Input port' に設定されている場合に必要です。

データ型: single | double | int8 | int16 | int32 | int64 | fi

フィルターの重みの更新方法を制御する適応制御入力。この入力の値が非ゼロの場合、オブジェクトは継続的にフィルターの重みを更新します。この入力の値がゼロの場合、フィルターの重みは現在の値で保持されます。

依存関係

この入力は AdaptInputPort プロパティが true に設定されている場合に必要です。

データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

WeightsResetCondition プロパティの値に基づいてフィルターの重みをリセットするリセット信号。

依存関係

この入力は WeightsResetInputPort プロパティが true に設定されている場合に必要です。

データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

出力引数

すべて展開する

フィルター処理された出力。スカラーまたは列ベクトルとして返されます。オブジェクトはそのフィルターの重みを調整して入力信号 x が目的の信号 d に一致するように収束させます。フィルターは収束した信号を出力します。

データ型: single | double | int8 | int16 | int32 | int64 | fi
複素数のサポート: あり

出力信号 y と目的の信号 d の差異。スカラーまたは列ベクトルとして返されます。err のデータ型は y のデータ型と一致します。適応フィルターの目的は、この誤差を最小化することです。オブジェクトはその重みを調整して収束させ、目的の信号とよく一致する出力信号を生成する最適なフィルターの重みになるようにします。err が計算される方法の詳細については、アルゴリズムを参照してください。

データ型: single | double | int8 | int16 | int32 | int64 | fi

適応フィルターの重み。スカラーまたは Length の値で指定された長さの列ベクトルとして返されます。

データ型: single | double | int8 | int16 | int32 | int64 | fi

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

maxstepMaximum step size for LMS adaptive filter convergence
msepredPredicted mean squared error for LMS adaptive filter
msesimEstimated mean squared error for adaptive filters
stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて展開する

平均二乗誤差 (MSE) は、目的の信号と適応フィルターへの一次入力信号との間の誤差の二乗平均を測定します。この誤差が減少すると、一次入力が目的の信号に収束します。関数 msepred と関数 msesim を使用した各時点での MSE の予測値と MSE のシミュレーション値を決定します。最小 MSE と定常状態 MSE 値に関してこれらの MSE 値を互いに比較します。また、係数の共分散行列のトレースで与えられる係数誤差の二乗の和を計算します。

メモ: R2016a 以前のリリースを使用している場合、それぞれのオブジェクトの呼び出しを等価な step 構文で置き換えてください。たとえば、obj(x)step(obj,x) になります。

初期化

未知のシステムを表す dsp.FIRFilter System object™ を作成します。信号 x を FIR フィルターに渡します。未知のシステムの出力は、未知のシステム (FIR フィルター) の出力の和である目的の信号 d と、加法性ノイズ信号 n です。

num = fir1(31,0.5);
fir = dsp.FIRFilter('Numerator',num);  
iir = dsp.IIRFilter('Numerator',sqrt(0.75),...
        'Denominator',[1 -0.5]);
x = iir(sign(randn(2000,25))); 
n = 0.1*randn(size(x));           
d = fir(x) + n; 

LMS フィルター

目的の信号の出力に適応するフィルターを作成する dsp.LMSFilter System object を作成します。適応フィルターの長さを 32 タップ、ステップ サイズを 0.008、解析とシミュレーションの間引き係数を 5 に設定します。変数 simmse は、未知のシステム d の出力と適応フィルターの出力との間でシミュレーションされた MSE を表します。変数 mse は対応する予測された値を与えます。

l = 32;
mu = 0.008;
m  = 5;

lms = dsp.LMSFilter('Length',l,'StepSize',mu);
[mmse,emse,meanW,mse,traceK] = msepred(lms,x,d,m);
[simmse,meanWsim,Wsim,traceKsim] = msesim(lms,x,d,m);

MSE 結果のプロット

シミュレーション MSE 値、予測 MSE 値、最小 MSE 値、最終 MSE 値を比較します。最終 MSE 値は最小 MSE と超過 MSE の和で与えられます。

nn = m:m:size(x,1);
semilogy(nn,simmse,[0 size(x,1)],[(emse+mmse)...
(emse+mmse)],nn,mse,[0 size(x,1)],[mmse mmse])
title('Mean Squared Error Performance')
axis([0 size(x,1) 0.001 10])
legend('MSE (Sim.)','Final MSE','MSE','Min. MSE')
xlabel('Time Index')
ylabel('Squared Error Value')

予測 MSE はシミュレーション MSE と同じ軌跡に従います。両方の軌跡は定常状態 (最終) MSE で収束します。

係数軌跡のプロット

meanWsimmsesim によって与えられたシミュレーション係数の平均値です。meanWmsepred によって与えられた予測係数の平均値です。

LMS フィルター係数 12、13、14、15 のシミュレーション平均値と予測平均値を比較します。

plot(nn,meanWsim(:,12),'b',nn,meanW(:,12),'r',nn,...
meanWsim(:,13:15),'b',nn,meanW(:,13:15),'r')
PlotTitle ={'Average Coefficient Trajectories for';...
            'W(12), W(13), W(14), and W(15)'}
PlotTitle = 2x1 cell array
    {'Average Coefficient Trajectories for'}
    {'W(12), W(13), W(14), and W(15)'      }

title(PlotTitle)
legend('Simulation','Theory')
xlabel('Time Index')
ylabel('Coefficient Value')

定常状態では、両方の軌跡が収束します。

二乗係数誤差の合計

msepredmsesim で与えられた二乗係数誤差の合計を比較します。これらの値は係数の共分散行列のトレースで与えられます。

semilogy(nn,traceKsim,nn,traceK,'r')
title('Sum-of-Squared Coefficient Errors')
axis([0 size(x,1) 0.0001 1])
legend('Simulation','Theory')
xlabel('Time Index')
ylabel('Squared Error Value')

関数 maxstep は、適応フィルターの最大ステップ サイズを計算します。このステップ サイズはフィルターをその取り得る最大収束速度で安定させます。ランダムな符号付き信号を IIR フィルターに渡して、一次入力信号 x, を作成します。信号 x にはフレームあたり 2000 サンプルの 50 フレームが含まれます。32 タップと 0.1 のステップ サイズで LMS フィルターを作成します。

x = zeros(2000,50);
IIRFilter = dsp.IIRFilter('Numerator',sqrt(0.75),'Denominator',[1 -0.5]);
for k = 1:size(x,2)   
  x(:,k) = IIRFilter(sign(randn(size(x,1),1))); 
end
mu = 0.1;     
LMSFilter = dsp.LMSFilter('Length',32,'StepSize',mu);

関数 maxstep を使用して、最大適応ステップ サイズと平均二乗の点における最大ステップ サイズを計算します。

[mumax,mumaxmse] = maxstep(LMSFilter,x)
mumax = 0.0625
mumaxmse = 0.0536

LMS アルゴリズムを使用して未知のシステムを特定します。適応フィルターの目的は、適応フィルターの出力と未知のシステム (同定対象のシステム) の出力間の誤差信号を最小化することです。誤差信号が最小化されると、適応させたフィルターは未知のシステムに似たものになります。

メモ: R2016a 以前のリリースを使用している場合、それぞれのオブジェクトの呼び出しを等価な step 構文で置き換えてください。たとえば、obj(x)step(obj,x) になります。

初期化

同定対象のシステムを表す dsp.FIRFilter オブジェクトを作成します。信号 x を FIR フィルターに渡します。未知のシステムの出力は、未知のシステム (FIR フィルター) の出力の和である目的の信号 d と、加法性ノイズ信号 n です。

filt = dsp.FIRFilter;
filt.Numerator = fir1(10,0.25);
x = randn(1000,1);
n = 0.01*randn(1000,1);
d = filt(x) + n;

適応フィルター

LMS 適応アルゴリズムを使用する適応フィルターを作成する dsp.LMSFilter オブジェクトを作成します。適応フィルターの長さを 11 タップ、ステップ サイズを 0.01 に設定します。一次入力信号 x と目的の信号 d, を LMS フィルターに渡します。適応フィルターの出力 y は目的の信号 d に収束された信号であり、2 つの信号間の誤差 e を最小化します。

lms = dsp.LMSFilter(11,'StepSize',0.01);
[y,e,w] = lms(x,d);
plot(1:1000, [d,y,e])
title('System Identification of an FIR filter')
legend('Desired','Output','Error')
xlabel('time index')
ylabel('signal value')

適応させたフィルターと未知のシステムとの比較

重みベクトル w は、未知のシステム (FIR フィルター) に似るように適応させた LMS フィルターの係数を意味します。収束を確認するために、FIR フィルターの分子係数と適応フィルターの推定された重み付けを比較します。

stem([filt.Numerator.',w])
legend('Actual','Estimated') 
xlabel('coefficient #')
ylabel('coefficient value')

未知のシステム (LMS フィルター) のすべての係数は適応させた FIR フィルターの係数とオーバーラップします。

LMS 適応フィルターを使用して未知のシステムに追加された加法性ノイズ n を打ち消します。LMS フィルターは、その伝達関数が未知のシステムの伝達関数と可能な限り一致するまでその係数を調整します。適応フィルターの出力と未知のシステムの出力間の差異は、誤差信号 e を意味します。この誤差信号の最小化が適応フィルターの目的です。

未知のシステムと LMS フィルターは、同じ入力信号 x を処理し、出力 dy をそれぞれ生成します。適応フィルターの係数が未知のシステムの係数と一致する場合、誤差 e は実際は加法性ノイズを意味します。

メモ: R2016a 以前のリリースを使用している場合、それぞれのオブジェクトの呼び出しを等価な step 構文で置き換えてください。たとえば、obj(x)step(obj,x) になります。

初期化

未知のシステムを表す dsp.FIRFilter System object を作成します。dsp.LMSFilter オブジェクトを作成し、長さを 11 タップ、ステップ サイズを 0.05 に設定します。未知のシステムに追加されたノイズを表す正弦波を作成します。時間スコープに信号が表示されます。

FrameSize = 100;
NIter = 10;
lmsfilt2 = dsp.LMSFilter('Length',11,'Method','Normalized LMS', ...
    'StepSize',0.05);
firfilt2 = dsp.FIRFilter('Numerator', fir1(10,[.5, .75]));
sinewave = dsp.SineWave('Frequency',0.01, ...
    'SampleRate',1,'SamplesPerFrame',FrameSize);
TS = dsp.TimeScope('TimeSpan',FrameSize*NIter,'TimeUnits','Seconds',...
    'YLimits',[-3 3],'BufferLength',2*FrameSize*NIter, ...
    'ShowLegend',true,'ChannelNames', ...
    {'Noisy signal', 'Error signal'});

ランダムな入力信号 x を作成し、信号を FIR フィルターに渡します。正弦波を FIR フィルターの出力に追加し、ノイズを含む信号 d を生成します。信号 d は未知のシステムの出力です。ノイズを含む信号と一次入力信号を LMS フィルターに渡します。ノイズを含む信号と誤差信号を時間スコープで表示します。

for k = 1:NIter
    x = randn(FrameSize,1);
    d = firfilt2(x) + sinewave();
    [y,e,w] = lmsfilt2(x,d);
    TS([d,e])
end
release(TS)

誤差信号 e は未知のシステムに追加された正弦波ノイズです。誤差信号の最小化によりシステムに追加されたノイズが最小化されます。

メモ: この例は R2017a 以降でのみ動作します。R2017a より前のリリースを使用している場合、このオブジェクトでフィルターの重みのサンプルごとの完全な履歴は出力されません。R2016b より以前のリリースを使用している場合は、それぞれの関数の呼び出しを等価な step 構文で置き換えてください。たとえば、myObject(x)step(myObject,x) になります。

dsp.LMSFilter System object を初期化し、WeightsOutput プロパティを 'All' に設定します。この設定により、LMS フィルターで次元 [FrameLength Length] の重みの行列の出力が有効になり、入力値の FrameLength 個のすべてのサンプルについて、サンプルごとの重みの完全な履歴が出力されるようになります。

FrameSize = 15000;
lmsfilt3 = dsp.LMSFilter('Length',63,'Method','LMS', ...
    'StepSize',0.001,'LeakageFactor',0.99999, ...
    'WeightsOutput','All'); % full Weights history

w_actual = fir1(64,[0.5 0.75]);
firfilt3 = dsp.FIRFilter('Numerator',w_actual);
sinewave = dsp.SineWave('Frequency',0.01, ...
    'SampleRate',1,'SamplesPerFrame',FrameSize);

TS = dsp.TimeScope('TimeSpan',FrameSize,'TimeUnits','Seconds', ...
    'YLimits',[-0.25 0.75],'BufferLength',2*FrameSize, ...
    'ShowLegend',true,'ChannelNames', ...
    {'Coeff 33 Estimate','Coeff 34 Estimate','Coeff 35 Estimate', ...
    'Coeff 33 Actual','Coeff 34 Actual','Coeff 35 Actual'});

1 つのフレームを実行し、適応重みの完全な履歴 w を出力します。

x = randn(FrameSize,1);       % Input signal
d = firfilt3(x) + sinewave(); % Noise + Signal
[~,~,w] = lmsfilt3(x,d);

w の各行は、それぞれの入力サンプルについて推定された一連の重みです。w の各列に特定の重みの完全な履歴が格納されます。33、34、35 番目の実際の重みと完全な履歴をプロットします。プロットでは、適応フィルターが入力サンプルの受信と適応を継続するにつれ、推定される重みの出力が結果的に実際の重みに収束することを確認できます。

idxBeg = 33;
idxEnd = 35;
TS([w(:,idxBeg:idxEnd), repmat(w_actual(idxBeg:idxEnd),FrameSize,1)])

アルゴリズム

LMS フィルターのアルゴリズムは次の方程式で定義されます。

y(n)=wT(n1)u(n)e(n)=d(n)y(n)w(n)=αw(n1)+f(u(n),e(n),μ)

この System object で使用できるさまざまな LMS 適応フィルター アルゴリズムは、次のように定義されます。

  • LMS:

    f(u(n),e(n),μ)=μe(n)u*(n)

  • 正規化 LMS:

    f(u(n),e(n),μ)=μe(n)u(n)ε+uH(n)u(n)

    正規化された LMS では、重みの更新時に数値が不安定になる可能性を克服するため、小さい正の定数 ε が分母に追加されました。倍精度浮動小数点入力の場合、ε は 2.2204460492503131e-016 です。単精度浮動小数点入力の場合、ε は 1.192092896e-07 です。固定小数点入力の場合、ε は 0 です。

  • 符号-誤差 LMS:

    f(u(n),e(n),μ)=μsign(e(n))u*(n)

  • 符号-データ LMS:

    f(u(n),e(n),μ)=μe(n)sign(u(n))

    ここで u(n) は実数です。

  • 符号-符号 LMS:

    f(u(n),e(n),μ)=μsign(e(n))sign(u(n))

    ここで u(n) は実数です。

変数は次のようになります。

変数説明

n

現在の時間インデックス

u(n)

ステップ n でのバッファー済み入力サンプルのベクトル

u*(n)

ステップ n でのバッファー済み入力サンプルのベクトルの複素共役

w(n)

ステップ n でのフィルターの重み推定ベクトル

y(n)

ステップ n でのフィルター処理された出力

e(n)

ステップ n での推定誤差

d(n)

ステップ n での目的の応答

µ

適応ステップ サイズ

α

漏れ係数 (0 < α ≤ 1)

ε

重みの更新時に数値が不安定になる可能性を修正する定数。

参照

[1] Hayes, M.H. Statistical Digital Signal Processing and Modeling. New York: John Wiley & Sons, 1996.

拡張機能

R2012a で導入