A 2.1 System in LinFIR, from Measurements to Filters

This tutorial follows a real project from its measurements to its filters. The system is a 2.1. The two monitors have a 5.5" Sica coaxial driver (5.5 C 1.5 CP) with a 1" tweeter at its centre, in a 4-litre closed box. The subwoofer has a 12" Dayton RSS315HO-44 and two 12" passive radiators. The DSP runs at 93.75 kHz with 1500-tap FIR filters.

I did not take the screenshots while I was designing the system. I redid the work afterwards with a script that reproduces what I did, step by step. A few screenshots show options I tried and left aside, with the reason.

The order of the steps is the one I use:

  1. Describe the enclosures.
  2. Splice near-field measurements under the far-field ones for the subwoofer and the woofer.
  3. Window the measurements.
  4. Equalize each driver with IIR filters.
  5. Add a FIR correction, magnitude and phase.
  6. Place the crossovers.
  7. Set the levels and delays.

The steps are not independent, and I went back and forth between some of them. I come back to this below where it matters.


1. The measurements

Each driver was measured at 790 mm, every 10° all around, in the horizontal and the vertical plane: 73 impulse responses per driver, at 96 kHz. LinFIR drove the turntable, a home-made one built around a Pololu Tic stepper controller, and took a measurement at each angle. The woofer and the tweeter of the coaxial were measured separately. For the subwoofer I only measured the horizontal plane and let LinFIR use it for the vertical one as well. I also took near-field measurements of the subwoofer's cone and of one of its passive radiators, at 5 mm, and of the woofer's cone, at 10 mm.

The subwoofer stood on the turntable, and a monitor was raised above it and turned with it. The rotation axis went through the monitor's baffle, but not through the subwoofer's, which is too big for that. This setup and the measuring distance roughly match how they will sit once in place: the subwoofer under the desk, the monitors on it, raised to ear height. So what LinFIR combines is close to what I will hear.

In the graphs, the subwoofer is red, the woofer blue and the tweeter green. The white curve is their sum.

The phase graphs are easier to read without the rotation the time of flight adds. A delay turns the phase in proportion to frequency, and the sound takes about 2.3 ms to cover the 790 mm to the microphone, plus the latency of the measuring chain. "Remove time of flight rotations", in Phase Options, takes it out, and "Unwrap Phase" joins the curve where it would jump from +180° to −180°.

Here is the woofer, windowed, as the phase graph shows it by default: wrapped to ±180°, with the time of flight left in. The delay turns the phase down by 360° every 120 Hz or so: from 100 Hz on it wraps faster and faster, and nothing of the driver can be read. Unwrapped, with the time of flight taken out, what is left is the driver's own phase: it rises towards the bass with the woofer's roll-off, and stays within about 50° of 0° from 200 Hz to 10 kHz.

As they come, the measurements are not usable for filter design. They are not windowed, so the room is in them.

2. The enclosures

LinFIR needs to know where each radiating element sits on its enclosure. This view is in the Impulse Response window, with Polar checked. The same option drives a turntable for polar measurements. The near-field splice uses it to carry each near-field capture to the microphone of every angle, and the off-axis measurements are corrected for the rotation centre of the turntable.

For the monitor this is quick: a 170 × 260 × 170 mm box with a 10 mm chamfer, the coaxial 30 mm above the centre of its baffle. The turntable axis went through the centre of the coaxial, so there is nothing to correct, and the splice only needs the position of the woofer on the baffle.

more to describe. Its cone is on the front, 280 mm above the bottom of the box, and the passive radiators are on the sides, 200 mm above it. The turntable axis was 200 mm behind the front baffle, and the microphone faced the monitor, 1 m above the bottom of the subwoofer's box. That is the far-field microphone position the subwoofer's splice works from.

3. Near-field splicing

A far-field measurement gated before the first reflection is only valid above a few hundred hertz. Below, LinFIR builds the response from near-field measurements, following Don Keele's method. The near-field captures of each radiating element are propagated to the microphone position of every angle, then blended with the far-field measurement in a transition band.

Before the splice, what the microphone recorded of the subwoofer on axis is mostly the room.

The splicing wizard has seven steps. Here they are for the subwoofer.

1. Elements. One capture per radiating element: the cone and the passive radiators, each with its own time window. All the near-field captures must go through the same gain chain, and the wizard's capture settings are shared by all the elements for that reason. Be rigorous about the distance from the microphone to the cone: the microphone sits at the centre of the cone, or of the radiating element, and the distance you enter is the one LinFIR propagates from. The two passive radiators are identical and placed symmetrically, so I measured one and duplicated it.

