My Stereo, now with FIR

Intro

My HiFi system is as follows:
- Laptop source. Well, half a laptop - the screen & hinge were damaged, and the result passed on to me. I removed the screen and hinge, connected it to the projector via HDMI, and there's a USB connection to...
- A Cambridge CXA80 amplifier - just a boring HiFi amp. 80w/ch* into 8ohm, plenty of I/O. I mostly wanted it for the built-in USB DAC. Driving..
- A pair of speakers. 8" 2-way with Seas H1252 bass drivers, B&C DE250 compression drivers on 18Sound XT120 horns. I built them to sound decent driven from any amplifier, so there's a pretty extensive crossover: 3rd order lowpass, Zobel and bottomless notch for the 4.5kHz cone breakup on the woofer; 3rd order highpass, series notch to dip the 3kHz region, L-pad for the tweeter. They're drivers that wouldn't typically work together, so they did require quite a lot of persuasion to play nice.

* The Powersoft amplifiers I have provide a readout of peak voltage per channel, so I used that to calculate my power requirements - ideally, it would've been more like 150w/ch, but the difference is less than 3dB, so I decided 80w/ch would be acceptable given that the amplifier does everything else I want.

 

I set off with my speakers measuring like this:

Which isn't bad in the grand scheme of things. The mic I used is a Beyer MC930, which is a relevant detail: it has a bump around 12kHz on-axis, and because of the directional nature of the thing, the low-frequency pickup isn't accurate. NB - at the listening position, the LF response is different again: the curve below was taken with an omnidirectional measurement microphone.

Since I'm using a laptop, I have the option to use EQ APO. It's a piece of software that sits between the media player(s) and the physical output. The first thing I did was flatten out that big 40Hz bump in the low end, and also the 70-80Hz bump.However, we can go much much further than this.

 

Cue FIR.

 

FIR processing is a way of being able to alter the phase and frequency response of a system independently from one another, in exchange for a time penalty.

In an analogue way, if we have a speaker that has a 90-degree phase lag at 100Hz, what we can do is apply an FIR filter to selectively delay some frequencies more than others. ie, 100Hz means one cycle takes 10ms (milliseconds). 90 degrees is 1/4 of a cycle, so if we pass 100Hz straight through our filter and delay everything else by 2.5ms, then the phase shift will effectively be removed. The digital implementation of all of that is beyond the scope of this article, but there's plenty of reading online.

 

So, going back to the initial measurement again,

We can cast an eye over what we might want to change using FIR processing specifically. Above about 900Hz, the phase response sets off in a negative direction, and stays out there for the duration of the treble. It'd be nice if that was all brought back to zero degrees.

The gentle rise around 3kHz might also be worth attenuating a little, and the bumps at 1.2 and 1.6kHz could also come down a little.

There's also a bump around 500Hz where the phase isn't far off zero anyway, so we might want to make an EQ cut around there, but without altering the phase response. Below that, there are some peaks and dips due to cancellations in the room.

 

RePhase is a piece of software that makes FIR filter files for other programs to interpret. EQ APO wants a .WAV file to use for convolution, while my Powersoft amps want a .CSV text file.

 

So, we import the initial measurement into RePhase.

What I've done here is applied the EQ changes I wanted with a linear-phase EQ (not a typical minimum-phase EQ), and then played with the phase EQ to get things nice and linear above 600Hz-ish.

The blue line is what I programmed, and the red line is the best that the software could do, given the input settings.

 

Some notes on that:

- Delay, sample rate, and number of taps are related. The overall delay (remember the 2.5ms example above) is approximately proportional to the number of taps used, and inversely proportional to the sample rate.

- A larger number of taps means you can process lower frequencies effectively. Note the discrepancy at 500Hz - there weren't quite enough taps to match what I wanted perfectly, but it's pretty close.

- The green text shows some useful information. The system-wide delay that's caused by this filter is 2.6ms. That's important for me, since this system gets used for movies, so lip sync is a concern. It might have been nice to sort out the +45-degree bit below 400Hz, but more and more taps would be required - more delay, more lip-sync issues. A dedicated HiFi system could have a delay of a couple of seconds before becoming irritating (ie, press Play and the music comes out a short while later), and could therefore have FIR filtering applied over the entire frequency range. We can see then, that for this case, using a high sampling frequency was necessary. 192kHz is the highest sampling frequency supported by the Cambridge amplifier, so that's what I used.

So, I've got an impulse response file from RePhase, and I import it into EQ APO.

After arguing with my laptop about signal routing, I managed to get REW to pass signal through EQ APO, and got this:

With the original to compare with:

Which has done everything we'd like. The phase response is now nice and linear, and the frequency response is smoother, too. NB - it would've been possible to program EQ APO with a load of standard EQ filters to make the frequency response alterations, and then edit the phase response after that. I just decided to roll it all into one. For me, the improvement is subtle, but I suspect I'm not particularly sensitive to phase shifts. Those of you that are more sensitive to phase shifts will probably find this a rather enjoyable system to listen to.