Generated banner for Matlab Design Adaptive Filter
Generated logo for Matlab Design Adaptive Filter

Matlab Design Adaptive Filter

MathWorksOfficialCreated by MathWorks

  • Skill
  • Tool integration
  • Science and research
  • BSD-2-Clause
  • No issues found

From the author

Design and implement adaptive filters using DSP System Toolbox System objects. Use when working with adaptive filtering, system identification, noise cancellation, echo cancellation, active noise control (ANC), channel equalization, inverse system identification, or adaptive prediction. Covers dsp.LMSFilter, dsp.RLSFilter, dsp.FilteredXLMSFilter, dsp.FrequencyDomainAdaptiveFilter, dsp.AffineProjectionFilter, dsp.BlockLMSFilter, dsp.AdaptiveLatticeFilter, dsp.FastTransversalFilter, maxstep(), and algorithm selection for adaptive filtering problems. Replaces deprecated adaptfilt.* objects (removed R2020a).
— the description by MathWorks

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured approach to implementing adaptive filters using the DSP System Toolbox. It replaces deprecated adaptfilt functions with modern dsp.*Filter System objects, ensuring robust performance for tasks like system identification, noise cancellation, and active noise control. The skill emphasizes best practices for filter configuration, stability, and weight extraction, providing specific workflows for various adaptive algorithms including LMS, RLS, and Frequency Domain Adaptive Filters.

What it does

  • Provides a standardized workflow for adaptive filter design using System objects.
  • Offers guidance on selecting the appropriate algorithm based on input characteristics and performance requirements.
  • Details the implementation of active noise control using Filtered-X LMS.
  • Explains how to manage filter state and extract coefficients correctly across different object types.
  • Includes patterns for low-latency long filter implementation using partitioned FDAF.
  • Provides best practices for ensuring stability, including step-size calculation and coefficient freezing.

When to use it

  • When performing system identification, noise cancellation, or echo cancellation.
  • When implementing active noise control (ANC) or adaptive prediction.
  • When migrating legacy code from deprecated adaptfilt objects to modern System objects.
  • When you need to compare the performance of different adaptive filtering algorithms.
  • When designing filters that require real-time, frame-based processing.

Advantages

  • Ensures stability and convergence by utilizing optimized System objects.
  • Provides clear, reliable methods for weight extraction and state management.
  • Offers specific solutions for complex scenarios like long-filter low-latency requirements.
  • Promotes consistent coding patterns that prevent common errors like manual weight-update loops.
  • Facilitates easier maintenance by using current, supported toolbox functionality.

Usage examples

“How do I implement a normalized LMS filter for system identification?”
The agent provides a code snippet using dsp.LMSFilter with Method='Normalized LMS', demonstrates the use of maxstep() to calculate a stable step size, and shows the streaming loop for processing data frames.
“What is the correct way to implement active noise control?”
The agent outlines the two-stage workflow: first estimating the secondary path using dsp.LMSFilter, then configuring dsp.FilteredXLMSFilter with the estimated path for the controller.
“How can I achieve low latency with a long adaptive filter?”
The agent recommends using dsp.FrequencyDomainAdaptiveFilter with the 'Partitioned constrained FDAF' method, explaining how to set BlockLength to control latency.
“How do I stop a filter from adapting while keeping it running?”
The agent explains the use of the AdaptInputPort property for dsp.LMSFilter or the LockCoefficients property for dsp.FrequencyDomainAdaptiveFilter to freeze updates.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/matlab/matlab-design-adaptive-filter/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip matlab-design-adaptive-filter.zip -d .agents/skills

Documentation by MathWorks

Adaptive Filtering

Implementation guideline — Use DSP System Toolbox System objects to implement adaptive filters. Do not implement manual weight-update loops.

