1
$\begingroup$

I am currently building a Reverb that needs to fit on a DSP. I am using the model proposed in this link https://ccrma.stanford.edu/~jos/pasp/Freeverb.html.

It involved to create some Feedback Comb-Filters with high orders (more than 1000). For that I use a 2nd-order section IIR filter (IIRSOS) integrated in my DSP. I am using the Matlab function "tf2sos" that takes numerator and denominator of the Transfer Function (TF) of the desire filter and create a matrix of Second Order Section (SOS) coefficient. With this coefficients, I can make what I want.

Problem : for high filter orders (arround order 200) the "tf2sos" function appears to be totally unstable. However the Matlab object called dsp.IIRFilter that use also 2nd-order section IIR seems to handle it :

Impulse response for order = 200 : Impulse response for order = 200 Impulse response for order = 1500 : Impulse response for order = 1500

On the 2nd picture you can see that the filter with the tf2sos coefficients is going totally wrong. Does someone knows how I can get a functional coefficient matrix for orders like 1500 ?

Thank you.

$\endgroup$
  • $\begingroup$ Hello. I'm not sure it makes sens to decompose this filter structure in to biquads, it is rather over complicating things. If you take the difference equation of the filter you'll see it's actually very simple to implement directly in code. and will use significantly less calculations than implementing it as biquads. $\endgroup$ – kippertoffee Aug 23 '18 at 8:22
  • $\begingroup$ Hello kippertoffee, make a single filter to design this is impossible because more the order is high more the filter is unstable. I use this kind of filter to avoid this problem, but the main problem is why the transaltion of the transfer function become unstable. $\endgroup$ – remi Aug 23 '18 at 8:59
  • $\begingroup$ The transfer function must look like something with this coefficient : numerator = [1 -0.9]; denominator = [1 zeros(1, 1000) -0.7]; $\endgroup$ – remi Aug 23 '18 at 9:04
  • $\begingroup$ I get that is the general theory, but surely if you just have one feedback coefficient, if that coefficient is < +/-1 then the filter cannot become unstable. $\endgroup$ – kippertoffee Aug 23 '18 at 10:08
  • $\begingroup$ @remi I agree with kippertoffee: You're taking something extremely easy – single tap IIRs (that's what a FBCF is) – and converting it to something with many different taps. That doesn't sound clever – your FBCF is stable unless it's not. $\endgroup$ – Marcus Müller Aug 23 '18 at 12:35
3
$\begingroup$

The Schroeder/Moore implementation uses sparse IIR filters. It's extremely inefficient to implement these as regular IIR filters or biqauds.

It's much easier and more efficient to implement these directly. See for example https://ccrma.stanford.edu/~jos/pasp/Schroeder_Allpass_Sections.html

Both the comb filter and the schroeder allpass use the same structure as a regular IIR filter, but the delay(s) are not a single sample but much larger number. So the Schroeder allpass looks like any other 1rst order allpass except that the delay in there is big. If you want get technical about this

The algorithm was specifically designed to be computational efficient, hence it makes no sense using standard biquads. On the downside, it typically doesn't sound very good. Feedback delay networks tend to sound a lot better.

$\endgroup$

Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.