Pulseaudio Crossover Rack - multi-way crossover design & implementation with linux

will there be an DRC Digital Room Corretion implementen like in Accourate - or in the MINIDSP Projekt with FIR filters ?

Somebody already asked this question via PM. What exactly do you need for this? It would probably be relatively easy to add a FIR convolver plugin where impulse responses could be configured by loading some kind of PCM impulse response file (WAV or similar). Would this be enough for your needs?
 
Does that mean you'r listening to a speaker crossed over py PaXoverRack? If so, you're definitely first, man. :) My SCS4s are still lurking in the basement and I will have to build a 6 channel amp first to get my setup going...

If you want you can take a picture of your test setup and I will post it on the homepage as first ever system running on PaXoverRack ;)

I'm still testing..... I've always been an Alsa user so Pulseaudio is a bit of a learning curve... The usb card I am using has no controls in Alsa but is configured correctly by pulseaudio..(Sound Blaster X-Fi Surround 5.1 Pro)

Finally found why I was getting all sorts of thumps and pops, why the card turned off when music stopped playing and why I was constantly having to redo the config as it defaulted to internal speakers after resuming from suspend....

TLP.... damn laptop power-saving....grrr..

Edited /etc/default/tlp and changed enable from 1 to 0

Card stays on now and suspend/resume works fine.

My basic testing is with small powered speakers (such as for use with ipod or mp3 player) as the satellites and a small home theatre powered sub for the mono woofer. So, yes a system running on PaXoverRack though a most meagre and basic one just for trying all the features.

Next the workshop big system using Kef satellites with Quad amp and a Monitor Audio sub (Silver W-12 | Subwoofer | Monitor Audio)

Once that's running I'll post some pix.
 
Finally found why I was getting all sorts of thumps and pops, why the card turned off when music stopped playing and why I was constantly having to redo the config as it defaulted to internal speakers after resuming from suspend....

TLP.... damn laptop power-saving....grrr..

Edited /etc/default/tlp and changed enable from 1 to 0

Card stays on now and suspend/resume works fine.

Never heard of TLP. It seems interesting though, maybe i will try it for my laptop as well. From what i read you can disable the audio power saving feature separately. On the other hand, never change a running system
 
The audio powersaving I think only supports Intel HDA, AC97.
I tried that first but no joy so just took the blunderbuss option and turned tlp off.

Thinking further it probably is the tlp usb auto-suspend that is playing havoc with the soundcard.
When I have a moment I will turn tlp on and disable the auto-suspend for the usb souncard and see if that works.

Question...any chance of a third-order filter 18db/octave for the Xover-rack ?

cheers,
bob
 
After some reading I have to admit that there is a design mistake I made in the LR-2 low/highpass filters. these are not LR-2 characteristic as announced but effectively are second order Butterworth filters with -3dB gain at the crossover frequency and not -6dB as they should have. LR-4 filters are two 2nd order Butterworth filters in series and are thus implemented correctly. I will correct these mistakes in the next release and I will also add 2nd and 3rd order Butterworth filters to the mix.
 
Update: 1.7 was released together with ladspa-t5-plugins 1.3 which fixes the wrong filter characteristics of the LR-2 filters. 2nd order and 3rd order butterworth filters will likely come tomorrow, the code base of the ladspa plugins has been reworked and cleaned up big time in preparation for these.
 
Another update: I'm struggling hard to find a formula to calculate the IIR filter coefficients for a third order Butterworth filter. Anybody here who can help with this?

I'm searching for something like:
Code:
    def _coeffsBA(f, samplerate):
        """ return 12db/oct high pass biquad coeffs for given frequency """
        w0 = 2 * pi * f / samplerate
        alpha = sin(w0) / 2 / 0.7071067811865476 # Butterworth characteristic, Q = 0.707...
        cs = cos(w0)
        norm = 1 / (1 + alpha)
        b0 = (1 + cs) / 2 * norm
        b1 = -1.0 * (1 + cs) * norm
        b2 = b0
        a1 = -2 * cs * norm
        a2 = (1 - alpha) * norm
        return (b0, b1, b2), (1, a1, a2)

