[gst-devel] Idea? Gstreamer Active Crossover

Jella artsci2 at yahoo.com
Wed Sep 12 19:28:58 CEST 2007

Some very high fidelity sound systems use active crossovers and multiple amplifiers. This approach is also common in automotive sound systems. Active crossovers divide the audio signal into different frequency ranges and then send these separated signals to the appropriate amplifier-speaker set. This approach allows a direct connection from amplifier to speaker. The benefits are better power efficiency and more precise control of the speaker by the amplifier.

It seems that Gstreamer is a good basis for a PC based active crossover system when combined computers having high quality audio output.

There may be a project out there that can already do this. However, bear with me for a bit as I believe there is not an implementation that has the advantages of this current idea.

Typical crossover implementations suffer from phase shifting of the signals relative to each other. This causes blurring of the sound and reduces listening pleasure. 

A computer based system can eliminate this phase shifting in the following way. The audio track can be preprocessed and then saved onto disk as multiple tracks containing high, medium, and low frequencies. Then during playback each track can be sent through the audio subsytem to the appropriate amplifier-speaker.

The dividing of frequencies without creating a phase shift can be accomplished by using a simple moving average. For example consider a digital audio signal, S(x), that you want to divide into high, Sh, and low, Sl, frequencies.  Let x be the index of a particular point in the audio file. Let "Size" be the an integer that determines what frequency the signal is divided at. The following pseudocode will divide the signal without introducing phase shift:
 Average = the average value of S from S(x-Size) to S(x+Size)
 SH(x) = S(x)-Average
SL(x) = Average

Obviously adding the two resulting files will give the original file

The frequency division will not be very sharp (low crossover slope). The following additional process can be used repeatedly until the slope is sharp enough.
For all x compute
SL_L(x) = the average value of SL from SL(x-Size) to SL(x+Size)
SL_H(x) =  SL(x)  -  SL_L(x)
SH_L(x) = the average value of SH from SH(x-Size) to SH(x+Size)
SH_H(x) = SH(x) - SH_L(x)
after all SH_H, SH_L,SL_H, and SL_L are found then 
SL(x) = SH_L(x) + SH_L(x)
SH(x) = SL_H(x) +SH_H(x)

basically this trims high frequencies from the low frequency stream and  adds then to the high frequency stream. and vice-verse. This would continue down the the limit of bit precision if enough passes were made over the two streams.

Luggage? GPS? Comic books? 
Check out fitting  gifts for grads at Yahoo! Search.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20070912/468e5d2f/attachment.htm>

More information about the gstreamer-devel mailing list