Implementation of high resolution perfect reconstruction filter banks

Hello everyone,

I’m working on my first audio plugin with Juce for a project which requires spectral weighting (comparable to a vocoder). My questions are rather of theoratical nature then about programming praxis. To perform spectral weighting, I want to implement and compare different types of filter banks with (near) perfect reconstruction. The resolution should be approximately 1/3 octave per band. My first approach was the implementation of a Linkwitz-Riley filter bank, which already works fairly good at the given frequency resolution. I calculate squared butterworth coefficients of even order for all crossovers by using the bilinear transform, where each pair of low pass and high pass should sum up to an all pass. The obtained IIR filters are used to split the signal into the desired frequency bands. At each crossover, it is necessary to apply the sums of all previous crossovers (= all passes) to ensure that the single band signals will remain in phase.
While in the analog case, the perfect reconstruction property holds, it seems, that the digital implementation is mathematically slightly different. For some bandwidths, the summed magnitude response is almost constantly one, which implies near perfect reconstruction. For other bandwidths, there are unacceptable cancellations at certain crossovers and the magnitude response is not constant at all. My first question is related to that problem:
(1) Why is it difficult to program a high resolution Linkwitz-Riley filter bank with the near perfect reconstruction property? I would suspect the phase of beeing problematic in some way. Maybe, it has to do with the frequency warping wich occurs while performing the bilinear transform? The magnitude errors tend to be larger with lower filter orders (at constant bandwidths).

Since I don’t want to be too narrow-minded, I’d like to try some different approaches. The fact, that there are lots of plugins with good performing filter banks implies, that there must be other efficient methods for band splitting. I’m currently looking at the implementation of zero-phase FIR filters as one possible alternative. Hence, my second question:
(2) Could someone recommend me other techniques for implementing such filter banks? Maybe someone can give me a hint, which solutions are beeing preferred for commercial purposes?

I hope, that these questions belong here since they are not directly related to Juce. I’ll appreciate any help!

Do you use cascaded SOS? If not, I can imagine that the floating point resolution isn’t high enough for higher order IIR filters. I’ve never noticed non-perfect magnitudes of a Linkwitz-Riley filterbank in one of our plug-ins, we simply cascaded two second order butterworth low-pass filters to get on of the LR-filters, so no design using bilinear transformation.

In case it helps:
That’s a multi-band compressor for Ambisonics, using a four band filterbank with LR crossovers. You can activate displaying the overall magnitude, in no combination of crossover frequencies the overall magnitude breaks, well at least with all combinations I’ve tried :wink:

Thank you for your reply! Yes, I use cascaded SOS. I take pairs of complex conjugated Butterworth poles to obtain second order filters with real coefficients. And I do all the coefficient calculations with long doubles to be maximally safe, at the moment.
The problem only occurs, when the amount of bands exceeds a value of ~10 bands (depending on the filter order).
I’ll have a look at your link, it should be helpfull to study another implementations!