In the meantime I'm trying my luck with some DSP literatur but my head is already aching like hell! :xeye: :faint:
 
This might be exactly what i want, if i understand it correctly this is system wide so anything that outputs trough pulseaudio is filtered? Can you add latency on a channel? Is there any latency inherent in the filtering?

One feature that would be nice is if you could import a frequency response and see the changes directly on the curve. Not that necessary or important but would be nice
 
This might be exactly what i want, if i understand it correctly this is system wide so anything that outputs trough pulseaudio is filtered? Can you add latency on a channel? Is there any latency inherent in the filtering?

One feature that would be nice is if you could import a frequency response and see the changes directly on the curve. Not that necessary or important but would be nice

Yes, this is system-wide as the input sink of PaXoverRack is set as default sink.

AFAIK there is no latency induced by filtering itself as all the pulseaudio buffers have to be handed around anyways and the simply get put through all LADSPA sinks additionally.

Yes, you can add a latency to a path by adding a (sub)sample delay.

Not sure what you mean by "import a frequency response" though. Hint: you can show the overall frequency response of the filter chain on an output.
 
Sounds good! What i meant was to load a measured frequency response as .frd file and see the changes on that kinda like in most passive crossover simulators.

OK, will think about that. It probably only makes sense to compare the .frd to the inverse eq curve of a specific parametric eq as you wouldnt want to compare it to adjustments already made and inserted when measuring that frequency response, correct? So then you could adjust the eq so that the combined .frd and inverse eq FR would yield a flat frequency response...
 
Another update: I'm struggling hard to find a formula to calculate the IIR filter coefficients for a third order Butterworth filter. Anybody here who can help with this?

I'm searching for something like:
Code:
    def _coeffsBA(f, samplerate):
        """ return 12db/oct high pass biquad coeffs for given frequency """
        w0 = 2 * pi * f / samplerate
        alpha = sin(w0) / 2 / 0.7071067811865476 # Butterworth characteristic, Q = 0.707...
        cs = cos(w0)
        norm = 1 / (1 + alpha)
        b0 = (1 + cs) / 2 * norm
        b1 = -1.0 * (1 + cs) * norm
        b2 = b0
        a1 = -2 * cs * norm
        a2 = (1 - alpha) * norm
        return (b0, b1, b2), (1, a1, a2)

In the meantime I'm trying my luck with some DSP literatur but my head is already aching like hell! :xeye: :faint:

I think this would be a good place to start - it's good to understand the basics and not just "plug in" values from a chart....
Design IIR Butterworth Filters Using 12 Lines of Code - Neil Robertson

There's some (quite) easy to read Matlab code in the appendix at the bottom of the page.

But the odd order Butterworth filters are generally easiest to think of as the even order BW filter one step lower multiplied by the product of a first order BW filter (5th order = 4th order x 1st order and so on).

First order = 1+s
Second order = 1+1.414s+s^2
>>>
Third order = (1+s)(1+1.414s+s^2)

I think that would give
a = [1, -2.0286, 1.4762, -0.3714]
b = [1, 3, 3, 1]
 
FWIW I still am trying to figure out how to calculate the damn filter coefficients for 3rd order filters. I reverse engineered the code of butter() in scipy.signal, simplified it for the case of N=3 (3rd order) and tried to implement it in C. Here's the preliminary result:
[C] #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> - Pastebin.com

What I still need to figure out how to emulate numpy.poly() in this case, which takes the zeroes of a polynomial function and returns the coefficients of it. Any chance sombody knows about this stuff? :confused: :D
 
Update: somehow I figured out, how to calculate third order filter coefficients and I just released version 1.8 which adds second and third order butterworth low/high pass filters together with a number of small bug fixes and the corresponding ladspa-t5-plugins 1.4 package.

Have fun!