2. Geometry. The enclosure's shape and baffle edge, here a 380 × 500 × 520 mm box with a 10 mm chamfer. They come from the enclosure set in the Impulse Response window.

3. Positioning. Where the far-field microphone was, and where each element sits. The microphone is at 790 mm, aimed 750 mm above the centre of the box, at the monitor. The cone is on the front, a passive radiator on each side. From this geometry and the microphone position, LinFIR computes the diffraction the microphone sees from each element, with a Distributed Edge Dipole (DED) model. When the splice is applied to all the polar measurements, the same model gives the diffraction seen at every angle.

4. Levels & sync. The three captures on the same scale and in time. My captures were synchronized by a loopback, so there was nothing to realign, and the gain chain didn't change between them: gains and sync offsets stay at 0. With the time plot low-passed at 50 Hz, the passive radiators (green) keep ringing after the cone (red). In the response below, the cone has its notch at the tuning frequency, around 22 Hz, where the passive radiators take over.

5. Far field. The time window on the far-field measurement, before the first reflection, and the level of the near-field prediction matched to it.

6. Blend. Where each part can be trusted: the near-field prediction below 430 Hz and the far-field measurement above 366 Hz. The transition takes that whole band. That is narrower than I like. I measured the far field a little too close to the floor, so its reflection comes early and the far-field window has to be short. It shows the method's constraints well: the room sets how low the far field can go.

7. Done. The recipe is applied to all 73 angles.

Spliced, the subwoofer is within about ±2.5 dB from 30 to 300 Hz before any EQ, with a broad hump around 40 Hz. Higher up, its breakup peak at 2.2 kHz doesn't matter: the crossover is at 130 Hz.

The woofer goes through the same steps with a single element, its cone, and its transition is between 535 and 671 Hz. Spliced, it shows the slow roll-off of a small closed box below 1 kHz, the baffle step included.

4. Windowing

The tweeter gets a window that keeps the direct sound and drops the first reflection. "Auto Set Window" proposed 4.4 to 15.3 ms. I kept 6.28 to 10 ms. As a rule, don't window a tweeter too tightly: the sound that goes from the tweeter to the edges of the baffle, then to the microphone, travels a little further than the direct sound, and a window that is too short cuts that diffraction out of the measurement. The response then looks better than what you will hear. The two spliced drivers have the adaptive window, which keeps a longer window for the low frequencies. Below their transition band, the room is already gone from them.

5. Driver EQ with IIR filters

Each driver gets its own IIR equalization first. Auto EQ fits peaking filters and shelves to a target within the limits you give it. On the woofer I let it place up to 12 peaking filters between 80 Hz and 1 kHz, with Q between 0.3 and 5, on the on-axis response at 1/48 octave. It needed only four, three of them to lift the bottom of the woofer's band.

On its own, the woofer is then flat from 90 Hz to 1 kHz, with a steep drop below. The dashed curve is the woofer before its filters. It shows while the driver's filter window is in the foreground.

I kept a different start for the woofer. A closed box rolls off like a second-order high-pass, here at 131 Hz with a Q of 0.56. An asymmetric low shelf (a Linkwitz transform) moves that roll-off to 65 Hz with a Q of 0.62, so the woofer is flat well below the 130 Hz crossover with the subwoofer. I placed it by hand and locked it, so that a new Auto EQ run leaves it alone, and let Auto EQ place 14 peaking filters around it. The subwoofer has 15 peaking filters between 24 and 206 Hz, the tweeter 14 between 1.4 and 18 kHz.

With the filters kept, the woofer rolls off gently below 100 Hz, as the Linkwitz transform makes it. I left the rise between 1 and 2.5 kHz to the FIR correction.

6. FIR correction

The FIR correction comes after the IIR filters and corrects what they leave: the residual magnitude errors, at 1/48 octave and full strength, and the phase. It is computed on the response after the IIR filters, so the two interact. Any change to the IIR filters changes what the FIR has to correct, and I went back to the IIR filters more than once after looking at the result of the FIR correction.

The woofer's magnitude is corrected from 72 Hz to 5 kHz, and its phase up to 6 kHz. The tweeter's magnitude is corrected from 1.7 kHz up, and its phase from 1.2 kHz.

Alone, the woofer is now flat from 150 Hz to 5 kHz, where its correction ends. The dashed curve is again the woofer before any filter.

