Virtual Bass Array

User avatar
UliBru
Posts: 468
Joined: 19 Oct 2019 13:58

Virtual Bass Array

Post by UliBru » 16 Jan 2020 10:16

This is a copy of the VBA discussion at the previous Yahoo forum.

Actually it is a bit quiet here in the forum. So I like to report about a discussion in a German forum where I have written a series of messages about the "virtual bass array".

You may know already about the principles of a double bass array with speakers in the front as usual plus some speakers at the rear wall to compensate the longitudinal room modes.

The idea has been to discuss a solution without such rear speakers and to compensate the echoes along the longitudinal axis by the main speaker itself.

So I also like to report here about the virtual bass array.

The result and the way to get it should be interesting for all Acourate users. BTW it also shows that you can do much more with Acourate than just follow the given macros.

I will show the procedure step by step. You should be able to do the same by yourself.

First some theory about a system with assumed ideal behaviour:
A speaker is positioned at the frontwall with zero distance. It sends a perfect Dirac signal. The soundwave moves to the back wall (behind a listener, the listener is not discussed here) and is reflected there. Some energy is lost, thus the reflection level is reduced by a factor x. Now the reflectied soundwave moves to the front wall and is also reflected there with some enery loss by a factor x.

So we get an echo after a time t = 2 * room length(speed of sound. The echo can be considered as a new played sound by the speaker. The next echo cycle starts.

As a result we will get a sequence built of the original Dirac pulse and the following echoes (with descending amplitudes).

Image

You can design such a pulse response by Generate - Testsignal - Length 65536, Set to one @ sample 0, length 1. Copy the pulse with Ctrl-C to the other curves 2-6. Lower the amplitude of the pulses accordingly with TD-Functions - Gain (here 0.7 with power of 1, 2, 3 ...), rotate the pulses to right direction by TD-Functions - Rotate with a number of samples according to the echo time. The sum of the single pulses taken by TD-Functions - Add will lead to the shown result.

Of course we are not happy with the frequency response. We like to have a horizontal flat and smooth frequency response. So we need a filter with an inverse response. In this case the responses of the echo signal and the filter will add to zero (filtering in time domain = convolution, filtering in frequency domain = multiplication, filtering in logarithmic frequency doamin = addition).

The echo signal is a minimum phase signal. The inverse of a minphase signl is also minphase. So we can simply apply the Acourate function FD-Functions - Amplitude Inversion minphase and we will get the next result.

Image

The inverse frequency response is as expected. But more interesting is now the time domain behaviour of the filter. It also consists of the first Dirac pulse followed by another negative Dirac pulse with amplitude 0.7 ! The distance is exactly the given echo time. What does this mean?

It means that we compensate all the echoes by playing the music first in its original format (see first Dirac pulse part) and by playing (exactly at the time of the first echo reflected from the front wall) the music signal with reduced gain and inverted polarity. In ideal case the compensation signal will cancel the echo perfectly and there will be no further echo anymore.

Our front speakers play the role of a virtual bass array. We do not need a second system (with a DBA system we have another speaker at the rear wall. It will compensate the echo of the rear wall, thus the soundwave will travel only one time through the room).

Further thoughts:

The inverted frequency response of the filter exceeds 0 dB. We have to consider that the compensation signal plus the original signal will exceed 0 dBFS (full scale). To avoid clipping the filter gain has to be lowered accordingly. This is the price to be paid. Of course the following amplifier may correct it.

In our example we have designed a FIR filter. A very simple one. It is also possible to send the music signal through a delay, to invert it and to add it to the original music signal. So no FIR filter is required, a stupid DSP may do it. The disdvantages of such a solution will be discussed later.

We have taken an ideal example. Beside the gain reduction in reality the echoes will have their own frequency response, the room will act as a filter to the echoes (think about absorption and diffusion).
In fact we complain about the usual boost of the lower frequencies. The task is to get rid of the room modes in the lower frequency range. So we must do a bit more and I will write about in a next message.

It is also interesting that the echo cancellation will also work in case of a distance between front speaker and front wall. You may prove by yourself, that the echo path is always the double room length.
As the echo path is constant we can apply the echo cancellation. It is not possible e.g. for sidewall reflections.

We have learnt in part 1 that it is possible to compensate an echo by a compensation pulse response. So here I like to describe the way from theory to practice.

What we do not really know is how the echo looks like in reality. We do not know the damping factor and especieally we do not know the pulse response of the echo/echoes and the frequency response/s. It will be very difficult to predict the shape of the echo signal after several reflections. And we must be aware that it is difficult too to measure the echos separately. In our usual rooms the echo is already there before a first cycle of a low frequency has taken place. With a frequency of 20 Hz the echo signal has crossed the room several times with one cycle time of 50 ms.
Ok, but we can still proceed and shoot a bit in the dark.

In a first test a measurement of an uncorrected system has been taken. The length of the room is 4.74 m, at least one know data.
So we like to design an echo filter. The start of the filter is clear, it is a Dirac pulse. It takes cre for a 1:1 playback of the music.

Image

The pulse response starts at sample 0 with amplitude 1, all other values are 0.
In a first approach we are not interested in frequencies above 150 Hz. This selection is arbitrary, you may play with other values.
So we create a lowpass filter by a rough assuption that the echo signal behaves like such a lowpass. With Acourate Generate - Crossover - Butterworth - 150 Hz and 4th order we can quickly create it. The we compute the minimum phase by TD-Functions - Phase Extraction - minphase because we expect the echo to react causal. Thus there we do not expect any pre-ringing.

Image

Thus we have got a pulse response. Please note the amplitude scale left of the plot. Yep, the amplitude it really very small compared to the Dirac pulse with amplitude 1.

Now the lowpass filter has to be delayed. For small delays we can simply use the rotate function in Acourate. Vut how many samples? So we calculate:

4.74 m * 2 = 9.48 m double room length divided by 340 m/s speed of sound = 27,88 ms = 1338 samples (@ 48 kHz samplerate). We have to subtract the peak position of the lowpass pulse, in this case 167 samples. So we rotate the pulse by TD-Functions - Rotate with 1171 samples to bring the pulse peak to position 1338. Furthermore we apply TD-Functions - Gain - factor 0.7 to simulate a damped echo (I'll later explain this factor). The operations result in:

Image

As we need a pulse with opposite sign (see part 1) we apply TD-Function - Change Polarity.

Image

Finally we can ad the Dirac pulse and the prepared lowpass pulse by TD-Function - Add and get

Image

The resulting filter has the desired pulse response and it shows a frequency response as shown in the next picture

Image

We are ready with a first echo compensation filter, the design is quite simple.

Virtual Bass Array, part 2 has described an approach to cancel the echo along the longitudinal axis in the listening room. Now it has to be approved in practice. The described properties should be detectable also in a measurement.

So here is a measurement taken in the example room of 4.74 m length:

Image

The picture shows the already known frequenc response of the echo compensation pulse together with the frequency response of the room (up to 300 Hz). Especially the resonance peak at about 36 Hz can be immediately seen, the compensation has a corresponding dip. Great, it fits together.

For higher harmonics there are deviations. With a high probability it is possible, that our compensation pulse is not optimal. We do not know the real behaviour of the echo signal. But also we have to keep in mind that the measurement includes influences of other room modes and reflections.

We can simulate the compensation by convolving the measurement and the compensation pulse, TD-Functions - Convolution

Image

At 36 Hz the resulting amplitude is lowered by about 10 dB, this is pretty much. BTW, the previously described damping factor 0.7 has been found by the simulation. A greater factor results in a dip in the frequency response. A smaller factor causes a remaining peak. Now the curve is quite smooth (still a big bass boost due to another reason). In the 50 to 60 Hz range a dip is boosted y the compensation.

How does it sound? A music file has been prep'd with the compensation pulse. There is a bass drum that shows a big bass boost in uncorrected playback. I'm sure you can imagine. Now just with the simple echo cancellation the bass drum sounds dry and precise. So the virtual bass array works.

Of course we must expect playback colorations (btw we must also expect this by a DBA approach). And of course I recommend an overall room correction on top of the virtual bass array. This means to use the compensation pulse as a prefilter and to convolve it with a room correction filter to get a final correction. The prefilter is quite stable and it may assist in getting a more stable correction.

Anyway we have learnt a bit more about acoustics and about the functions of Acourate.

Happy tweaking
Stay well tuned
Uli

Moderator
Acourate system: JRiver/Roon -> AcourateConvolver -> miniDSP U-DIO8 -> TacT M/S2150 amps -> DIY horn speakers
PeterB
Posts: 8
Joined: 17 Nov 2019 19:52

Re: Virtual Bass Array

Post by PeterB » 24 Jan 2020 21:30

Hello Uli,

I could follow the steps up to the creation of the echo compensation filter for my room. I also could convolve the filter with the measurement of my room at my listening position, to see the result.

Now I'm not shure how to proceed. My setup: a subwoover and active 3-way speakers. With Acourate crossover-filters at 60, 200 and 4000 Hz. (60 Hz between subwoover and speakers).

Best regards
Peter
In-Ear
Posts: 47
Joined: 02 Jan 2020 18:41

Re: Virtual Bass Array

Post by In-Ear » 24 Jan 2020 21:47

Hi Peter,

Im not Uli, but I think I can help you, too. Just do the room measurement as usual and then define the VBA pre-echo as pre-filter in Room Macro 0. This is all you have to consider. Proceed as usal with Macros 1-4 (5). The filter is taken into account by acourate automatically during complete Macro process and finally applied to the correction filters - nothing to think about.

Best regards,

Jörn
PeterB
Posts: 8
Joined: 17 Nov 2019 19:52

Re: Virtual Bass Array

Post by PeterB » 25 Jan 2020 17:35

Hi Jörn,

thanks, now I'll take a long listening session to check if I didn't make any mistakes.

Greetings
Peter
User avatar
mnaganov
Posts: 32
Joined: 22 Oct 2019 18:58

Re: Virtual Bass Array

Post by mnaganov » 30 Jan 2020 02:29

Thank you very much for publishing this "how to" manual Uli!
Valentin Nicolaie
Posts: 8
Joined: 22 Oct 2019 11:39

Re: Virtual Bass Array

Post by Valentin Nicolaie » 05 Feb 2020 18:16

Hi Uli, this is very interesting, thank you for the instructions. Is this procedure applicable for the floor-ceiling or height room mode given the more complex interactions as many speakers are built with multiple woofers situated at different heights relative to the floor and ceiling (like d'Appolito arrangement) etc?
User avatar
UliBru
Posts: 468
Joined: 19 Oct 2019 13:58

Re: Virtual Bass Array

Post by UliBru » 05 Feb 2020 19:22

Valentin,

I fear the VBA is not really a solution for vertical reflections.
Stay well tuned
Uli

Moderator
Acourate system: JRiver/Roon -> AcourateConvolver -> miniDSP U-DIO8 -> TacT M/S2150 amps -> DIY horn speakers
Valentin Nicolaie
Posts: 8
Joined: 22 Oct 2019 11:39

Re: Virtual Bass Array

Post by Valentin Nicolaie » 15 Feb 2020 10:58

Dear Uli,

This works very well in my setup replacing the combination of IIR(prefilter Macro 0)+overall correction FIR with which I used to manage bass problems in my room through Acourate in the past years. It is definitely better as I hear a much more defined and clear bass than I used to, even despite the slightly flatter frequency response I had in the bass region with the IIR filters.

I am so excited by the improvement that now I wish to get a better dynamic range and a more stable correction from a pre-ringing perspective by incorporating the VBA prefilters into the LSR at measurement.

All good, however I'm concerned that after I will measure with the VBA stereo wav filters in LSR, I will get a pulse which has the room bass peaks removed in an artificial kind of way so to speak. If I carry on with the correction through Room Macros 1-5 at the end I won't have the VBA active in the correction filters. What will be the best way to incorporate VBA into correction filters in this case (at all samplings)?

My setup is fully passive with KEF Reference 3 speakers, I measure at 48KHz with 131K taps and save double length filters at 262K taps.

Apologies for you may receive this inquiry a lot probably but I believe clear instructions for this will be appreciated not only by myself but by many others too.

Thank you,
Valentin
User avatar
UliBru
Posts: 468
Joined: 19 Oct 2019 13:58

Re: Virtual Bass Array

Post by UliBru » 16 Feb 2020 10:57

Valentin,

the actual workaround needs a little manual treatment.
Run the logsweep with the VBA filters. So far ok.
Open macro0, load the VBA filters too but set prefilters inactive. Run macro1.
Reopen macro0 and set prefilters active. Proceed with the remaining macros as usual.
Happy tweaking :)
Stay well tuned
Uli

Moderator
Acourate system: JRiver/Roon -> AcourateConvolver -> miniDSP U-DIO8 -> TacT M/S2150 amps -> DIY horn speakers
Valentin Nicolaie
Posts: 8
Joined: 22 Oct 2019 11:39

Re: Virtual Bass Array

Post by Valentin Nicolaie » 16 Feb 2020 12:24

This is amazingly easy and exactly what I was after in terms of automation, speed as well as having all filters' samplings saved through macro 4. The thought of manual convolution was kind of scary. Thank you, much appreciated. :-:

Cheers,
Valentin
Post Reply