Magic IIR Biquad - testing
Posted: Thu Feb 20, 2020 4:32 pm
I am attaching a .fsm containing a "magic" IIR Biquad, F modulatable and Q modulatable, not requiring trigonometrics.
I discovered it inside a .fsm recently published by Martin Vicanek, nested into a hierarchical tree that's implementing a (supposedly) phase-synchronous 6-band frequency splitter. The examination of the x86 SSE code of the many IIR LP and HP Biquads revealed a surprise. The LP and HP variants are 99% identical. Their common x86 SSE code (from where it comes, who authored it, I ignore) is always computing the LP signal, the BP signal, and the HP signal, at very little CPU% expense, the code being so compact. Consequently, originally, the only difference between the LP and the HP variant, was the output pin assignation, as there was only one, LP or HP.
If I remember, Martin Vicanek had a difficulty in generating the AP (allpass) that was required for guaranteeing the phase synchronicity, this in the context of a multi Linkwitz-Riley arrangement.
A few days ago, I modded such magic IIR Biquad for transforming it into a "universal" IIR Biquad that's outputting the three fundamental signals: LP, BP and HP. Kind of audio prism. This way one can explore what's happening after externally mixing the LP, BP and HP outputs in various proportions between (-1.0 and +1.0). In case you've never done this, start now. The attached .fsm will help you. This is very rewarding.
Unfortunately, the magic IIR Biquad looks like it got published, not yet mature. I am saying this because the summation of its three outputs doesn't deliver unity.
Consequently, such "magic" IIR Biquad is not yet a recommendable building block. It may ruin an entire project. Let me tell the details. The output phases are incorrect, the Fr control must be a fraction of Fs/2 (like the Flowstone sine generator component) instead of a more easy to remember fraction of Fs, and the BP output is "constant skirt" which means it provides gain at high Q, which means it can easily saturate the hardware, and, most important, it prevents the LP + BP + LP summation to deliver unity.
I have not checked what's happening when specifying Q = zero.
I don't know if it crashes, then. I don't know it it gently folds back to a 1st order, then.
I think the time has come for me to learn the basics of x86 SSE coding. The required mods are probably trivial for somebody accustomed to modding a x86 SSE routine. Can somebody please show and explain, step by step, the mods that are required, always remaining cautious about denorm and other possible traps?
Much appreciated, would be that when the supplied Q value is below 0.1, that the magic Biquad folds back to a 1st order, the BP output becoming muted.
But wait a minute, one must ensure that such behavior never can trigger a denorm issue.
Therefore, please tell what is the more effective strategy, speaking of x86 SSE modules, for never triggering a denorm issue inside, and never triggering a denorm issue in the following modules.
Have a nice day.
I discovered it inside a .fsm recently published by Martin Vicanek, nested into a hierarchical tree that's implementing a (supposedly) phase-synchronous 6-band frequency splitter. The examination of the x86 SSE code of the many IIR LP and HP Biquads revealed a surprise. The LP and HP variants are 99% identical. Their common x86 SSE code (from where it comes, who authored it, I ignore) is always computing the LP signal, the BP signal, and the HP signal, at very little CPU% expense, the code being so compact. Consequently, originally, the only difference between the LP and the HP variant, was the output pin assignation, as there was only one, LP or HP.
If I remember, Martin Vicanek had a difficulty in generating the AP (allpass) that was required for guaranteeing the phase synchronicity, this in the context of a multi Linkwitz-Riley arrangement.
A few days ago, I modded such magic IIR Biquad for transforming it into a "universal" IIR Biquad that's outputting the three fundamental signals: LP, BP and HP. Kind of audio prism. This way one can explore what's happening after externally mixing the LP, BP and HP outputs in various proportions between (-1.0 and +1.0). In case you've never done this, start now. The attached .fsm will help you. This is very rewarding.
Unfortunately, the magic IIR Biquad looks like it got published, not yet mature. I am saying this because the summation of its three outputs doesn't deliver unity.
Consequently, such "magic" IIR Biquad is not yet a recommendable building block. It may ruin an entire project. Let me tell the details. The output phases are incorrect, the Fr control must be a fraction of Fs/2 (like the Flowstone sine generator component) instead of a more easy to remember fraction of Fs, and the BP output is "constant skirt" which means it provides gain at high Q, which means it can easily saturate the hardware, and, most important, it prevents the LP + BP + LP summation to deliver unity.
I have not checked what's happening when specifying Q = zero.
I don't know if it crashes, then. I don't know it it gently folds back to a 1st order, then.
I think the time has come for me to learn the basics of x86 SSE coding. The required mods are probably trivial for somebody accustomed to modding a x86 SSE routine. Can somebody please show and explain, step by step, the mods that are required, always remaining cautious about denorm and other possible traps?
Much appreciated, would be that when the supplied Q value is below 0.1, that the magic Biquad folds back to a 1st order, the BP output becoming muted.
But wait a minute, one must ensure that such behavior never can trigger a denorm issue.
Therefore, please tell what is the more effective strategy, speaking of x86 SSE modules, for never triggering a denorm issue inside, and never triggering a denorm issue in the following modules.
Have a nice day.