Reference-free periodic ANC

Feedback ANC reconstructs its own reference from the error microphone.

This controller removes the dedicated reference microphone and estimates the disturbance reference from the measured error and the secondary-path model. That makes it attractive when a reference sensor is unavailable, but it also limits the algorithm to situations where the disturbance is predictable enough for the reconstruction to remain meaningful.

Core Equation

The reconstructed reference is:

\[x(n) = e(n) - \sum_{i=0}^{M-1} c_i y(n-i)\]

That estimate then drives an FXLMS-style adaptive loop. The controller therefore inherits many of the same step-size and secondary-path sensitivities as FXLMS, with the added challenge that its reference is now estimated rather than measured directly.

Benchmark Interpretation

The benchmark suite shows feedback ANC producing a useful but modest attenuation result on a drifting periodic scenario. That fits the theory: the method is workable when the disturbance is predictable, but it is not a substitute for a clean causal reference channel in broadband feedforward ANC.

Where it fits

Feedback ANC fills a practical niche. It is not a broadly superior controller; it is what you reach for when sensor placement or hardware constraints remove the normal reference microphone path.

Tuning Notes

Using It From C++

#include "anc/feedback_anc_controller.h"

anc::FeedbackAncConfig config;
config.controllerOrder = 48;
config.secondaryEstimate = {0.0, 0.12, 0.38, 0.21, -0.05};
config.stepSize = 0.02;
config.leakage = 0.999;

anc::FeedbackAncController controller(config);

for (double errorMeasurement : errorSignal) {
  const double control = controller.synthesize(errorMeasurement);
  sendToActuator(control);
  controller.adapt(errorMeasurement);
}

CLI Reproduction

build\Debug\anc_cli.exe `
  --algorithm feedback-fxlms `
  --summary analysis_output\raw\feedback_fxlms_drifting_periodic_summary.csv `
  --timeseries analysis_output\raw\feedback_fxlms_drifting_periodic_timeseries.csv `
  --period-samples 64 `
  --delay-samples 1 `
  --step-size 0.02 `
  --leakage 0.999