1

When I used a simple FDN(Feedback Delay Network) to generate an impulse response, it sounded like a vibrate sound, and using FDN to process the pop music also had a distinctly unnatural and empty room feel. My code:

function y = fdn4(x)
    gain=[0.90 0.88 0.86 0.84];
    a = [0, 1, 1, 0; -1, 0, 0, -1; 1, 0, 0, -1; 0, 1, -1, 0]/1.414;
    b = [1 1 1 1] *1;
    c = [1 1 1 1] * 0.75;
    m=[743,1061,1297,1657];%1.25s

    y = zeros(size(x));
    mm = 2^nextpow2(max(m));
    z1 = zeros(1, mm);
    z2 = z1; z3 = z1; z4 = z1;

 for n = 1:length(y)
    tmp = [z1(m(1)) z2(m(2)) z3(m(3)) z4(m(4))];
    y(n) = c(1) * tmp(1) + c(2) * tmp(2) ...
        + c(3) * tmp(3) + c(4) * tmp(4) ;
    z1 = [(x(n) * b(1) + tmp * a(1, :).' * gain(1)), z1(1:m(1) - 1)];
    z2 = [(x(n) * b(2) + tmp * a(2, :).' * gain(2)), z2(1:m(2) - 1)];
    z3 = [(x(n) * b(3) + tmp * a(3, :).' * gain(3)), z3(1:m(3) - 1)];
    z4 = [(x(n) * b(4) + tmp * a(4, :).' * gain(4)), z4(1:m(4) - 1)];
    
 end
y=y.';

end

Is there a method to optimize FDN with a lower computation amount,so that it can sound more natural.

1 Answers1

0

Is there a method to optimize FDN with a lower computation amount,so that it can sound more natural.

Sure, but it's a fair bit of work and requires careful tuning. A few pointers

  1. Your feedback matrix isn't dense enough. There should be no zeros in there.
  2. There is no spectral shaping into your delay lines. Natural reverbs have almost always lower reverb times are higher frequencies.
  3. Your implementation is very inefficient. Delay lines can be implemented much more efficiently with circular addressing (instead of copying data). Frame based processing can also speed things up a lot
  4. Consider adding some discrete early reflections
Hilmar
  • 29,048
  • 1
  • 21
  • 45
  • Thank you very much for your answer. For the first two points, I am experimenting with time-varying feedback moments and reasonable low-pass filters. The last two points have been optimized and improved. – Daniel Zhao Feb 22 '22 at 03:22