Nonrecursive Comb Filter K zm 1 a f
Non-recursive Comb Filter K z-m -1 a f = SR/m impulse response K p Ka t m samples f f -p f 180 o
Recursive Comb Filter K z-m LP b<1 impulse response K Kb Kb 2 Kb 3 -1 f/2 Kb 4 t m samples b =. 001 delay = m/SR f = SR/m f
All-pass Comb Filter -b z-m b recursive and non recursive parts cancel each other impulse response b b 2 b 3 b 4 t -b f
a f a non-recursive +1 recursive -1 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 c 29. 7 msec c 37. 1 c 41. 1 c 43. 7 decay sets reverb time 5. 0 1. 7 A A density
+ Summation of recursive comb filters should approximate a flat response + f f f = f
Problems a 1) Response is not flat f 2) Impulse response has periodicities that produce pitch percepts t periodic
Air & wall absorption filter Usually the low-pass filter inserted into the recursive comb filter is a first-order filter. Here is a secondorder filter that is more accurate. Low-frequency loss Power in d. B Frequency in Hz (linear) z-plane
simulated Comparison of simulated and actual rooms real
Early Reflections input delay buffer reverb output a input early reflections reverb t
Kendall & Martens 1984
Spatial Reverberation
Wet/Dry Mix Dry L R Reverb Wet
Implementing Delay Buffers - Queue in out
Delay Buffer out. Pos delay in. Pos out. Pos = in. Pos - delay; buffer[in. Pos] = in; out = buffer[out. Pos]
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
2 n-sized buffers implemented with masking i = (i + 1) & 511; bitwise and i 000 0 000 1 511 0 0 0 0 1 1 1 1 i 000 0 000 1
modulated delay in j buffer i out delay (i - j) is dynamic given int delay: j = i - delay; check bounds! while (j >= buffer. length) j -= buffer. length; while (j < 0) j += buffer. length;
Fractional Delay in buffer i out? inst. Delay as int. fract ~ ~ out. Pos = i - inst. Delay; j = (int) out. Pos; check bounds ~ ~ j. P 1 = j + 1; check bounds fract = out. Pos - j; How could we use the fractional delay?
Linear Interpolation Big Problem x(n) y(n) z-1 Causes amplitude modulation of high frequencies buffer(j. P 1) buffer(j) fract t out = buffer(j. P 1)*(1. 0 -fract) + buffer(j)*fract;
Big Problem? Averaging two samples is filtering (1 st-order FIR Low-pass) a fract = 0 1. 0 SR/2 fract = 0. 5 f
Allpass Interpolation x(n) y(n) 1 -fract z-1 1 -fract Good for delay modulation that causes relatively small pitch changes
- Slides: 25