mcpField
M
matlab-design-adaptive-filter

matlab-design-adaptive-filter

github.com/matlabデータ・データベース1.2k66 回インストール1 日前に更新
リポジトリ

matlab-design-adaptive-filter について

DSP System ToolboxのSystemオブジェクトを使った適応フィルター実装を案内するMATLABスキルです。アルゴリズム選定、パラメーター設定、ストリーミング処理に加え、収束や係数取得で起こりやすい誤りも扱います。

主な機能

  1. 01信号と用途に応じたフィルター選定
  2. 02ステップサイズとフィルター長の設定
  3. 03フレーム単位のデータ処理
  4. 04係数の取得方法を解説
  5. 05ANCと周波数領域フィルターに対応

活用シーン

  1. 01未知システムのオンラインモデル化
  2. 02ノイズや音響エコーの除去
  3. 03フィードフォワード型ANCの構築
  4. 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.yaml
references/
fdaf-filter.md
fxlms-filter.md
lms-filter.md
maxstep-reference.md
object-selection.md
other-filters.md
rls-filter.md
weight-extraction.md

詳細

適応フィルタリング

実装ガイドライン — DSP System Toolbox の System オブジェクトを使用して適応フィルタを実装します。手動の重み更新ループは実装しないでください。

使用する場面

  • システム同定 — 未知の FIR システムまたは IIR システムをオンラインでモデル化します
  • ノイズまたは干渉のキャンセル — ノイズで汚染された測定信号から信号を復元します
  • エコーキャンセル — 音響エコーまたは回線エコーを抑制します
  • アクティブノイズ制御 — 二次経路を使用するフィードフォワード ANC
  • 逆システム同定 — 等化およびデコンボリューション
  • 適応予測 — 線形予測および音声符号化
  • アルゴリズムの評価 — 適応フィルタアルゴリズムの性能を比較します
  • 非推奨の adaptfilt.* オブジェクトからの移行 — dsp.*Filter System オブジェクトに置き換えられました(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.AffineProjectionFilterProjectionOrder=4-8
高速な収束が必要dsp.RLSFilterForgettingFactor=0.99
時間変化するシステムを追跡dsp.RLSFilterForgettingFactor=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.LMSFilter3 番目の出力:[y, e, w] = lms(x, d)
dsp.RLSFilterプロパティ:rls.Coefficients
dsp.FilteredXLMSFilterプロパティ:fxlms.Coefficients(ANC では符号を反転)
dsp.FrequencyDomainAdaptiveFilterreferences/fdaf-filter.md を参照 — 分割型と非分割型で方法が異なります
dsp.AffineProjectionFilterプロパティ:ap.Coefficients

重要: dsp.LMSFilter には .Coefficients プロパティがありません。重みにアクセスするには、3 番目の出力引数を使うしかありません。

詳しくは、references/weight-extraction.md を参照してください。

主な関数

関数/オブジェクト用途ツールボックス
dsp.LMSFilterLMS/NLMS/Sign 系の手法(5 種類)DSP System Toolbox
dsp.RLSFilter再帰的最小二乗法(5 種類)DSP System Toolbox
dsp.AffineProjectionFilterアフィン射影法(有色入力)DSP System Toolbox
dsp.FilteredXLMSFilterFiltered-X LMS(ANC)DSP System Toolbox
dsp.FrequencyDomainAdaptiveFilterFDAF(長いフィルター、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.*Filter System オブジェクトを使用してください — 重み更新ループを手動で実装しないでください
  • 必ず 利用可能な場合は、ステップサイズに 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.*Filter System オブジェクトを使用してください。
  • デフォルトの手法には '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.Coefficientsdsp.LMSFilter にこのプロパティは存在しません3 番目の出力を使用します:[y, e, w] = lms(x, d)
fdaf.CoefficientsFDAF にこのプロパティは存在しません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 などに置き換えます

参考資料


著作権 2026 The MathWorks, Inc.


コメント