このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

LMS 適応フィルター

LMS フィルターの基本的な例

この節ではいくつかの最小平均二乗 (LMS) 適応フィルター機能をツールボックスで使用する基本的な例を説明します。

ツールボックスには dsp.LMSFilter が用意されています。これは、LMS アルゴリズムを使用して適応フィルターの最適解を探索する System object™ です。dsp.LMSFilter オブジェクトは次のアルゴリズムをサポートします。

  • Wiener-Hopf 方程式を解き、適応フィルターのフィルター係数を求める LMS アルゴリズム

  • 正規化された LMS アルゴリズムの変動

  • LMS アルゴリズムの符号-データ変動 (各反復のフィルターの重みに対する補正は入力の符号 x(k) によって異なる)

  • LMS アルゴリズムの符号-誤差変動 (連続する各反復に対する現在のフィルターの重みに適用される補正は誤差の符号 x(k) によって異なる)

  • LMS アルゴリズムの符号-符号変動 (連続する各反復に対する現在のフィルターの重みに適用される補正は x(k) の符号と e(k) の符号の両方によって異なる)。

ツールボックスに提供されているさまざまな LMS アルゴリズムの相違点と類似点を示すために、LMS と NLMS 適応フィルターの例では未知のシステムに同じフィルターを使用します。未知のフィルターは fircband の例からの制限付きローパス フィルターです。

[b,err,res]=fircband(12,[0 0.4 0.5 1], [1 1 0 0], [1 0.2],... 
{'w' 'c'});
fvtool(b,1);

この図から、フィルターが実際にローパスであり、阻止帯域で 0.2 リップルに制約されていることがわかります。これをベースラインとして、適応 LMS フィルター例では適応 LMS アルゴリズムを使用してシステム同定ロールでこのフィルターを特定します。

システム ID モードの一般的なモデルを確認するには、そのレイアウトをシステム同定で参照してください。

LMS アルゴリズムの符号変動の場合、この例では、LMS 例で使用されたシステム同定アプリケーションではなく、ノイズ キャンセリングをデモ アプリケーションとして使用します。

LMS アルゴリズムを使用するシステム同定

ツールボックスで適応フィルター関数を使用するには、次の 3 つを指定しなければなりません。

  • 使用する適応 LMS アルゴリズム。dsp.LMSFilterMethod プロパティを目的のアルゴリズムに設定し、任意のアルゴリズムを選択できます。

  • 適応対象となる未知のシステムまたはプロセス。この例では、fircband で設計されたフィルターが未知のシステムです。

  • 適応プロセスを実行する適切な入力データ。一般的な LMS モデルの観点から、これらは目的の信号 d(k) と入力信号 x(k) です。

入力信号 x を定義することから開始します。

x = 0.1*randn(250,1);

入力は広帯域ノイズです。未知のシステム フィルターに fircband を使用して 12 次数のローパス フィルターを作成します。

[b,err,res] = fircband(12,[0 0.4 0.5 1],[1 1 0 0],[1 0.2],{'w','c'});

ここでは必要ありませんが、errres 出力引数を含めます。

次に、未知のシステムを介して信号をフィルター処理し、目的の信号を取得します。

d = filter(b,1,x);

設計した未知のフィルターと目的の信号を所定の位置で使用し、適応 LMS フィルター オブジェクトを作成および適用して未知の対象を特定します。

適応フィルター オブジェクトを準備するには、フィルター係数と LMS ステップ サイズの推定の開始値を指定しなければなりません。非ゼロ値のセットの推定係数で開始することもできます。この例では、12 個の初期のフィルターの重みにゼロを使用します。dsp.LMSFilterInitialConditions プロパティをフィルターの重みの目的の初期値に設定します。

ステップ サイズの場合、0.8 が妥当な値になります。250 回の反復内 (250 の入力サンプル点) で適切に収束するのに十分な大きさと、未知のフィルターの正確な推定を作成するのに十分な小ささとの良い妥協点です。

mu = 0.8;
lms = dsp.LMSFilter(13,'StepSize',mu,'WeightsOutputPort',true);

最後に、dsp.LMSFilter オブジェクト lms、目的の信号 d、フィルターへの入力 x を使用して適応フィルターを実行し、未知のシステムを判別して結果をプロットしたら、fircband からの実際の係数を dsp.LMSFilter で見つかった係数と比較します。

