250 likes | 270 Views
Learn about Manfred Schroeder's Reverberator, comb filter types, impulse response, delay buffers, early reflections, and more in audio processing technologies.
E N D
-1 f f = SR/m Non-recursive Comb Filter a K z-m impulse response K p Ka t f f m samples -p 180o
Recursive Comb Filter K z-m LP b < 1 -1 impulse response f/2 K Kb Kb2 Kb3 Kb4 t f b = .001 m samples f = SR/m delay = m/SR
-b z-m b All-pass Comb Filter recursive and non recursive parts cancel each other impulse response b b2 b3 b4 t f -b
a f non-recursive recursive +1 recursive -1 a f
Manfred Schroeder Reverberator decay density
Manfred Schroeder Reverberator (decay) Allpass recursive comb (density) Block diagram of a single channel (monophonic) reverberator Block diagram of the sampled data system simulated on the digital computer
Schroeder Reverberator 29.7 msec c 37.1 c 5.0 1.7 A A 41.1 c density 43.7 c decay sets reverb time
f + Summation of recursive comb filters should approximate a flat response f + f = f
Problems a 1) Response is not flat f 2) t Impulse response has periodicities that produce pitch percepts periodic
Air & wall absorption filter z-plane Usually the low-pass filter inserted into the recursive comb filter is a first-order filter. Here is a second-order filter that is more accurate. Low-frequency loss Power in dB Frequency in Hz (linear)
simulated Comparison of simulated and actual rooms real
Early Reflections input delay buffer reverb output input early reflections a reverb t
Kendall & Martens 1984
Wet/Dry Mix Dry L R Reverb Wet
Implementing Delay Buffers - Queue in out in out
Delay Buffer outPos delay inPos outPos = inPos - delay; buffer[inPos] = in; out = buffer[outPos]
in i j out buffer(i) = in; out = buffer(j); if(++i >=buffer.length) i = 0; if(++j >=buffer.length) j = 0;
in buffer j i out buffer length is larger than needed delay is i - j
2n-sized buffers implemented with masking i = (i + 1) & 511; bitwise and i 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 511 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 i 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
modulated delay in buffer j i out delay (i - j) is dynamic given int delay: j = i - delay; while (j >= buffer.length) j -= buffer.length; while (j < 0) j += buffer.length; check bounds! check bounds!
Fractional Delay in buffer i instDelay as int.fract out? outPos = i - instDelay; j = (int) outPos; jP1 = j + 1; fract = outPos - j; ~ check bounds ~ ~ check bounds ~ How could we use the fractional delay?
Linear Interpolation Big Problem x(n) y(n) z-1 Causes amplitude modulation of high frequencies buffer(jP1) buffer(j) fract t out = buffer(jP1)*(1.0-fract) + buffer(j)*fract;
Big Problem? Averaging two samples is filtering (1st-order FIR Low-pass) a fract = 0 1.0 f SR/2 fract = 0.5
z-1 Allpass Interpolation x(n) y(n) 1-fract z-1 1-fract Good for delay modulation that causes relatively small pitch changes