The subwoofer only gets a magnitude correction, from 40 to 350 Hz. Its phase correction stays off. I come back to it with the crossovers.

Soloed, the woofer shows what the correction does to its phase. The dashed curve is its phase as measured, before any filter, and the solid one is after the IIR filters and the FIR correction. The phase is nearly flat from about 300 Hz to 6 kHz. Below 300 Hz it still rises towards the bass, following the woofer's roll-off, which the Linkwitz transform has moved down to 65 Hz.

Correcting the phase changes the magnitude a little. The FIR that rotates the phase is truncated and windowed, so its magnitude is not quite flat, and the error grows towards the low end of a driver's band. LinFIR has a guard against it, which raises the start frequency of the phase correction until the magnitude change stays within a tolerance. I left the start of the woofer's phase correction at 0 Hz, its default, and let the guard raise it. It only checks the magnitude where the response, all filters included, is within 40 dB of its peak. At this stage it starts the correction at 285 Hz. Once the crossover with the subwoofer is in place, the woofer stops playing below 130 Hz, and the correction starts at 135 Hz.

I then changed the guard's tolerance and the Kaiser β of the phase filter until I had the compromise I wanted: a woofer phase that runs parallel to the subwoofer's through the crossover, without too much change in magnitude. I ended at 0.4 dB and β = 2. Push it further, here with 3 dB and β = 1, and the woofer's phase stays flat down to 50 Hz, but the truncated filter takes about 1 dB off the woofer between 50 and 90 Hz.

7. Crossovers

The crossovers are linear-phase FIR filters, linked in pairs so that both sides of a crossover move together:

The sum is already close to flat at this stage, but the drivers are not aligned yet, and it dips slightly at 2.5 kHz.

A brickwall at 2.5 kHz?

Between the woofer and the tweeter I first tried a brickwall as well. On the four-way monitors where I compared it with LR24, the midrange and the tweeter are stacked, and the narrow overlap of a brickwall keeps the lobing between them to a thin line. In a coaxial driver the tweeter sits at the centre of the woofer, on the same axis, so there is no lobing to avoid, and the choice comes down to how the two directivities join.

With the brickwall, they join all at once. At 2.5 kHz the −6 dB contour pinches in, in both planes, and the Directivity Index has a small step there.

The LR8 fills that gap. The woofer and the tweeter both play from about 2 to 3 kHz, and the directivity goes from one to the other without a break.

8. Levels and delays

Auto-align and Auto-level compute the delays from the phase of the drivers where they overlap, and the gains from the flatness of the sum. I left both on for the whole project, so they ran again after every change. With the tweeter as the reference, they give +3.2 dB to the subwoofer and −1.4 dB to the woofer, and delays of 0, 0.203 and 0.672 ms. The sum is then within ±0.1 dB of flat between 24 Hz and 18.8 kHz. The subwoofer's level and delay roughly match the place it will have in the room.

9. Phase at the crossovers

Linear-phase crossovers on minimum-phase drivers

A driver behaves, for the most part, as a minimum-phase system: its phase follows from its magnitude. Where its response rolls off, its phase turns, and the steeper the roll-off, the more it turns. A linear-phase crossover filter changes the magnitude and adds no phase. On a driver, it can give exactly the acoustic slope you were after, the filter's slope combined with the driver's own roll-off. The phase, though, is still the driver's, the phase of its natural roll-off alone, and it no longer goes with the magnitude. The response has the target's slope, but neither the phase of a minimum-phase filter with that slope nor a linear phase. On the two sides of a crossover the phase slopes then differ, and the sum is no longer linear phase.

No delay alone can fix that. A delay adds a phase that grows in proportion to frequency, while the two phase curves bend continuously, each following its own driver's roll-off, and the two roll-offs are not mirror images of each other. Aligning the drivers at one frequency leaves them apart at the others. A minimum-phase crossover gives each side the phase that goes with its magnitude, so the phases meet where the magnitudes do. A linear-phase crossover doesn't, and without it the drivers no longer sum cleanly around the crossover.

There are two ways to use a linear-phase crossover without running into this. The first is to equalize each driver flat over the band where it is summed with its neighbour. Its natural roll-off then lies outside the overlap, and so does the phase rotation that comes with it. That is not always possible, because it can take a lot of boost at the edge of a driver's band. The second is the phase correction, which makes the driver linear phase over its band before the crossover filter is applied.

