I was messing around with my approach of bandsplitting the input (borrowed from Nathan, who also said this method is not 100% accurate). Here is how I tested, the difference is small, maybe be even negligible.
(
f = {
var sigIn = WhiteNoise.ar(); // full scale signal
var freqs = [5000, 2000, 500, 150];
var sigs = [sigIn] ++ freqs.collect{|n, i| LPF.ar(LPF.ar(sigIn, n), n) };
// sigs contain sigIn plus sigIn lowpassed at 5000, 2000, 500, 150 Hz;
var bands = (freqs.size.collect{|i| sigs[i] - sigs[i + 1] } ++ [sigs.last]);
// subtracting bands to get [5000-upperHzLim of SR, 2000-5000 hz, 500-2000 hz, 150-500 hz, plus the lowpassed at 150 Hz sig]
bands.sum - sigIn; // difference of the original signal and the sum the bands
};
f.plot(0.1)
)
c = f.asBuffer(0.1, action: {|buf| buf.loadToFloatArray(action: {|fa| fa.maxItem.debug(\maxDifference) })});
// Max Difference approx 1.19e-07