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
- Treat the secondary-path estimate as essential, because reference reconstruction depends on it directly.
- Keep expectations narrow: periodic and near-periodic sources are the right target class.
- If a usable reference microphone exists, ordinary feedforward FXLMS-family methods are usually easier to stabilize and interpret.
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