I have a bank of 12 bandpass filters (biquads) that I use for spectral modelling.

Each filter is centered around a specific "mode" frequency, and has its own resonance.

Until now I have implemeted this filterbank in parallel structure, i.e. by summing the output of each filter aplied to the same input. I also normalize the gain of the filters to restrain the output range.

However, to make proper use of the Cortex M4 CMSIS-DSP functions and thus improve (I hope) the performance of my code, I would like to try and make the filterbank in a cascaded structure. I have tried on Matlab to directly change the structure without changing the coefficients, but the sound is not the same at all and the output range isn't normalized at all.

Is there an easy way of converting the coefficients of each biquad from the parallel form to the cascade form?

Additional info :

Here is how I calculate my coefficients :

$$ \begin{split} ff0 &= \sqrt{\frac{1-R^2}{2}}\\ ff1 &= 0\\ ff2 &= -\sqrt{\frac{1-R^2}{2}}\\ \\ fb1 &= -2\times R \times cos(\omega) \\ fb2 &= R^2\\ \end{split} $$

Where $R$ is the resonance of my filters and $\omega$ is the frequency-normalized pseudo-pulsation.

In Matlab, the main loop for filtering the input is :

for i = 1:length(fc)
    out = out + filter(ff(:,i), fb(:,i), in); % Parallel
    outCasc = filter(ff(:,i), fb(:,i), outCasc); % Cascade

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.