The crossover at 2.5 kHz shows it when I turn every phase correction off and let Auto-align find the best delay again. Around 2.5 kHz the woofer's phase rises and the tweeter's falls, and they only meet where the two curves cross, at 2.6 kHz. The sum's phase gains a bump of about 25° around the crossover. Here the magnitude of the sum, on a stretched scale, still holds on axis: the LR8's overlap is narrow, and Auto-align puts the drivers in phase right at its centre. The wider the overlap, the more the gap between the two phases shows in the sum.

With the phase corrections on, the woofer and the tweeter stay within a degree of each other and of 0° over the whole overlap, on the same scale.

On the woofer I used both ways. The Linkwitz transform moves its roll-off an octave below the crossover with the subwoofer, and the phase correction takes care of what is left. Here are the subwoofer and the woofer alone at 130 Hz, as kept. Between 80 and 190 Hz, where both drivers play, their phase curves lie on top of each other.

With the woofer's phase correction pushed too far, its phase is flat from 80 Hz, while the subwoofer's still falls through the overlap. The two curves now cross instead of running together, some 30° apart at the bottom of the overlap.

With the woofer's phase correction off, Auto-align still finds the best delay, but the two phase curves now cross with different slopes, about 25° apart at the edges of the overlap. On axis the magnitude of the sum hardly changes, but the system's phase only flattens out above 500 Hz.

The subwoofer keeps its own phase

I also tried to correct the subwoofer's phase, from 33 to 300 Hz. With the taps I have, it can't be done at these frequencies. At a 2 dB tolerance, the guard finds no start frequency where the correction stays within it: the best one changes the magnitude by 2.8 dB. At 3 dB it goes through, from 88 Hz, and the crossover gets worse. The subwoofer's phase is now flat in the overlap, while the woofer's still turns below 135 Hz, where its own correction stops, so the two curves cross with different slopes again. The truncated correction also costs about 2 dB at 30 Hz, and the subwoofer's low-pass loses its stopband. Above 230 Hz the subwoofer now stays only 35 to 40 dB below its level, where the brickwall alone kept it more than 50 dB down.

The crossover, the magnitude correction and the phase correction of a driver share one FIR filter of 1500 taps, 16 ms at 93.75 kHz. Correcting the phase of both drivers properly through an overlap that starts at 80 Hz would take a much longer filter. So I leave the subwoofer's phase as its passive radiators make it.

This is why I made LinFIR WYSIWYG, what you see is what you get. The settings give the final filter, so the graphs show the final response of the filtered speaker, and a problem like this one is in front of you as soon as you change a setting. The woofer, extended by the Linkwitz transform and corrected above 135 Hz, follows it closely through the crossover, and below 130 Hz the system's phase is the subwoofer's, as with any subwoofer.

10. The result

Here is the finished system on axis, one graph at a time, starting with the magnitude. On this one I turned on, in the Graphs menu, the three directivity curves LinFIR computes from the polar measurements:

The Listening Window stays within about 1 dB of the on-axis response up to 4 kHz and dips by 1.5 dB around 5 to 6 kHz. The Predicted In-Room response slopes down smoothly, with the same dip. The Directivity Index is close to 0 dB in the bass, as it should be for a subwoofer, 2 to 3 dB around the 130 Hz crossover, and then rises steadily to 5 dB at 1 kHz, 8 dB at 4 kHz and 11 dB at 20 kHz.

My guess, without having checked it, is that the small ripples below 8 kHz come from the diffraction of the box. The two larger accidents around 10 kHz seem to come from the coaxial driver itself: its dome sits a little behind the woofer's cone, which leaves a step between them.

The phase is flat within a few degrees from 170 Hz to 19 kHz. Below, it follows the roll-off of the subwoofer and its passive radiators.

The impulse response is a single peak. Each linear-phase crossover filter rings before its main peak, but the two sides of a crossover ring in opposite directions, and they cancel in the sum when the drivers are matched in level and in phase. The step dips before it rises. The woofer's high-pass is linear phase, so part of its roll-off, which an ordinary speaker shows after the rise, comes before it. The brickwall post explains this in more detail.

Closer up, the peak lasts a few tenths of a millisecond. The dip of the step before its rise comes from the woofer (blue): its high-pass is linear phase.

The cumulative spectral decay of the predicted sum dies away quickly above 50 Hz. Below, the subwoofer and its passive radiators take longer to settle.

The sonograms show the directivity in both planes. With the coaxial, the horizontal and vertical maps are close, and nothing marks the crossover at 2.5 kHz.

Questions or corrections?

A correction is more useful than a compliment. Write to me.