When to Use

  • System identification — Model unknown FIR or IIR systems online

  • Noise or interference cancellation — Recover signals from noise-corrupted measurement

  • Echo cancellation — Suppress acoustic or line echo

  • Active noise control — Feedforward ANC with secondary path

  • Inverse system identification — Equalization and deconvolution

  • Adaptive prediction — Linear prediction and speech coding

  • Algorithm evaluation — Compare adaptive filter algorithm performance

  • Migrating from deprecated adaptfilt.* objects — Replaced by dsp.*Filter System objects (removed in R2020a)

  • Any task involving dsp.LMSFilter, dsp.RLSFilter, dsp.FilteredXLMSFilter, dsp.FrequencyDomainAdaptiveFilter, dsp.AffineProjectionFilter, or maxstep()

When NOT to Use

  • Static (non-adaptive) FIR/IIR filter design — Use matlab-design-digital-filter

  • Kalman filtering or state estimation — Use Control System Toolbox

  • Deep learning-based denoising — Use Deep Learning Toolbox

  • Simulink adaptive filter blocks — Use when working in Simulink (different modeling workflow)

Workflow

Every adaptive filtering task follows this five-step workflow:

1. Analyze the Problem

Before writing code, determine:

  • Topology — System identification, inverse system identification, noise cancellation, ANC, or prediction?

  • Signal characteristics — White or colored input? Stationary or time-varying?

  • Constraints — Filter length, latency budget, computational cost, real-time?

  • Filter length — Match or slightly exceed the unknown system order

2. Select Object and Method

Use the routing table to pick the right System object:

ScenarioObjectMethod/Config
General-purpose, white inputdsp.LMSFilter'Normalized LMS'
Colored/correlated inputdsp.AffineProjectionFilterProjectionOrder=4-8
Fast convergence neededdsp.RLSFilterForgettingFactor=0.99
Tracking time-varying systemdsp.RLSFilterForgettingFactor=0.95-0.99
Active noise controldsp.FilteredXLMSFilterRequires secondary path estimate
Long filters (>256 taps)dsp.FrequencyDomainAdaptiveFilter'Constrained FDAF'
Long filter + low latencydsp.FrequencyDomainAdaptiveFilter'Partitioned constrained FDAF'
Low-complexity (no multiplies)dsp.LMSFilter'Sign-Data LMS' or 'Sign-Sign LMS'

For detailed selection guidance, see references/object-selection.md.

3. Configure

Step size (critical for stability):

lms = dsp.LMSFilter(Length=L, Method="Normalized LMS");
[muMax, muMaxMSE] = maxstep(lms, x);
lms.StepSize = 0.3 * muMaxMSE;

maxstep() is available only for:

  • dsp.LMSFilter (Methods: 'LMS', 'Normalized LMS', 'Sign-Error LMS')

  • dsp.BlockLMSFilter

For all other objects, see references/maxstep-reference.md.

Filter length: Set to unknown system order + 1 (or slightly longer if order is uncertain).

4. Run in Streaming Loop

All adaptive filter System objects process data frame-by-frame:

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

In simulation, use dsp.FIRFilter or dsp.IIRFilter for the unknown system. These objects automatically maintain internal filter state across frames.

5. Verify Convergence and Extract Weights

Weight extraction differs by object and is a common source of errors:

ObjectExtraction Method
dsp.LMSFilterThird output: [y, e, w] = lms(x, d)
dsp.RLSFilterProperty: rls.Coefficients
dsp.FilteredXLMSFilterProperty: fxlms.Coefficients (negated for ANC)
dsp.FrequencyDomainAdaptiveFilterSee references/fdaf-filter.md — partitioned vs non-partitioned differ
dsp.AffineProjectionFilterProperty: ap.Coefficients

Important: dsp.LMSFilter does NOT have a .Coefficients property. The third output argument is the only way to access weights.

For full details, see references/weight-extraction.md.

Key Functions

