BASS MANAGEMENT PART 2: Virtual Bass Array
Dr. Uli posted a description of how to create a VBA a few years ago:
link. There are more resources including
@René - Acculution.com thread on ASR
here,
@Tim Link thread on ASR
here, and
@OCA video here:
I thought it sounded insanely cool. Cancelling bass reflections with a delayed and inverted signal should not only smooth out bass response in the MLP, it should also smooth out response around the room and reduce bass ringing. To my knowledge, the idea first surfaced in a German forum in the early noughties as a double bass array, before they realized you could do it with a single bank of subwoofers.
The problem is working out the delay and the attenuation, because it can not be measured with signal. You have to measure with tape measure, then work out the delay using the speed of sound. There is absolutely no way to measure the attenuation required, so you start with a guess, and then you adjust the attenuation until the measured bass response looks good.
I attempted creating the VBA via two methods, which I will describe. Of course I did not invent these methods (in fact, I don't know who did). I can credit whom I learnt it from, but I don't know if they invented those methods either.
Method 1: Room Geometry
(Yes I know my room is not a perfect box, there are avenues for bass to escape in the lower right. But let us assume for the moment that it behaves like a box for modelling purposes).
-
C: The first step find the delay between the subwoofer to the tweeter plane. This is because there are two types of delays introduced by the subwoofer, (1) time of flight from subwoofer to tweeter plane, and (2) propagation delay through the DSP. The former can be accounted for by distance measurements, but the latter needs to be measured using signals. I measure this delay using Acourate's time alignment method which I will discuss later. When I measured my subwoofer delay, it was 200 samples at 48kHz for the left sub, and 220 samples for the right sub. You can convert this to time if you wish, but I prefer to leave them as samples because they will be converted back to samples later.
-
A: Now that we have aligned the subwoofer to the tweeter plane, we can assume that the subs are at the location of the tweeters. The "subwoofer" produces a wavefront which travels to the back wall, reflects, and arrives at the MLP. We therefore need to measure distance from sub to rear wall, and rear wall to MLP. In my room, these distances are 5m and 1.8m respectively, or 6.8m in total. Convert this into time, 6.8/343*1000 = 19.83ms.
-
B: now we want the cancellation signal to launch and arrive at the MLP at the same time the first reflection arrives, so we measure distance from the sub to the MLP. In my room, this is 4.2m, or 12.24ms.
- the delay required is (A - B) + C, so (19.83 - 12.24) + C = 7.59 + C. To convert this into samples at 48kHz, it is (7.59 * 48) or 364 samples. We have determined separately that C = 200 samples for the left sub, and 220 samples for the right sub.
Now we have the delay worked out, we go to Acourate.
1. Generate-Crossover, Butterworth, 150Hz, 4th order (I only want to correct to 150Hz). Load XO1L/R into curves 1 and 2.
2. Apply to both XO1L/R TD-Functions - Phase Extraction, MinPhase, start 20, end 400, result into curves 3 and 4.
3. Now we apply the delays and attenuation, and invert the sub so that it generates a cancellation frequency. Uli recommends a starting attenuation of 0.7, so that's what I went with. Modify the MinPhase curves (3 and 4) as follows:
- LEFT: 364 + 200 = 564 samples. Rotate +564 samples, Gain factor 0.7, TD-Functions Change Polarity
- RIGHT: 364 + 220 = 584 samples. Rotate +584 samples, Gain factor 0.7, TD-Functions Change Polarity
*** NOTE if you have already baked the time alignment into your subwoofer XO, as I have, DO NOT add additional delays for the sub! Only rotate by the estimated room delays!
4. Clear curves 1 and 2. Now create the initial Dirac pulse: Generate-Testfilter, Samplerate 65536, sample 0, length 1 into Curves 1 and 2.
5. Add Curves 1 + 3, and 2 + 4 into 5 and 6. Save Curve 5 as "PreVBAL" and Curve 6 as "PreVBAR". This is what you should see:
6. As a quick check, load up one of your MLP full frequency sweeps and check if it is a good match:
Here the left VBA (in red) is compared to the left sub/speaker (in brown). If done correctly, the peaks should match the dips. You can see that this VBA is a reasonable match. Of course, it won't match
every peak and dip, because we have only accounted for length reflections, and not any of the other modes.
7. When you do your DRC step using Acourate's room macros, load PreVBAL/R into Room macro 0 as prefilters. Then proceed as normal.
8. Perform verification measurements. It is likely that adjustment will be required. So go back to step 1 and repeat the whole exercise trying different attenuation (I settled on 0.5). It took me days to get it right with multiple rinse-and-repeat cycles.