Main Content

RLS 適応フィルター処理を使用したシステム同定

この例では、RLS (再帰的最小二乗) フィルターを使用してローパス FIR フィルターでモデル化した未知のシステムを同定する方法を説明します。動的フィルター ビジュアライザーを使用して、未知のシステムと推定システムの周波数応答を比較します。この例では、UI (ユーザー インターフェイス) を使用して主要なシミュレーション パラメーターを動的に調整できます。また、MATLAB Coder™ を使用してアルゴリズムのコードを生成し、実行速度を加速する方法も説明します。

必要な MathWorks™ 製品:

  • DSP System Toolbox™

オプションの MathWorks 製品:

  • MATLAB シミュレーションからの C コードの生成に使用する MATLAB Coder

  • Simulink バージョンの例を実行するための Simulink®

はじめに

適応システム同定は適応フィルター処理の主なアプリケーションの 1 つです。この例では、RLS フィルターを使用したシステム同定について紹介します。以下にこの例のワークフローを示します。

未知のシステムはローパス FIR フィルターでモデル化されています。FIR フィルターと RLS フィルターに同じ入力を渡します。目標の信号は、未知のシステムの出力です。このため、RLS フィルターの推定の重み付けは FIR フィルターの係数に収束します。RLS フィルターおよび FIR フィルターの係数は、望ましい周波数応答および推定された周波数応答を可視化するために動的フィルター ビジュアライザーによって使用されます。RLS フィルターの学習曲線 (フィルターの MSE (平均二乗誤差) を時間に対してプロットしたもの) も可視化されます。

調整可能な FIR フィルター

この例で使用するローパス FIR フィルターは dsp.VariableBandwidthFIRFilter System object を使用してモデル化されています。このオブジェクトでは、FIR 構造は維持しながら、フィルターのカットオフ周波数を調整できます。調整は、各フィルター係数を、現在のカットオフ周波数と目標とするカットオフ周波数の比率に対応する係数で乗算して行われます。

MATLAB シミュレーション

HelperRLSFilterSystemIdentificationSim はアルゴリズムの実装を含む関数です。アルゴリズムを形成するオブジェクトをインスタンス化、初期化およびステップ実行します。

関数 RLSFilterSystemIDExampleAppHelperRLSFilterSystemIdentificationSim をラップ アラウンドして繰り返し呼び出し、未同定の FIR システムに対する連続的な適応を提供します。dsp.DynamicFilterVisualizer を使用すると、アプリケーションでは以下もプロットされます。

  1. 目標の周波数伝達関数と推定の周波数伝達関数

  2. RLS フィルターの学習曲線

プロットは関数への [plotResults] 入力が [true] の場合に行われます。

RLSFilterSystemIDExampleApp を実行してシミュレーションを実行し、結果をスコープにプロットします。シミュレーションはユーザーが明示的に停止するまで実行し続けることに注意してください。

以下のプロットは、上記のシミュレーションをタイム ステップ 100 回実行した場合の出力です。

RLSSysIdentification01.png

RLSSysIdentification02.png

上のプロットでは、RLS フィルターが FIR フィルターに急速に収束するのを見ることができます。

RLSFilterSystemIDExampleApp はシミュレーションを対話的に実行するように設計された UI (ユーザー インターフェイス) を起動します。UI ではパラメーターを調整でき、結果はシミュレーションにすぐに反映されます。たとえば、シミュレーションの実行中に [Cutoff Frequency] のスライダーを右に動かすと、FIR フィルターのカットオフ周波数が大きくなります。同様に、[RLS Forgetting Factor] のスライダーを動かすと、RLS フィルターの忘却係数が調整されます。これらのパラメーターを調整すると、変更がプロットに反映されます。UI の詳細については、HelperCreateParamTuningUI を参照してください。

また、UI には [リセット] と [シミュレーションの中止] という 2 つのボタンがあります。[リセット] ボタンは RLS フィルターと FIR フィルターの状態を初期値にリセットし、[シミュレーションの中止] ボタンはシミュレーションを終了します。RLS フィルターの忘却係数の値を小さくしすぎると、予想されるように、RLS フィルターは目標の解に収束しなくなります。収束するように戻すには、忘却係数を許容可能な値まで大きくし、[リセット] ボタンをクリックします。UI には、シミュレーションの制御に使用するものと、オプションで以下に説明するシミュレーション コードから生成された MEX ファイル (またはスタンドアロンの実行可能ファイル) の制御に使用するものがあります。MIDI コントローラーがある場合は、UI と同期することができます。このためには、スライダーまたはボタンを右クリックすると表示されるダイアログで MIDI コントロールを選択し、コンテキスト メニューから [Synchronize] を選択します。選択した MIDI コントロールがスライダー/ボタンと連携し、1 つのコントロールを操作するともう一方のコントロールが同期されるようになります。