[y,e,w] = lms(x,d);
stem([b.' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual Filter Weights','Estimated Filter Weights',...
       'Location','NorthEast')

実験的に、ステップ サイズを 0.2 に変更してみます。mu = 0.2 を使用して例を繰り返すと、以下のステム プロットが出力されます。推定された重みは実際の重みを正確に近似できません。

mu = 0.2;
lms = dsp.LMSFilter(13,'StepSize',mu,'WeightsOutputPort',true);
[y,e,w] = lms(x,d);
stem([b.' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual Filter Weights','Estimated Filter Weights',...
       'Location','NorthEast')

これは、LMS アルゴリズムを十分な回数反復しなかったことが原因である可能性が考えられるため、1000 サンプルを使用してみます。1000 サンプルを使用すると、次の図に示すようにステム プロットははるかに改善されたように見えますが、計算量がかなり多くなります。ステップ サイズを選択する際は、必要な計算量と推定フィルターの忠実度の両方を考慮しなければならないことは明らかです。

for index = 1:4
  x = 0.1*randn(250,1);
  d = filter(b,1,x);
  [y,e,w] = lms(x,d);
end
stem([b.' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual Filter Weights','Estimated Filter Weights',...
       'Location','NorthEast')

正規化 LMS アルゴリズムを使用するシステム同定

LMS アルゴリズムの収束性能を向上するために、正規化されたバリアント (NLMS) は信号強度に基づいて適応ステップ サイズを使用します。入力信号強度が変化すると、アルゴリズムによって入力強度が計算され、適切な値を維持するようにステップ サイズが調整されます。したがって、ステップ サイズは時間と共に変化します。

その結果、正規化アルゴリズムは多くの場合、少ないサンプル数でより迅速に収束します。時間と共に緩やかに変化する入力信号の場合、正規化 LMS はより効率的な LMS の手法を表すことができます。

正規化 LMS アルゴリズムの例では、fircband を使用して特定するフィルターを作成しました。そのため、同じフィルターを使用し、dsp.LMSFilterMethod プロパティを 'Normalized LMS' に設定し、正規化 LMS アルゴリズムの変動を使用して結果を比較できます。類似する忠実度をもつ、より適切な収束が確認できるはずです。

最初に、入力信号と未知のフィルターを生成します。

x = 0.1*randn(500,1);
[b,err,res] = fircband(12,[0 0.4 0.5 1], [1 1 0 0], [1 0.2],... 
{'w' 'c'});
d = filter(b,1,x);

この場合も d は前に定義した目的の信号 d(x) を表し、b には未知のフィルターに対するフィルター係数が含まれます。

lms = dsp.LMSFilter(13,'StepSize',mu,'Method',...
   'Normalized LMS','WeightsOutputPort',true);

前述のコードを使用して正規化 LMS アルゴリズムを初期化します。オプションの入力引数の詳細については、dsp.LMSFilter を参照してください。

システム同定プロセスの実行は、目的の信号、入力信号、および初期フィルター係数をもつ dsp.LMSFilter オブジェクトと、入力引数として s に指定した条件を使用するだけです。その後、結果をプロットし、適応されたフィルターを実際のフィルターと比較します。

[y,e,w] = lms(x,d);
stem([b.' w])
title('System Identification by Normalized LMS Algorithm')
legend('Actual Filter Weights','Estimated Filter Weights',...
       'Location','NorthEast')

次のステム プロット (推定フィルターと実際のフィルターの係数を簡単に比較できる方法) に示すように、この 2 つはほぼ同一です。

通常の LMS アルゴリズムの収束性能を正規化 LMS バリアントと比較すると、正規化バージョンは、はるかに少ない反復回数で非正規化バージョンとほとんど同等に優れた結果に適応することがわかります。

lms_normalized = dsp.LMSFilter(13,'StepSize',mu,...
    'Method','Normalized LMS','WeightsOutputPort',true);
lms_nonnormalized = dsp.LMSFilter(13,'StepSize',mu,...
    'Method','LMS','WeightsOutputPort',true);
[~,e1,~] = lms_normalized(x,d);
[~,e2,~] = lms_nonnormalized(x,d);
plot([e1,e2]);
title('Comparing the LMS and NLMS Conversion Performance');
legend('NLMS Derived Filter Weights', ...
       'LMS Derived Filter Weights','Location', 'NorthEast');

符号-データ LMS アルゴリズムを使用したノイズ キャンセリング

適応フィルターを導き出すために必要な計算量によって開発プロセスが促進される場合、この例で示すように、LMS (SDLMS) アルゴリズムの符号-データ バリアントは優れた選択肢である可能性があります。

幸い、デジタル信号プロセッサ (DSP) 設計の現在の状態により、DSP の乗算演算とシフト演算を加算演算と同じくらい高速にすることによって、演算回数を最小限にする必要性が緩和されています。このため、符号-データ アルゴリズムのいくつかの誘発要因 (および符号-誤差変動と符号-符号変動) は、DSP 技術が改善されたことで一部失われています。

LMS 適応フィルターの標準および正規化された変動において、適応フィルターの係数は目的の信号と未知のシステムからの出力信号間の平均二乗誤差より発生します。符号-データ アルゴリズムを使用すると、入力データの符号を使用してフィルター係数を変更することにより、平均二乗誤差の計算が変更されます。

誤差が正の場合、新しい係数は前の係数に誤差を加算してステップ サイズ µ で乗算したものになります。誤差が負の場合、新しい係数はここでも前の係数から誤差を減算して µ で乗算したものになります。符号の変化に注意してください。

入力がゼロの場合、新しい係数は前のセットと同じです。

ベクトル形式の場合、符号-データ LMS アルゴリズムは次のようになります。

w(k+1)=w(k)+μe(k)sgn[x(k)],sgn[x(k)]={1,x(k)>00,x(k)=01,x(k)<0

フィルター係数に適用された重みが含まれるベクトル w と、入力データが含まれるベクトル x が使用されます。e(k) (目的の信号 - フィルター処理された信号に等しい) は時間 k の誤差であり、SDLMS アルゴリズムが最小化しようとする量です。µ (mu) はステップ サイズです。

小さい mu を指定すると、各サンプルのフィルターの重みに対する補正は小さくなり、SDLMS 誤差がより緩やかに小さくなります。大きい mu は各ステップの重みをより大きく変更するため、誤差はより高速に小さくなりますが、結果の誤差は理想的な解に正確に近づきません。優れた収束率と安定性を確保するには、以下の実用的な範囲内で mu を選択します。

0<μ<1N{InputSignalPower}

ここで、N は、信号内のサンプルの数です。また、効率的に計算するために mu を 2 のべき乗として定義します。

メモ

符号-データ アルゴリズムの初期条件をどのように設定するかは適応の効果に大きく影響します。アルゴリズムは基本的に入力信号を量子化するため、アルゴリズムは簡単に不安定になる可能性があります。

一連の大きな入力値を量子化プロセスと組み合わせると、誤差がすべての範囲を超えて大きくなる可能性があります。小さいステップ サイズ (µ<< 1) を選択してアルゴリズムの初期条件を非ゼロの正および負の値に設定することで、制御できなくなる符号-データ アルゴリズムの傾向を制限します。

このノイズ キャンセリング例で、dsp.LMSFilter Method プロパティを 'Sign-Data LMS' に設定します。この例には、2 つの入力データセットが必要です。

信号には、正弦波を使用します。signal は 1000 要素の列ベクトルであることに注意してください。

signal = sin(2*pi*0.055*[0:1000-1]');

今度は、相関ホワイト ノイズを signal に追加します。ノイズが相関していることを確認するには、ローパス FIR フィルターを介してノイズを渡してから、フィルター処理されたノイズを信号に追加します。

noise = randn(1000,1);
nfilt = fir1(11,0.4); % Eleventh order lowpass filter
fnoise = filter(nfilt,1,noise); % Correlated noise data
d = signal + fnoise;

fnoise は相関ノイズであり、d は符号-データ アルゴリズムに対する目的の信号になります。

処理するための dsp.LMSFilter オブジェクトを準備するには、オブジェクトに対する重みの初期条件 (InitialConditions) と mu (StepSize) を設定します。この節で前述したように、coeffsmu に設定する値によって適応フィルターが信号パスからノイズを除去できるかどうかが決まります。

LMS アルゴリズムを使用するシステム同定では、フィルター係数をゼロに設定する既定のフィルターを作成しました。ほとんどの場合、この方法は符号-データ アルゴリズムで機能しません。設定する初期フィルター係数が期待値に近いほどアルゴリズムは適切に機能し、効果的にノイズを除去するフィルターの解に収束します。

この例では、ノイズをフィルター処理する際に使用するフィルターの係数 (nfilt) から開始して、アルゴリズムが適応しなければならないように若干変更します。

coeffs = nfilt.' -0.01; % Set the filter initial conditions.
mu = 0.05;          % Set the step size for algorithm updating.

dsp.LMSFilter に必要な入力引数を準備したら、LMS フィルター オブジェクトを作成し、適応を実行して、結果を表示します。

lms = dsp.LMSFilter(12,'Method','Sign-Data LMS',...
   'StepSize',mu,'InitialConditions',coeffs);
[~,e] = lms(noise,d);
L = 200;
plot(0:L-1,signal(1:L),0:L-1,e(1:L));
title('Noise Cancellation by the Sign-Data Algorithm');
legend('Actual Signal','Result of Noise Cancellation',...
       'Location','NorthEast');

dsp.LMSFilter を実行すると、いずれの LMS アルゴリズムよりもはるかに少ない乗算演算が使用されます。また、符号-データ適応を実行するには、ステップ サイズが 2 のべき乗のときにのみ乗算するビット シフトが必要です。

符号-データ アルゴリズムの性能は次の図に示すように非常に良好ですが、符号-データ アルゴリズムは標準 LMS の変動より安定性がかなり低下します。このノイズ キャンセリング例で、処理後の信号は入力信号と非常によく一致しますが、アルゴリズムは優れた性能を実現するのではなく、とても簡単に制限なく拡大します。

InitialConditionsmu、または相関ノイズの作成に使用したローパス フィルターを変更すると、ノイズ キャンセリングが失敗し、アルゴリズムが役に立たなくなります。

符号-誤差 LMS アルゴリズムを使用したノイズ キャンセリング

場合によっては、LMS アルゴリズムの符号-誤差バリアント (SELMS) は適応フィルター アプリケーションに非常に適しています。

LMS 適応フィルターの標準および正規化された変動において、適応フィルターの係数は目的の信号と未知のシステムからの出力信号間の平均二乗誤差を計算し、その結果を現在のフィルター係数に適用することにより発生します。符号-誤差アルゴリズムを使用して誤差の符号を使用することで平均二乗誤差の計算を置き換え、フィルター係数を変更します。

誤差が正の場合、新しい係数は前の係数に誤差を加算してステップ サイズ µ で乗算したものになります。誤差が負の場合、新しい係数はここでも前の係数から誤差を減算して µ で乗算したものになります。符号の変化に注意してください。入力がゼロの場合、新しい係数は前のセットと同じです。

ベクトル形式の場合、符号-誤差 LMS アルゴリズムは次のようになります。

w(k+1)=w(k)+μsgn[e(k)][x(k)],sgn[e(k)]={1,e(k)>00,e(k)=01,e(k)<0}

フィルター係数に適用された重みが含まれるベクトル w と、入力データが含まれるベクトル x が使用されます。e(k) (目的の信号 - フィルター処理された信号に等しい) は時間 k の誤差であり、SELMS アルゴリズムが最小化しようとする量です。µ (mu) はステップ サイズです。小さい mu を指定すると、各サンプルのフィルターの重みに対する補正は小さくなり、SELMS 誤差がより緩やかに小さくなります。

大きい mu は各ステップの重みをより大きく変更するため、誤差はより高速に小さくなりますが、結果の誤差は理想的な解に正確に近づきません。優れた収束率と安定性を確保するには、以下の実用的な範囲内で mu を選択します。

0<μ<1N{InputSignalPower}

ここで、N は、信号内のサンプルの数です。また、効率的に計算するために mu を 2 のべき乗として定義します。

メモ

符号-データ アルゴリズムの初期条件をどのように設定するかは適応の効果に大きく影響します。アルゴリズムは基本的に誤差信号を量子化するため、アルゴリズムは簡単に不安定になる可能性があります。

一連の大きな誤差値を量子化プロセスと組み合わせると、誤差がすべての範囲を超えて大きくなる可能性があります。小さいステップ サイズ (µ<< 1) を選択してアルゴリズムの初期条件を非ゼロの正および負の値に設定することで、制御できなくなる符号-誤差アルゴリズムの傾向を制限します。

このノイズ キャンセリング例では、dsp.LMSFilter オブジェクトに次の 2 つの入力データ セットが必要です。

信号には、正弦波を使用します。signal は 1000 要素の列ベクトルであることに注意してください。

signal = sin(2*pi*0.055*[0:1000-1]');

今度は、相関ホワイト ノイズを signal に追加します。ノイズが相関していることを確認するには、ローパス FIR フィルターを介してノイズを渡してから、フィルター処理されたノイズを信号に追加します。

noise = randn(1000,1);
nfilt = fir1(11,0.4); % Eleventh order lowpass filter.
fnoise = filter(nfilt,1,noise); % Correlated noise data.
d = signal + fnoise;

fnoise は相関ノイズであり、d は符号-データ アルゴリズムに対する目的の信号になります。

処理するための dsp.LMSFilter オブジェクトを準備するには、オブジェクトに対する重みの初期条件 (InitialConditions) と mu (StepSize) を設定します。この節で前述したように、coeffsmu に設定する値によって適応フィルターが信号パスからノイズを除去できるかどうかが決まります。LMS アルゴリズムを使用するシステム同定では、フィルター係数をゼロに設定する既定のフィルターを作成しました。

係数をゼロに設定しても、多くの場合、符号-誤差アルゴリズムで機能しません。設定する初期フィルター係数が期待値に近いほどアルゴリズムは適切に機能し、効果的にノイズを除去するフィルターの解に収束します。

この例では、ノイズをフィルター処理する際に使用するフィルターの係数 (nfilt) から開始して、アルゴリズムが適応しなければならないように若干変更します。

coeffs = nfilt.' -0.01; % Set the filter initial conditions.
mu = 0.05;            % Set step size for algorithm update.

dsp.LMSFilter に必要な入力引数を準備したら、適応を実行して、結果を表示します。

lms = dsp.LMSFilter(12,'Method','Sign-Error LMS',...
   'StepSize',mu,'InitialConditions',coeffs);
[~,e] = lms(noise,d);
L = 200;
plot(0:199,signal(1:200),0:199,e(1:200));
title('Noise Cancellation Performance by the Sign-Error LMS Algorithm');
legend('Actual Signal','Error After Noise Reduction',...
       'Location','NorthEast')

符号-誤差 LMS アルゴリズムを実行すると、いずれの LMS アルゴリズムよりもはるかに少ない乗算演算が使用されます。また、符号-誤差適応を実行するには、ステップ サイズが 2 のべき乗のときにのみ乗算するビット シフトが必要です。

符号-データ アルゴリズムの性能は次の図に示すように非常に良好ですが、符号-データ アルゴリズムは標準 LMS の変動より安定性がかなり低下します。このノイズ キャンセリング例で、処理後の信号は入力信号と非常によく一致しますが、アルゴリズムは優れた性能を実現するのではなく、とても簡単に不安定になります。

重みの初期条件 (InitialConditions) と mu (StepSize)、または相関ノイズの作成に使用したローパス フィルターを変更すると、ノイズ キャンセリングが失敗し、アルゴリズムが役に立たなくなります。

符号-符号 LMS アルゴリズムを使用したノイズ キャンセリング

ツールボックスでのもう 1 つの LMS アルゴリズムの変動例は、符号-符号バリアント (SSLMS) です。このバージョンの根拠は、前の節で説明した符号-データ アルゴリズムおよび符号-誤差アルゴリズムの根拠と一致します。詳細については、符号-データ LMS アルゴリズムを使用したノイズ キャンセリングを参照してください。

符号-符号アルゴリズム (SSLMS) では、入力データの符号を使用することで平均二乗誤差の計算を置き換え、フィルター係数を変更します。誤差が正の場合、新しい係数は前の係数に誤差を加算してステップ サイズ µ で乗算したものになります。

誤差が負の場合、新しい係数はここでも前の係数から誤差を減算して µ で乗算したものになります。符号の変化に注意してください。入力がゼロの場合、新しい係数は前のセットと同じです。

基本的に、アルゴリズムは誤差と入力の両方を符号演算子を適用して量子化します。

ベクトル形式の場合、符号-符号 LMS アルゴリズムは次のようになります。

w(k+1)=w(k)+μsgn[e(k)]sgn[x(k)],sgn[z(k)]={1,z(k)>00,z(k)=01,z(k)<0

ここで、

z(k)=[e(k)]sgn[x(k)]

ベクトル w にはフィルター係数に適用された重みが含まれ、ベクトル x には入力データが含まれます。e(k) (= 目的の信号 - フィルター処理された信号) は時間 k の誤差であり、SSLMS アルゴリズムが最小化しようとする量です。µ (mu) はステップ サイズです。小さい mu を指定すると、各サンプルのフィルターの重みに対する補正は小さくなり、SSLMS 誤差がより緩やかに小さくなります。

大きい mu は各ステップの重みをより大きく変更するため、誤差はより高速に小さくなりますが、結果の誤差は理想的な解に正確に近づきません。優れた収束率と安定性を確保するには、以下の実用的な範囲内で mu を選択します。

0<μ<1N{InputSignalPower}

ここで、N は、信号内のサンプルの数です。また、効率的に計算するために mu を 2 のべき乗として定義します。

メモ

符号-符号アルゴリズムの初期条件をどのように設定するかは適応の効果に大きく影響します。アルゴリズムは基本的に入力信号と誤差信号を量子化するため、アルゴリズムは簡単に不安定になる可能性があります。

一連の大きな誤差値を量子化プロセスと組み合わせると、誤差がすべての範囲を超えて大きくなる可能性があります。小さいステップ サイズ (µ<< 1) を選択してアルゴリズムの初期条件を非ゼロの正および負の値に設定することで、制御できなくなる符号-符号アルゴリズムの傾向を制限します。

このノイズ キャンセリング例では、dsp.LMSFilter オブジェクトに次の 2 つの入力データ セットが必要です。

信号には、正弦波を使用します。signal は 1000 要素の列ベクトルであることに注意してください。

signal = sin(2*pi*0.055*[0:1000-1]');

今度は、相関ホワイト ノイズを signal に追加します。ノイズが相関していることを確認するには、ローパス FIR フィルターを介してノイズを渡してから、フィルター処理されたノイズを信号に追加します。

noise = randn(1000,1);
nfilt = fir1(11,0.4); % Eleventh order lowpass filter
fnoise = filter(nfilt,1,noise); % Correlated noise data
d = signal + fnoise;

fnoise は相関ノイズであり、d は符号-データ アルゴリズムに対する目的の信号になります。

処理するための dsp.LMSFilter オブジェクトを準備するには、オブジェクトに対する重みの初期条件 (InitialConditions) と mu (StepSize) を設定します。この節で前述したように、coeffsmu に設定する値によって適応フィルターが信号パスからノイズを除去できるかどうかが決まります。LMS アルゴリズムを使用するシステム同定では、フィルター係数をゼロに設定する既定のフィルターを作成しました。通常、この方法は符号-符号アルゴリズムで機能しません。

設定する初期フィルター係数が期待値に近いほどアルゴリズムは適切に機能し、効果的にノイズを除去するフィルターの解に収束します。この例では、ノイズをフィルター処理する際に使用するフィルターの係数 (nfilt) から開始して、アルゴリズムが適応しなければならないように若干変更します。

coeffs = nfilt.' -0.01; % Set the filter initial conditions.
mu = 0.05;          % Set the step size for algorithm updating.

dsp.LMSFilter に必要な入力引数を準備したら、適応を実行して、結果を表示します。

lms = dsp.LMSFilter(12,'Method','Sign-Sign LMS',...
   'StepSize',mu,'InitialConditions',coeffs);
[~,e] = lms(noise,d);
L = 200;
plot(0:199,signal(1:200),0:199,e(1:200));
title('Noise Cancellation Performance by the Sign-Error LMS Algorithm');
legend('Actual Signal','Error After Noise Reduction',...
       'Location','NorthEast')

dsp.LMSFilter を実行すると、いずれの LMS アルゴリズムよりもはるかに少ない乗算演算が使用されます。また、符号-符号適応を実行するには、ステップ サイズが 2 のべき乗のときにのみ乗算するビット シフトが必要です。

符号-符号アルゴリズムの性能は次の図に示すように非常に良好ですが、符号-符号アルゴリズムは標準 LMS の変動より安定性がかなり低下します。このノイズ キャンセリング例で、処理後の信号は入力信号と非常によく一致しますが、アルゴリズムは優れた性能を実現するのではなく、とても簡単に不安定になります。

重みの初期条件 (InitialConditions) と mu (StepSize)、または相関ノイズの作成に使用したローパス フィルターを変更すると、ノイズ キャンセリングが失敗し、アルゴリズムが役に立たなくなります。

参考までに、符号-符号 LMS アルゴリズムは 32 Kb/s ADPCM テレフォニーの国際 CCITT 規格の一部です。

参照

[1] Hayes, Monson H., Statistical Digital Signal Processing and Modeling, John Wiley & Sons, 1996, 493–552.

[2] Haykin, Simon, Adaptive Filter Theory, Prentice-Hall, Inc., 1996