Function/ObjectPurposeToolbox
dsp.LMSFilterLMS/NLMS/Sign variants (5 methods)DSP System Toolbox
dsp.RLSFilterRecursive Least Squares (5 methods)DSP System Toolbox
dsp.AffineProjectionFilterAffine Projection (colored input)DSP System Toolbox
dsp.FilteredXLMSFilterFiltered-X LMS (ANC)DSP System Toolbox
dsp.FrequencyDomainAdaptiveFilterFDAF (long filters, 4 methods)DSP System Toolbox
dsp.BlockLMSFilterBlock LMS (frame-based)DSP System Toolbox
dsp.AdaptiveLatticeFilterLattice (numerical stability)DSP System Toolbox
dsp.FastTransversalFilterFast transversal (O(N) RLS)DSP System Toolbox
maxstep()Maximum stable step sizeDSP System Toolbox
msesim()Simulated MSE learning curvesDSP System Toolbox

Patterns

System Identification
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
Active Noise Control (Two-Stage)
% 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);

See references/fxlms-filter.md for the full ANC workflow.

Low-Latency Long Filter (Partitioned FDAF)

Use partitioned FDAF when you need a long adaptive filter with low processing latency.

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

See references/fdaf-filter.md for method strings and FFTCoefficients extraction.

Freeze Adaptation (Stop Learning, Keep Filtering)
% 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

For dsp.FrequencyDomainAdaptiveFilter, use LockCoefficients instead. This object does not support AdaptInputPort. See references/fdaf-filter.md.

Conventions

  • Always use dsp.*Filter System objects — Never implement weight-update loops manually

  • Always call maxstep() for step size when available (LMS, NLMS, Sign-Error, BlockLMS)

  • Always use AdaptInputPort=true for freeze/adapt control — Never wrap in if/else

  • Always use dsp.FIRFilter for unknown system simulation — It maintains state across frames

  • Never access .Coefficients on dsp.LMSFilter — It doesn't exist; use third output

  • Never access .Coefficients on dsp.FrequencyDomainAdaptiveFilter — Use .FFTCoefficients + IFFT

  • Never use adaptfilt.* functions (adaptfilt.lms, adaptfilt.nlms, adaptfilt.rls, etc.) — The entire package was removed in R2020a and will error. Always use dsp.*Filter System objects.

  • Prefer 'Normalized LMS' over 'LMS' as the default method — Robust to input power variations

  • Prefer 'Constrained FDAF' over 'Unconstrained FDAF' — Prevents spectral leakage

Common Mistakes

MistakeWhy It's WrongCorrect Approach
Manual LMS loop (w = w + mu*e*x)Error-prone, no state management, no optimized C codeUse dsp.LMSFilter with the appropriate Method
Hardcoded step size without stability checkMay diverge or converge too slowlyCall maxstep() and use 30% of muMaxMSE
filter(h, 1, x) per frame without stateBreaks continuity at frame boundariesUse dsp.FIRFilter (manages state internally)
lms.CoefficientsProperty does not exist for dsp.LMSFilterUse third output: [y, e, w] = lms(x, d)
fdaf.CoefficientsProperty does not exist for FDAFUse real(ifft(fdaf.FFTCoefficients))
'Constrained FDAF' with BlockLength < LengthSilently runs but does NOT partitionMust use 'Partitioned constrained FDAF'
Standard LMS for ANC (ignoring secondary path)Diverges — gradient is misalignedUse dsp.FilteredXLMSFilter
maxstep() on Sign-Data or Sign-Sign LMSThrows error — unsupportedTune StepSize empirically (start small, e.g., 0.005)
Calling maxstep() on dsp.RLSFilterFunction does not exist for RLSRLS uses ForgettingFactor, not step size
Sign-based LMS with default zero weightssign(0)=0 stalls adaptation permanentlySet InitialConditions to small nonzero values
Using adaptfilt.* (lms, nlms, rls, etc.)Entire package removed in R2020a; code will not runReplace with dsp.LMSFilter, dsp.RLSFilter, etc.

References


Copyright 2026 The MathWorks, Inc.


Files

SKILL.md

Adaptive Filtering

Implementation guideline — Use DSP System Toolbox System objects to implement adaptive filters. Do not implement manual weight-update loops.

