matlab-design-adaptive-filter について
DSP System ToolboxのSystemオブジェクトを使った適応フィルター実装を案内するMATLABスキルです。アルゴリズム選定、パラメーター設定、ストリーミング処理に加え、収束や係数取得で起こりやすい誤りも扱います。
主な機能
- 01信号と用途に応じたフィルター選定
- 02ステップサイズとフィルター長の設定
- 03フレーム単位のデータ処理
- 04係数の取得方法を解説
- 05ANCと周波数領域フィルターに対応
活用シーン
- 01未知システムのオンラインモデル化
- 02ノイズや音響エコーの除去
- 03フィードフォワード型ANCの構築
- 04非推奨のadaptfilt.*オブジェクトの置き換え
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-design-adaptive-filterインストール後、Claude Code で/matlab-design-adaptive-filterを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreferences/fdaf-filter.mdfxlms-filter.mdlms-filter.mdmaxstep-reference.mdobject-selection.mdother-filters.mdrls-filter.mdweight-extraction.md詳細
適応フィルタリング
実装ガイドライン — DSP System Toolbox の System オブジェクトを使用して適応フィルタを実装します。手動の重み更新ループは実装しないでください。
使用する場面
- システム同定 — 未知の FIR システムまたは IIR システムをオンラインでモデル化します
- ノイズまたは干渉のキャンセル — ノイズで汚染された測定信号から信号を復元します
- エコーキャンセル — 音響エコーまたは回線エコーを抑制します
- アクティブノイズ制御 — 二次経路を使用するフィードフォワード ANC
- 逆システム同定 — 等化およびデコンボリューション
- 適応予測 — 線形予測および音声符号化
- アルゴリズムの評価 — 適応フィルタアルゴリズムの性能を比較します
- 非推奨の
adaptfilt.*オブジェクトからの移行 —dsp.*FilterSystem オブジェクトに置き換えられました(R2020a で削除) dsp.LMSFilter、dsp.RLSFilter、dsp.FilteredXLMSFilter、dsp.FrequencyDomainAdaptiveFilter、dsp.AffineProjectionFilter、またはmaxstep()に関するあらゆるタスク
使用しない場面
- 静的(非適応)FIR/IIR フィルタ設計 —
matlab-design-digital-filterを使用してください - カルマンフィルタリングまたは状態推定 — Control System Toolbox を使用してください
- ディープラーニングベースのノイズ除去 — Deep Learning Toolbox を使用してください
- Simulink の適応フィルタブロック — Simulink で作業する場合に使用してください(モデリングワークフローが異なります)
ワークフロー
すべての適応フィルタリングタスクは、次の 5 つのステップのワークフローに従います。
1. 問題を分析する
コードを書く前に、次の項目を決定します。
- トポロジー — システム同定、逆システム同定、ノイズキャンセル、ANC、または予測のいずれですか?
- 信号の特性 — 入力は白色ですか、それとも有色ですか?定常ですか、それとも時間変化しますか?
- 制約 — フィルタ長、レイテンシの予算、計算コスト、リアルタイム性はどうなっていますか?
- フィルタ長 — 未知のシステムの次数に合わせるか、少し長く設定します
2. オブジェクトと手法を選択する
次の対応表を使って、適切な System オブジェクトを選択します。
| シナリオ | オブジェクト | 手法/設定 |
|---|---|---|
| 汎用、白色入力 | dsp.LMSFilter | 'Normalized LMS' |
| 有色/相関のある入力 | dsp.AffineProjectionFilter | ProjectionOrder=4-8 |
| 高速な収束が必要 | dsp.RLSFilter | ForgettingFactor=0.99 |
| 時間変化するシステムを追跡 | dsp.RLSFilter | ForgettingFactor=0.95-0.99 |
| アクティブノイズ制御 | dsp.FilteredXLMSFilter | 二次経路の推定が必要 |
| 長いフィルタ(>256 タップ) | dsp.FrequencyDomainAdaptiveFilter | 'Constrained FDAF' |
| 長いフィルタ+低レイテンシ | dsp.FrequencyDomainAdaptiveFilter | 'Partitioned constrained FDAF' |
| 低計算量(乗算なし) | dsp.LMSFilter | 'Sign-Data LMS' または 'Sign-Sign LMS' |
詳細な選択ガイダンスについては、references/object-selection.md を参照してください。
3. 設定する
ステップサイズ(安定性にとって重要):
lms = dsp.LMSFilter(Length=L, Method="Normalized LMS");
[muMax, muMaxMSE] = maxstep(lms, x);
lms.StepSize = 0.3 * muMaxMSE;
maxstep() を使用できるのは、次の場合に限られます。
dsp.LMSFilter(メソッド:'LMS'、'Normalized LMS'、'Sign-Error LMS')dsp.BlockLMSFilter
その他のすべてのオブジェクトについては、references/maxstep-reference.md を参照してください。
フィルタ長: 未知のシステムの次数 + 1 に設定します(次数が不確かな場合は、少し長く設定します)。
4. ストリーミングループで実行する
すべての適応フィルタ System オブジェクトは、フレームごとにデータを処理します。
for k = 1:numFrames
xFrame = x((k-1)*frameSize+1 : k*frameSize);
dFrame = d((k-1)*frameSize+1 : k*frameSize);
[y, err, wts] = lms(xFrame, dFrame);
end
シミュレーションでは、未知のシステムに dsp.FIRFilter または dsp.IIRFilter を使用します。これらのオブジェクトは、フレーム間で内部フィルタ状態を自動的に保持します。
5. 収束を確認して重みを抽出する
重みの抽出方法はオブジェクトによって異なり、よくあるエラーの原因になります。
| オブジェクト | 抽出方法 |
|---|---|
dsp.LMSFilter | 3 番目の出力:[y, e, w] = lms(x, d) |
dsp.RLSFilter | プロパティ:rls.Coefficients |
dsp.FilteredXLMSFilter | プロパティ:fxlms.Coefficients(ANC では符号を反転) |
dsp.FrequencyDomainAdaptiveFilter | references/fdaf-filter.md を参照 — 分割型と非分割型で方法が異なります |
dsp.AffineProjectionFilter | プロパティ:ap.Coefficients |
重要: dsp.LMSFilter には .Coefficients プロパティがありません。重みにアクセスするには、3 番目の出力引数を使うしかありません。
詳しくは、references/weight-extraction.md を参照してください。
主な関数
| 関数/オブジェクト | 用途 | ツールボックス |
|---|---|---|
dsp.LMSFilter | LMS/NLMS/Sign 系の手法(5 種類) | DSP System Toolbox |
dsp.RLSFilter | 再帰的最小二乗法(5 種類) | DSP System Toolbox |
dsp.AffineProjectionFilter | アフィン射影法(有色入力) | DSP System Toolbox |
dsp.FilteredXLMSFilter | Filtered-X LMS(ANC) | DSP System Toolbox |
dsp.FrequencyDomainAdaptiveFilter | FDAF(長いフィルター、4 種類の手法) | DSP System Toolbox |
dsp.BlockLMSFilter | ブロック LMS(フレームベース) | DSP System Toolbox |
dsp.AdaptiveLatticeFilter | ラティス(数値安定性) | DSP System Toolbox |
dsp.FastTransversalFilter | 高速トランスバーサル(O(N) RLS) | DSP System Toolbox |
maxstep() | 最大安定ステップサイズ | DSP System Toolbox |
msesim() | MSE 学習曲線のシミュレーション | DSP System Toolbox |
パターン
システム同定
unknownSys = dsp.FIRFilter(Numerator=fir1(31, 0.4));
lms = dsp.LMSFilter(Length=32, Method="Normalized LMS");
[muMax, muMaxMSE] = maxstep(lms, randn(1000, 1));
lms.StepSize = 0.3 * muMaxMSE;
for k = 1:numFrames
xFrame = randn(frameSize, 1);
dFrame = unknownSys(xFrame);
[~, ~, wts] = lms(xFrame, dFrame);
end
アクティブノイズ制御(2 段階)
% Stage 1: Estimate the secondary path
estFilter = dsp.LMSFilter(Length=secPathLen, Method="Normalized LMS");
[~, ~, secPathEst] = estFilter(probeSignal, secPathOutput);
% Stage 2: Configure the FxLMS controller
fxlms = dsp.FilteredXLMSFilter(Length=ctrlLen, ...
SecondaryPathCoefficients=secPathTrue, ...
SecondaryPathEstimate=secPathEst.');
[y, e] = fxlms(reference, errorMic);
ANC のワークフロー全体については、references/fxlms-filter.md を参照してください。
低レイテンシの長いフィルター(分割型 FDAF)
低い処理レイテンシで長い適応フィルターが必要な場合は、分割型 FDAF を使用します。
fdaf = dsp.FrequencyDomainAdaptiveFilter( ...
Length=2048, ...
BlockLength=128, ...
Method="Partitioned constrained FDAF", ...
StepSize=0.5);
for k = 1:numBlocks
xBlock = x((k-1)*128+1 : k*128);
dBlock = d((k-1)*128+1 : k*128);
[y, e] = fdaf(xBlock, dBlock);
end
% Latency = BlockLength/fs = 128/16000 = 8 ms
手法の文字列と FFTCoefficients の抽出については、references/fdaf-filter.md を参照してください。
適応を停止する(学習を止め、フィルタリングを継続する)
% dsp.LMSFilter — use AdaptInputPort
lms = dsp.LMSFilter(Length=32, AdaptInputPort=true);
adaptFlag = true;
for k = 1:numFrames
if k > freezeFrame, adaptFlag = false; end
[y, e, w] = lms(xFrame, dFrame, adaptFlag);
end
dsp.FrequencyDomainAdaptiveFilter では、代わりに LockCoefficients を使用してください。このオブジェクトは AdaptInputPort をサポートしていません。references/fdaf-filter.md を参照してください。
規約
- 必ず
dsp.*FilterSystem オブジェクトを使用してください — 重み更新ループを手動で実装しないでください - 必ず 利用可能な場合は、ステップサイズに
maxstep()を呼び出してください(LMS、NLMS、Sign-Error、BlockLMS) - 必ず 適応の停止/再開の制御には
AdaptInputPort=trueを使用してください — if/else で囲まないでください - 必ず 未知システムのシミュレーションには
dsp.FIRFilterを使用してください — フレーム間で状態を保持します - 決して
dsp.LMSFilterの.Coefficientsにアクセスしないでください — 存在しません。3 番目の出力を使用してください - 決して
dsp.FrequencyDomainAdaptiveFilterの.Coefficientsにアクセスしないでください —.FFTCoefficientsと IFFT を使用してください - 決して
adaptfilt.*関数(adaptfilt.lms、adaptfilt.nlms、adaptfilt.rlsなど)を使用しないでください — パッケージ全体が R2020a で削除されており、エラーになります。必ずdsp.*FilterSystem オブジェクトを使用してください。 - デフォルトの手法には
'LMS'よりも'Normalized LMS'を推奨します — 入力電力の変動に対して頑健です 'Unconstrained FDAF'よりも'Constrained FDAF'を推奨します — スペクトル漏れを防止します
よくある間違い
| 間違い | 間違いである理由 | 正しい方法 |
|---|---|---|
LMS ループを手動で実装する(w = w + mu*e*x) | エラーが発生しやすく、状態管理がなく、最適化された C コードもありません | 適切な Method を指定して dsp.LMSFilter を使用します |
| 安定性を確認せずにステップサイズをハードコードする | 発散したり、収束が遅くなったりする可能性があります | maxstep() を呼び出し、muMaxMSE の 30% を使用します |
状態を保持せずにフレームごとに filter(h, 1, x) を使用する | フレーム境界で連続性が失われます | dsp.FIRFilter を使用します(内部で状態を管理します) |
lms.Coefficients | dsp.LMSFilter にこのプロパティは存在しません | 3 番目の出力を使用します:[y, e, w] = lms(x, d) |
fdaf.Coefficients | FDAF にこのプロパティは存在しません | real(ifft(fdaf.FFTCoefficients)) を使用します |
BlockLength < Length の状態で 'Constrained FDAF' を使用する | エラーなしで実行されますが、分割処理は行われません | 'Partitioned constrained FDAF' を使用する必要があります |
| ANC で標準 LMS を使用する(二次経路を無視する) | 勾配が整合しないため、発散します | dsp.FilteredXLMSFilter を使用します |
Sign-Data または Sign-Sign LMS で maxstep() を呼び出す | サポートされていないため、エラーが発生します | StepSize を経験的に調整します(小さい値、たとえば 0.005 から始めます) |
dsp.RLSFilter で maxstep() を呼び出す | RLS ではこの関数は存在しません | RLS ではステップサイズではなく ForgettingFactor を使用します |
| デフォルトのゼロ重みで符号ベースの LMS を使用する | sign(0)=0 により、適応が永久に停止します | InitialConditions に小さな非ゼロ値を設定します |
adaptfilt.*(lms、nlms、rls など)を使用する | パッケージ全体が R2020a で削除されています。コードは実行されません | dsp.LMSFilter、dsp.RLSFilter などに置き換えます |
参考資料
- オブジェクト選択ガイド — 詳細な判断基準表
- dsp.LMSFilter — メソッド、maxstep、AdaptInputPort、重み
- dsp.RLSFilter — ForgettingFactor、メソッド、係数
- dsp.FilteredXLMSFilter — ANC ワークフロー、二次経路のプロパティ
- dsp.FrequencyDomainAdaptiveFilter — 分割モード、FFTCoefficients
- その他のフィルター — AP、BlockLMS、Lattice、FTF
- 重みの取得 — オブジェクトごとの係数へのアクセス
- maxstep リファレンス — 互換性と代替手段
著作権 2026 The MathWorks, Inc.