Driver Linearization


Driver linearization is a very important step in crossover setup. It ensures L/R drivers match each other and ensures they follow the crossover curve. Certainly, when you buy a pair a driver from the manufacturer, you want them to match them for you and if you buy it from a well known company, each driver usually comes with its own measurement curve. But if you check the curve, they seldom match perfectly. The next thing is that the drivers are also not a flat line over the usable frequency range. So, how can you ensure that it follows the crossover curve? These 2 problems can be solved by driver linearization and it starts with measuring the drivers.

To measure the drivers all crossovers should be bypassed. This can easily be done in BruteFIR

filter "lsubfilter" {
       from_inputs: "left"/0.5;
       to_outputs: "lsub"/0;
       coeff: -1;

coeff: -1 simplify means that all filters are bypassed.

(The following excerpt is taken from ShinObwian’s notes)
This step aims to take the raw response of a driver (and without room influences) whilst mounted in a cabinet and correct for any anomalies that appear. Since we’re trying to make linear the inherent driver/cabinet behaviour we do not want to be correcting for room induced problems. Therefor we make nearfield measurements of 40cm on axis with each driver
and ideally perform them outside where the only troublesome reflection would be that from the floor. If its not possible or inconvenient to move the loudspeaker and measuring equipment outside then a large room with the loudspeaker in the center and well away from boundaries is a good first step. You can expand upon that by placing acoustically absorbent
materials between hard surfaces such as walls and floors to further reduce reflections.

NOTE 1. If you cannot measure your loudspeaker outside then I strongly suggest you don’t include any data below 200hz in your linearisation since its almost certainly influenced by the room. Unfortunately this means corrections for baffle step in a 2-way will be incorrect but will be corrected for in the final step of room correction. Ideally to get best results you will be performing measurements outside.

NOTE 2. Using the method described below it is extremely important that care be taken whilst performing the tweeter logsweep measurement since it will have no crossover filter fitted and will potentially be running full range. You must choose your logsweep start frequency with great care and I would suggest 1Khz as a minimum. You may also wish to move the microphone to 30cm or even 20cm distance from the tweeter and reduce level as further insurance. As always first test with low levels and listen to the driver for straining or audible distortion before jumping in. Destroying a tweeter will quickly dampen your enthusiasm so be safe.

ADDITIONAL: There are no hard and fast rules to audio and that includes Acourate and just to prove this I would like to point out an email I’ve received saying that it may actually be best to perform driver linearisation with the loudspeakers in position within your listening room. My thought on this is to stick to the guide first and then if your curious or the results are not what you expected go try this alternate method. All you have to do is follow the steps outlined but with the loudspeakers positioned as they would be in your listening room.

Step 1.
The first step is to setup your microphone at a distance of 40cm on axis with the driver your measuring. But before any linearisation you need to identify the area where driver performance is optimal, you can do this with either your own measurements of distortion and frequency response or rely on 3rd party data. What you are looking for is an area with
relatively calm frequency response and low distortion with no abrupt anomalies. Once you identify such an area, this is your target for the logsweep measurement. I’ll now give an example of this process:

In this example I will detail the process for a RAAL 140-15d ribbon tweeter which is to be used as the high frequency driver in a 3.5way loudspeaker. Ideally you will use a program such as ARTA to capture frequency and distortion data but let’s assume a realistic situation where I have no such data available and instead, have only the data provided by the manufacturer. This is a least optimal situation but can still be worked with.

Here’s the manufacturer data for the driver:


As we can see looking at frequency and distortion data the driver has a useable range down to at least 2Khz and still offers OK performance at 1Khz. This is a good situation since I have intended for the driver to cover 2.5Khz and above. I believe a logsweep starting at 1Khz will be possible and safe with the concession made that it will be performed nearfield at 30cm on axis and thus the overall power input to the driver will be low in order to get a suitably loud signal at the mic.

Why am I doing a logsweep measurement from 1Khz when I’m intending to crossover at 2.5Khz you may ask.Well with 1Khz we have more than an octave below the crossover where linearisation will still take place so even outside the bandpass with the crossover filter applied we are getting correction taking place, this is essential for correct acoustic rolloff.

Now that’s we’ve identified an area to work within we create a logsweep for 1Khz-20Khz:


After this we run the logsweep measurement into the driver with NO filter attached and record the result. After this we use the logsweep convolution process in Acourate(see early section for details on this). For this part of the recording, I am using 30dB gain in ULN-8 but I suspect that 40dB gain may also work.


Step 2:

Now that you have recorded the logsweep and used the logsweep convolution function within Acourate you will have the pulse for your driver measurement and its ready to be worked on.
Here’s my tweeter pulse:
Note the measurement shows 1-20Khz range as per the range of the logsweep


Once you’ve correctly got the pulse then we need to perform a minimum phase extraction so go press F2 to access this and set the options as shown below and calculate:


Now we will effectively ‘smooth’ the response using the FDW or Frequency Dependant Window function. We perform this step in order to create a general correction behaviour and not compensate for absolutely every anomaly. Basically the aim is to look at the trend and correct for that.

Interestingly Acourate allows for a linear interpolation of correction amount between low frequency and high frequency. So its entirely possible to have more extreme correction low down and less up high. This is explained below.

Press F3 to accessFDWand set then calculate as shown



FDW means a frequency dependent windowing defined in terms of cycles.
A 1kHz sine wave has a cycle time of 1 ms. So a FDW value of 15 means a window width of 15 ms.
With a 20 Hz sine wave the same FDW value means a window width of 15 * 50 ms = 750 ms.

In the FDW panel you find 4 parameters. a/b, c/d
The parameters control the windowing of a given single pulse response. a/b is a half window on the left side of the pulse peak, c/d is a half window on the right side of the pulse peak. In normal cases you can simply set a=c and b=d = symmetric windowing.
a and c define the width at low frequencies, whereas b and d define the width at high frequency (fs/2). In between the values are interpolated.

For better understanding load a pulse response and compute the minphase by TD-Function – Phase Extraction – minphase. Then apply FDW with e.g. 3/3,3/3 and 20/20,20/20 and 20/3,20/3. Then compare the resulting curves. You will find that you can control the smoothness of the resulting frequency response.
In reality you define by the FDW parameters if you focus more or less on the direct sound (represented by the pulse peak). So a wider window will include more reflections and reverb. Thus you get more oscillations on the frequency response.

You should keep in mind that the pulse response part outside of the window is not taken for filter calculation. So at the end you may understand that only a small (frequency dependent) fraction of a pulse response around the pulse peak is taken for correction.

Please note that the FDW center can sometimes be 1 when you are testing the tweeter and becomes 11 when testing the woofer. Here is the reply from Uli “this behaviour is normal. The shown value is the actual position of the pulse peak. The minphase peaks for a tweeter are close to position 0 or even equal to position 0. Wheras the pulse peak of a subwoofer may arrive much later.
The parameter is mainly intended for information. Sometimes (in very rare cases with weitd system respnses) it happens that the peak at the beginning of a pulse is lower than a later following reflection. Then an automatic FDW as taking place in the macros is carried out at wrong positions. This needs a manual treatment. And so you can also override the FDW center parameter.
But I do only recommend to use it if you really know what you are doing. So better ignore it.” so basically, don’t change it!


Next we have to ‘cut out’ the interesting data and scrap the rest. Its quite easy to see where the data is relevant and where its not, I would advise against including the area’s at the extremes of the measurement since these are influenced by the window process.
We need to find the frequencies of the upper and lower limits to the data we wish to extract. This is easily done using the marker functionality within Acourate


With that done we open the phase extraction function with F2 and enter our limits:


After we calculate the extraction will have successfully taken the part of the data we are interested in apply to the correction and will see something similar to this in Acourate’ display:


In this step we create and inversion or mirror image of the data we extracted in step 4. We do this because an inversion is the opposite of the original and when applied to the driver will theoretically allow for a more linear performance since the problems are partially cancelled with the inversion.

This is a simple and quick step. All you need to do is open the ‘inversion’ function within FD-Functions menu of Acourate and calculate:



With this inversion done you will want to SAVE and keep this pulse safe because it will allow you to linearise any crossover type or configuration you wish to apply to this driver in the future.Also give it a suitable name to make it easy to identify ie. ‘XO4R 1000 20000 Inverse.dbl’ – this indicates its intended for right tweeter and is an inverse of the logsweep range 1000 to 20000hz

This step assumes you already understand how to create a crossover within Acourate, if you don’t go back and read ‘Creating CrossoverwithinAcourate’ then move on.

OK so you have your crossover filters ready. Load the relevant filter for the tweeter you just measured, in my case it was the tweeter for the right channel in my 3.5way loudspeaker so my filter is XO4R96.

As can be seen XO4R96 is a 2nd order Linkwitz/Riley type with a highpass at 2.5Khz:



Now we need to combine the inverse with the crossover or more specifically; superimpose the inversion onto the crossover filter.To do this we perform a convolution.
Press F9 within Acourate to open the convolution window and then proceed to set as shown then calculate.



Step 8.

Right we have done all the hardwork and all that’s left is to prepare the filter into a format suitable for use in the convolution process for playback.

First thing that needs to be addressed is that when we did the convolution in step 7 we doubled the number of taps in the filter so now we need to scale it back and set the main pulse into the center of the filter.

This is a very simple step and we use the ‘Cut&Window’ function. You are likely working with 65536 taps but if you are using more or less then the ‘position/count’ section needs to half sample rate or in this case 32768. Also be sure to set ‘before peak’. Once this is done simply calculate the result.



The final step of our driver linearisation process.

All we need to do now is adjust the gain of the filter so it doesn’t exceed 0dB and give rise to clipping. We use the‘normalisation’ function to achieve this.

Press F8 to access ‘normalisation’ and then set as shown. Also note that you can apply normalisation to either multiple filters relative to each other or you can normalise individual filters in their own right. This is achieved by selecting ‘groupwise’ or ‘individual gain’ respectively. We only want to normalise a single filter so check individual gain and then select the cutnwindow filter created in step 8. After this calculate the result:

droppedImage_16 droppedImage_17

With this done we have completed driver linearisation and you should save the result of the normalisation as your final linearised crossover in a safe place. Again I recommend an easy to identify name such as XO4R96Lin.

There is but one final and optional step left and that’s to verify the result. To do this load your newly linearised filter into the convolution engine within your playback chain and then proceed to run the same logsweep measurement as you did at the very beginning(in this case 1-20Khz). With the mic in the same position as before record the result, save and do a logsweep convolution followed by cutnwindow and then frequency dependant window and you will hopefully see this when compared to the originally generated crossover:


Looks very good!

Here is the recording after linearization alone. The dip I mentioned in previous page has been corrected. The impulse response also looks better. The IACC has also improved from 61.8% to 69.5%! Mind you that this is with linearization alone!



Is it worth linearizing woofer and sub?

Let’s e.g. think about the FDW window sizes in macro1. One cycle @ 100 Hz is 10 ms. So e.g. 15 cycles = 150 ms. The sound travels about 5.1 m. This is not a big problem compared to the room size. A 10 Hz wave would travel 51 m and this means several reflections forward/backward in the room. You get the thought behind?

So you may try to linearize the woofer. But this will already include the room behavior which confusing the whole thing. So not advised.

Is it possible to linearize only a portion of frequency?

Quite possible and this is how you do it. What you see below is the inverse of a recording.


Now, you want to linearize only the frequency above 250Hz. Run Phase extraction as follows


You can now see the new inverse


Convolve with the new crossover and this is what you get