DSP implementation

I’ve been playing around with DSP in Roon and thought I 'd share what I’ve been up to in case it helps anyone.

I read an excellent article by Mitch Barnett (https://audiophilestyle.com/ca/ca-academy/audiolense-digital-loudspeaker-and-room-correction-software-walkthrough-r682/) that got me started on this. The basic idea is that speakers usually don’t have a perfect step response (because of the distance between tweeter, woofer and sub, as well as delays introduced by electronic crossovers, and the room acoustics).

I ended up purchasing his book, and Audiolense (a software that computes the proper DSP correction to be applied). After a couple of weeks of trial and error I managed to produce a good 3 way digital crossover, and room correction. Audiolense creates a wave file that contains 6 wav tracks (left sub, left woofer, left tweeter, right sub, right woofer, right tweeter), that the DSP software is supposed to use.

The problem is how to use this wave file in Roon on a stereo signal. My solution was to use Adobe Audition to separate the file into 3 stereo files for sub, woofer and tweeter. I then created 3 zones in Roon and grouped them together. I loaded each file in Roon 's convolution filter.

To complicate things because I 'm just experimenting I’ve used the equipment I had on hand.
For the DSP creation phase, I connected a 5.1 external sound card (Xonar U5) to my laptop. The front output was connected to my main amp (Benchmark AHB2) --> woofers. The rear output was connected to my powered subwoofer (velodyne dd12). The center/sub output was connected to my marantz receiver --> tweeters.

For playback with roon (running on a NUC PC, OS: ROCK), I connected:
the ‘woofer’ Zone via USB to a benchmark DAC 2 --> AHB2 --> woofer.
the tweeter zone via USB to Xonar U5 --> marantz --> tweeter.
the subwoofer zone via Nuc’s internal sound card 's audio jack to the subwoofer.

Because I have different zones with different DACs the signal of the three zones was not time synchronized (and the volumes were different). I created a 10 Hz square wave playing in short bursts using Adobe audition. I played that through Roon (no DSP activated yet). I then hooked the output of the DACs (for example R channel from benchmark, L channel from Xonar) to my laptop and measured the delay and volume difference. I entered the changes in roon (under DSP/speaker setup for the volume and under device setup advanced group delay). I replayed my square burst and verified the signals were synchronized and the volumes matched). I noticed a bit of variability in the synchronization, so the process is not perfect.

I finally entered the DSP files (convolution filter) for each zone. I then muted all outputs, and got roon to play another audio file I’d generated in Adobe Audition (a white noise at full volume). I then checked for signal clipping and adjusted my headroom to avoid clipping (same value for 3 zones). Interestingly Billie Eilish’s Bad guy managed to clip (somehow louder than my white noise). So I re-adjusted my headroom.

After that, the outputs were un-muted, to listen music. For a check, I played R and Left REW generated sweep tones through Roon (dsp engaged), and measured the result in REW. It matched audiolense’s predicted step response pretty well.

Once I’ve listened for a while, if I like the system, I plan on finding a DAC that has 3 channels. Ideally I’d find a workaround so Roon plays everything through 1 zone. I’ll also buy another AHB2 for the tweeters.

Not sure if any of this made any sense, or if anyone is interested, but hopefully it’ll help someone.

1 Like

Good job Omid!
I’ve played a bit with zone grouping to manage active filtering of a 3 or 4 way stereo speakers. There are issues as zone grouping has not been designed for this purpose. There’s no guarantee that the time misalignment is a fix value. Could be 1ms one time, then the next time on another song it can be 0.5ms etc… Additionnally : 3 DACs connected via USB are not synced to the same clock, so one will work “faster” and Roon will be have to decimate the signal to keep pace. Overall the approach is OK for sub/bass filtering as 1ms is 1/10th of the wave length at 100Hz, but for mid/highs filtering it’s very risky and poised to impact SQ (blurry stereo image, lack of natural…).

The rigorous approach is to generate the 6 or 8 channel stream in a single zone and stream to a multichannel DAC. The cheap option is miniDSP, but rather go to audio pro (RME…) or Hifi brands such as Exasound. There’s a newcomer in that area at a lower price tag and good technical reviews: DAC8 PRO of Okto Research.