When to Use

  • System identification — Model unknown FIR or IIR systems online

  • Noise or interference cancellation — Recover signals from noise-corrupted measurement

  • Echo cancellation — Suppress acoustic or line echo

  • Active noise control — Feedforward ANC with secondary path

  • Inverse system identification — Equalization and deconvolution

  • Adaptive prediction — Linear prediction and speech coding

  • Algorithm evaluation — Compare adaptive filter algorithm performance

  • Migrating from deprecated adaptfilt.* objects — Replaced by dsp.*Filter System objects (removed in R2020a)

  • Any task involving dsp.LMSFilter, dsp.RLSFilter, dsp.FilteredXLMSFilter, dsp.FrequencyDomainAdaptiveFilter, dsp.AffineProjectionFilter, or maxstep()

When NOT to Use

  • Static (non-adaptive) FIR/IIR filter design — Use matlab-design-digital-filter

  • Kalman filtering or state estimation — Use Control System Toolbox

  • Deep learning-based denoising — Use Deep Learning Toolbox

  • Simulink adaptive filter blocks — Use when working in Simulink (different modeling workflow)

Workflow

Every adaptive filtering task follows this five-step workflow:

1. Analyze the Problem

Before writing code, determine:

  • Topology — System identification, inverse system identification, noise cancellation, ANC, or prediction?

  • Signal characteristics — White or colored input? Stationary or time-varying?

  • Constraints — Filter length, latency budget, computational cost, real-time?

  • Filter length — Match or slightly exceed the unknown system order

2. Select Object and Method

Use the routing table to pick the right System object:

ScenarioObjectMethod/Config
General-purpose, white inputdsp.LMSFilter'Normalized LMS'
Colored/correlated inputdsp.AffineProjectionFilterProjectionOrder=4-8
Fast convergence neededdsp.RLSFilterForgettingFactor=0.99
Tracking time-varying systemdsp.RLSFilterForgettingFactor=0.95-0.99
Active noise controldsp.FilteredXLMSFilterRequires secondary path estimate
Long filters (>256 taps)dsp.FrequencyDomainAdaptiveFilter'Constrained FDAF'
Long filter + low latencydsp.FrequencyDomainAdaptiveFilter'Partitioned constrained FDAF'
Low-complexity (no multiplies)dsp.LMSFilter'Sign-Data LMS' or 'Sign-Sign LMS'

For detailed selection guidance, see references/object-selection.md.

3. Configure

Step size (critical for stability):

lms = dsp.LMSFilter(Length=L, Method="Normalized LMS");
[muMax, muMaxMSE] = maxstep(lms, x);
lms.StepSize = 0.3 * muMaxMSE;

maxstep() is available only for:

  • dsp.LMSFilter (Methods: 'LMS', 'Normalized LMS', 'Sign-Error LMS')

  • dsp.BlockLMSFilter

For all other objects, see references/maxstep-reference.md.

Filter length: Set to unknown system order + 1 (or slightly longer if order is uncertain).

4. Run in Streaming Loop

All adaptive filter System objects process data frame-by-frame:

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

In simulation, use dsp.FIRFilter or dsp.IIRFilter for the unknown system. These objects automatically maintain internal filter state across frames.

5. Verify Convergence and Extract Weights

Weight extraction differs by object and is a common source of errors:

ObjectExtraction Method
dsp.LMSFilterThird output: [y, e, w] = lms(x, d)
dsp.RLSFilterProperty: rls.Coefficients
dsp.FilteredXLMSFilterProperty: fxlms.Coefficients (negated for ANC)
dsp.FrequencyDomainAdaptiveFilterSee references/fdaf-filter.md — partitioned vs non-partitioned differ
dsp.AffineProjectionFilterProperty: ap.Coefficients

Important: dsp.LMSFilter does NOT have a .Coefficients property. The third output argument is the only way to access weights.

For full details, see references/weight-extraction.md.

Key Functions

