Feedback-aware feedforward

FBFXLMS reconstructs a cleaner reference before applying the FXLMS update.

When the canceling actuator leaks back into the reference microphone, the measured reference no longer represents the upstream disturbance cleanly. FBFXLMS models that feedback path and subtracts it online so the controller can keep adapting on a less contaminated signal.

Core Equations

The feedback-free reference estimate is:

\[x(n) = u(n) - \sum_{j=0}^{L-1} d_j y(n-j)\]

where $u(n)$ is the contaminated microphone measurement and $D(z)$ models the actuator-to-reference feedback path. Once reconstructed, the controller follows the same output and update pattern as FXLMS.

Benchmark Interpretation

In the benchmark suite, FBFXLMS lands near Leaky FXLMS in the primary summary. The important point is not the exact dB number. The important point is that the algorithm remains viable in situations where ordinary FXLMS would adapt on the wrong reference signal entirely.

Residual tail

The time-series view makes it easier to inspect whether the residual settles cleanly after feedback compensation.

FBFXLMS residual tail plot.

Feedback-strength sweep

The sweep indicates that a well-modeled feedback path matters more than the raw feedback scale itself in the documented scenarios.

FBFXLMS feedback sweep plot.

Tuning Notes

Using It From C++

#include "anc/fbfxlms_controller.h"

anc::FbFxlmsConfig config;
config.controllerOrder = 48;
config.secondaryEstimate = {0.0, 0.12, 0.38, 0.21, -0.05};
config.feedbackEstimate = {0.0, 0.03, 0.09, 0.04};
config.stepSize = 0.005;
config.leakage = 0.999;

anc::FbFxlmsController controller(config);

for (double contaminatedReference : referenceMic) {
  const double control = controller.synthesize(contaminatedReference);
  const double error = errorSensor(control);
  controller.adapt(error);
}

Call feedbackFreeReference() when you want to inspect the reconstructed signal and verify that feedback suppression is behaving as expected.

CLI Reproduction

build\Debug\anc_cli.exe `
  --algorithm fbfxlms `
  --summary analysis_output\raw\fbfxlms_broadband_feedback_summary.csv `
  --timeseries analysis_output\raw\fbfxlms_broadband_feedback_timeseries.csv `
  --samples 12000 `
  --controller-order 48 `
  --step-size 0.005 `
  --feedback-scale 1.0