I am working on real-time implementation of spring reverb based on scientific paper called Parametric Spring Reverberation Effect by Välimäki, Vesa; Parker, Julian; Abel, Jonathan S.

One block of this effect is a cascade of $100$ stretched all-pass filters. Single stretched all-pass filter is defined by: $$ A_{\rm low}(z) = \displaystyle\frac{a_1 + A_{\rm fd}(z)z^{-K_1}}{1 + a_1A_{\rm fd}(z)z^{-K_1}}=\displaystyle \frac{a_1 + \displaystyle\frac{a_2+z^{-1}}{1+a_2z^{-1}}z^{-K_1}}{1 + a_1\displaystyle\frac{a_2+z^{-1}}{1+a_2z^{-1}}z^{-K_1}} $$ I calculated the difference equation of this filter:

$$ y(n)=a_1x(n)+a_1a_2x(n-1)+a_2x(n-K_1)+x(n-1-K_1)-a_2y(n-1)-a_1a_2y(n-K_1)-a_1y(n-1-K_1) $$

and used it for implementing the cascade of $M = 100$ stretched all-pass filters in MATLAB.

for i = 1:M
    for n = 1+K1+1:(length(x))
        y(n) = a1 * x(n) + a1*a2 * x(n-1) + a2 * x(n-K1) + ...
            x(n-1-K1) - a2 * y(n-1) - a1*a2 * y(n-K1) - a1 * y(n-1-K1);           
    x = y;

However, the problem seems to be that I need to add another filters to the structure which are not cascaded (as you can see in the following block diagram), therefore they cannot be "repeated" like the all-pass filter.

One part of the spring reverb structure

How can I calculate the output of my all-pass filter cascade sample-by-sample?

I can imagine the multiplication of two or three transfer functions in order to obtain the transfer function of the whole cascade, but multiplying $100$ transfer functions seems to be a crazy and wrong idea. There is probably a simple solution, but I just couldn't figure anything out. That's why I am asking you for help.


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.