Function/ObjectPurposeToolbox
dsp.LMSFilterLMS/NLMS/Sign variants (5 methods)DSP System Toolbox
dsp.RLSFilterRecursive Least Squares (5 methods)DSP System Toolbox
dsp.AffineProjectionFilterAffine Projection (colored input)DSP System Toolbox
dsp.FilteredXLMSFilterFiltered-X LMS (ANC)DSP System Toolbox
dsp.FrequencyDomainAdaptiveFilterFDAF (long filters, 4 methods)DSP System Toolbox
dsp.BlockLMSFilterBlock LMS (frame-based)DSP System Toolbox
dsp.AdaptiveLatticeFilterLattice (numerical stability)DSP System Toolbox
dsp.FastTransversalFilterFast transversal (O(N) RLS)DSP System Toolbox
maxstep()Maximum stable step sizeDSP System Toolbox
msesim()Simulated MSE learning curvesDSP System Toolbox

Patterns

System Identification
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
Active Noise Control (Two-Stage)
% 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);

See references/fxlms-filter.md for the full ANC workflow.

Low-Latency Long Filter (Partitioned FDAF)

Use partitioned FDAF when you need a long adaptive filter with low processing latency.

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

See references/fdaf-filter.md for method strings and FFTCoefficients extraction.

Freeze Adaptation (Stop Learning, Keep Filtering)
% 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

For dsp.FrequencyDomainAdaptiveFilter, use LockCoefficients instead. This object does not support AdaptInputPort. See references/fdaf-filter.md.

Conventions

  • Always use dsp.*Filter System objects — Never implement weight-update loops manually

  • Always call maxstep() for step size when available (LMS, NLMS, Sign-Error, BlockLMS)

  • Always use AdaptInputPort=true for freeze/adapt control — Never wrap in if/else

  • Always use dsp.FIRFilter for unknown system simulation — It maintains state across frames

  • Never access .Coefficients on dsp.LMSFilter — It doesn't exist; use third output

  • Never access .Coefficients on dsp.FrequencyDomainAdaptiveFilter — Use .FFTCoefficients + IFFT

  • Never use adaptfilt.* functions (adaptfilt.lms, adaptfilt.nlms, adaptfilt.rls, etc.) — The entire package was removed in R2020a and will error. Always use dsp.*Filter System objects.

  • Prefer 'Normalized LMS' over 'LMS' as the default method — Robust to input power variations

  • Prefer 'Constrained FDAF' over 'Unconstrained FDAF' — Prevents spectral leakage

Common Mistakes

MistakeWhy It's WrongCorrect Approach
Manual LMS loop (w = w + mu*e*x)Error-prone, no state management, no optimized C codeUse dsp.LMSFilter with the appropriate Method
Hardcoded step size without stability checkMay diverge or converge too slowlyCall maxstep() and use 30% of muMaxMSE
filter(h, 1, x) per frame without stateBreaks continuity at frame boundariesUse dsp.FIRFilter (manages state internally)
lms.CoefficientsProperty does not exist for dsp.LMSFilterUse third output: [y, e, w] = lms(x, d)
fdaf.CoefficientsProperty does not exist for FDAFUse real(ifft(fdaf.FFTCoefficients))
'Constrained FDAF' with BlockLength < LengthSilently runs but does NOT partitionMust use 'Partitioned constrained FDAF'
Standard LMS for ANC (ignoring secondary path)Diverges — gradient is misalignedUse dsp.FilteredXLMSFilter
maxstep() on Sign-Data or Sign-Sign LMSThrows error — unsupportedTune StepSize empirically (start small, e.g., 0.005)
Calling maxstep() on dsp.RLSFilterFunction does not exist for RLSRLS uses ForgettingFactor, not step size
Sign-based LMS with default zero weightssign(0)=0 stalls adaptation permanentlySet InitialConditions to small nonzero values
Using adaptfilt.* (lms, nlms, rls, etc.)Entire package removed in R2020a; code will not runReplace with dsp.LMSFilter, dsp.RLSFilter, etc.

References


Copyright 2026 The MathWorks, Inc.


Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

The author says: >=R2024b

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
MathWorks
Publisher
MathWorks (Official)
Source
matlab/matlab-agentic-toolkit · skills-catalog/signal-processing/matlab-design-adaptive-filter · commit 2a7f215
Licence
BSD 2-Clause License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE.md)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by MathWorks or MathWorks.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download matlab-design-adaptive-filter.zip