RLSSysIdentification03.png

MEX ファイルの生成

MATLAB Coder を使用して関数 HelperRLSFilterSystemIdentificationSim の C コードを生成することもできます。ご使用のプラットフォームに合った MEX ファイルを生成するには、次を実行します。

currDir = pwd;  % Store the current directory address
addpath(pwd)
mexDir   = [tempdir 'RLSFilterSystemIdentificationExampleMEXDir']; % Name of                                          
% temporary directory
if ~exist(mexDir,'dir')
    mkdir(mexDir);       % Create temporary directory
end
cd(mexDir);          % Change directory

ParamStruct = HelperRLSCodeGeneration();
Code generation successful: To view the report, open('codegen/mex/HelperRLSFilterSystemIdentificationSim/html/report.mldatx')

'true' を引数として使用してラッパー関数 RLSFilterSystemIDExampleApp を呼び出すと、シミュレーションで HelperRLSFilterSystemIdentificationSim の代わりに生成した MEX ファイル HelperRLSFilterSystemIdentificationSimMEX を使用できます。このシナリオでは、UI は MATLAB 環境の内部で実行していますが、主要な処理アルゴリズムは MEX ファイルによって実行されています。このモードではパフォーマンスが改善され、パラメーターも引き続き調整可能です。

'true' を引数として RLSFilterSystemIDExampleApp を呼び出し、シミュレーションに MEX ファイルを使用するには、ここをクリックしてください。ここでも、シミュレーションは UI で明示的に停止するまで実行し続けます。

シミュレーションと MEX の速度の比較

MEX ファイルを作成すると、シミュレーションの実行時間が短縮されることが多くあります。パフォーマンスの向上を測定するために、まずプロットを行わずに MATLAB のアルゴリズムを実行します。

clear HelperRLSFilterSystemIdentificationSim
disp('Running the MATLAB code...')
Running the MATLAB code...
tic
nTimeSteps = 100;
for ind = 1:nTimeSteps
     HelperRLSFilterSystemIdentificationSim(ParamStruct);
end
tMATLAB = toc;

次に、対応する MEX ファイルを実行して結果を表示します。

clear HelperRLSFilterSystemIdentificationSim
disp('Running the MEX-File...')
Running the MEX-File...
tic
for ind = 1:nTimeSteps
    HelperRLSFilterSystemIdentificationSimMEX(ParamStruct);
end
tMEX = toc;

disp('RESULTS:')
RESULTS:
disp(['Time taken to run the MATLAB System object: ', num2str(tMATLAB),...
     ' seconds']);
Time taken to run the MATLAB System object: 5.4346 seconds
disp(['Time taken to run the MEX-File: ', num2str(tMEX), ' seconds']);
Time taken to run the MEX-File: 0.43781 seconds
disp(['Speed-up by a factor of ', num2str(tMATLAB/tMEX),...
    ' is achieved by creating the MEX-File']);
Speed-up by a factor of 12.4131 is achieved by creating the MEX-File

生成ファイルのクリーンアップ

以前に作成した一時ディレクトリは、次のようにして削除できます。

cd(currDir);
clear HelperRLSFilterSystemIdentificationSimMEX;
rmdir(mexDir, 's');

Simulink バージョン

rlsfiltersystemidentification は、前の節で説明した RLS のシステム同定の例を実装する Simulink モデルです。

このモデルでは、未知のシステムはローパス FIR フィルターであり、Variable Bandwidth FIR Filterブロックを使用してモデル化されています。System Identification サブシステム内では、Variable Bandwidth FIR Filter ブロックが入力信号を取り込み、フィルター処理された信号を出力に提供します。入力信号は、この目的の出力信号とともに、フィルターの重みを推定する RLS Filter ブロックに送られます。

RLSSysIdentification04.PNG

ローパス フィルターの係数は、フィルターの振幅応答を可視化するために、Filter Visualizerに送られます。

System Identification サブシステムをダブルクリックして、Simulink モデルと連携するように設計されたマスクを起動します。FIR フィルターのカットオフ周波数と RLS フィルターの忘却係数を調整できます。

モデルのシミュレーションを実行すると、コードが生成されます。したがって、書き込み権限のあるフォルダーから実行する必要があります。

参考

オブジェクト

ブロック

関連するトピック