For example, here’s my setup:

  • first convolution is HAF stereo to stereo room correction (incl.reverberation frequency linearization, phase linearization…). It says for path as reverb correction requires Linput–>Routput and Rinput–> Loutput processing
  • second convolution is stereo --> multichannel filtering, (L,R) --> (LW1, LW2, LM, LT, RW1, RW2, RM, RT) where W1=Woofer 1 / W2=Woofer 2 / M=Mid / T=Tweeter. Filters where generated with Rephase, combined with ad hoc .cfg convolver file, zipped and uploaded in Roon (see below)
  • Procedural EQ is mainly used here for channel muting in the setup phase
  • Speaker Settings are for gain and time alignment of everyspeaker

Thank you Rémi.
I fully agree with you. I’m not happy with zone grouping. I haven’t figured out how to go from stereo to 6 channels in Roon. Can you give me more details on how you did that?
I don’t mind being a new multichannel DAC (the RME, and okto both seem to beat my Benchmark DAC2).

Thank you so much. I looked at your comments again and realized that Roon can Up Mix 2 to 6 channels and do the DSP I need! And I don’t have to mess with synchronization and volume matching.
All I need now is a multichannel DAC.
That’s awesome.

Generate a .cfg file and zip it together with the impulse responses of your filter, following guidelines here https://kb.roonlabs.com/DSP_Engine:_Convolution

This is the one I generated for 2 x 4 way active filtering. https://www.dropbox.com/s/o0ni680g7080jqb/12.zip?dl=0

Have a look at the pro audio interface Motu Ultralite Mk4. 10 output channels with ESS DACS.

Thank you. I ended up ordering Motu 8a. Haven’t received it yet, but I’m hoping it’ll do the trick.

Yeah the 8a is a nice piece of kit too.

Hi, I too am keen to use Roon to manage a digital crossover, some time alignment and bass room treatment.

My setup today is as follows:

Roon stream from Mac Mini via USB to Chord Hugo TT, to dbx venu360, to 2 power amps, one for the bass cone driver and one for ESL panels in my hybrid Innersound speakers. I have the cross over points, the delay time to time align the transmission bass with the panel and the ‘treatment’ to the bass and panel at certain frequencies to correct for some non-linearity. All from Roger Sanders himself. He recommended the dbx and while good, I am pushing the analogue output from a multi 1000 $ DAc into a ADC and then DAC path in the $800 dbx, while it is ok, it is not of the same quality, and it fundamentally doesn’t sit well with me.

So what I would like to do is:

manage the crossover, time alignment and minor slope adjustments to the bass and the ESL panel in Roon DSP, this requires 4 channels and then look to use a unit like the dac8 PRO from oktoresearch, that is an 8 way DAC, so would only use half of its DACs. Then feed the output from this directly into my 4 channels of power amp. Can anyone who has been down this path please advise how I can set up the slopes in Roon to do this. Thank you so much.

In procedual eq you can setup two mixes. One with left and right going to left and right channel output, second with left and right going to two different outputs, for example back left, back right. Now left and right feeds your ESL’s and back left and back right feeds your woofers.
Now you can setup cascades of different delays and generic iir filters and asign them to the woofer and esl outputs. That should do it. There are calculators online that can help you to setup the iir biquad parameters like this very simple one. https://www.earlevel.com/main/2013/10/13/biquad-calculator-v2/

thank you @Nyquist, I need to research around this. here are some data point that are the settings in dbx360

This is a better way to go:

Using separate zones and group, is far from ideal.

Hi Remi,
I’ve been using DSP correction for a while now (using Audiolense to generate my filters). I’m toying with the idea of performing 2 cascading convolutions (one based on nearfield measurements to correct the speakers, the other in the far field to correct the room’s problems).
I noticed in your case you were using 2 convolutions. I’ m just wondering if you know how Roon handles cascading filters. Looking at your screen shot above you’re going from 4 paths to 8 paths, but the cfg for your second filter shows 2 inputs to 8 outputs (I expected 4 inputs).
I’m missing something I think…
Any insights would be welcome.

Roon handles cascading filters very well.
I understand your confusion : actually my first filter is a 2 --> 2 filter.
Roon shows 4 paths as it’s a “matrix” HAF filter.

384000 2 2 0
0 0
0 0

1 Like

Thank you. That makes sense!
In my case, I was trying filters that went from stereo to four channels and then four channels to six, or alternatively two channels to six channels and then six channels to six channels, but in both cases Roon was giving me some problems…
It’s a moot point now, as the cascading filters are no longer necessary.