Audio crafting #9 – Headphone correction with native Bitwig tools

I know many people are interested in this, and especially under Linux there’s not a lot of choice in commercial tools, so I decided to write this tutorial.

First of all, I want to say that in general I’m quite critical of tools like this for studio monitoring. No amount of corrective filtering can change the mass-spring characteristics of a headphone driver element. But I do believe that it can be useful to give at least more perspective. I assume that people reading this will know what headphone correction means, so I’m not going into any discussion on the fundamentals here.

The AutoEq project uses various freely available headphone measurement data to automatically calculate correction settings for both parametric and static-band EQ devices. It also creates impulse responses for convolution processing.

The database has data on over 2500 different headphone models. Provided are a flat as well as a number of Harman profiles (more on those later), and any headphone profile can also be used as a target as well. A profile can be created as an example for your open-back studio headphones to make them sound like some cheap in-ears to get some proxy of how your music would sound under typical consumer listening conditions.

Considering studio work the problem is that all of the provided results target a Harman preferred listening profile. The Harman profiles have been developed a bit over the years, but basically they are averages based on empirical listening tests over large amounts of people. They feature a bass bump and also a strong peak at around 3K, and what’s worse, a very steep high frequency roll-off above 10Khz.

The science can’t be disputed: this is how people like to listen to music, and these profiles are useful in that sense. But for studio work they are risky, especially in the high frequencies. Using the Harman profiles you’ll easily end up with material that’s in fact super sibilant and sizzly, without even realizing it.

The Git for the AutoEq presents pre-calclated results both for Harman In-Ear 2019 V2 and Harman Over-Ear 2018 curves. The Harman Over-Ear 2018 for an example looks like below. Not a curve you’d want to use for critical listening IMO.


So, we will have to create our own profiles, and somehow get these into Bitwig.

This requires a bit of work since you’ll need to install Python on your computer. The Github page has quite good instructions for this, and you’ll need to follow them next. Read them carefully and follow all the steps. I didn’t create a virtual environment though and everything works just fine. I don’t really even understand what that is since I’m not a coder. Someone has probably a smart reason to create one to run the code on, but I can live without that knowledge for now.

When everything is set up, you can use a command like this to create a new profile:

“python3 –input_dir=”./measurements/innerfidelity/data/onear/AKG Q701 Quincy Jones” –output_dir=”my_results/Q701-innerfidelity-flat” –compensation=”compensation/zero.csv” –equalize –show_plot –max_filters=8+8 –fs=44100 –max_gain=12 –parametric_eq –convolution_eq –phase=both”

(I’m using python3 instead of python because of the way Python is set up on my computer)

So the script needs the source data, and a target. For a target I’m using a flat curve. The rest of the parameters are explained in the documentation. I create 8+8 bands, so I’ll have a maximum of 16 bands for using with a serial setup of two EQ+ devices. I’m also using the phase=both parameter so that the script generates both a minimum and linear phase impulse for convolution. If you don’t know about the difference between these, there’s a lot of information about this on the internet. Both types have their strengths and weaknesses.

One thing to be aware of is that it’s very hard to make neutral headphone measurements in the first place. The driver element is very close to a “wall” (your head) and a resonant cavity (your ear canal) so that lots of minute differences in the headphone placement and head and ear shape would give a different frequency response for any individual listener. What this means in practice is that all of the measurements are a bit different. The AutoEq project comes now with headphonecom, innerfidelity, oratory1990, referenceaudioanalyser and rtings data. There is no way to tell which of these will give the “best” result for you. The only way is really to try out them all and listen and compare them critically against a known good soundsystem or your own best judgement.

In my case for an example, the innerfidelity profile made my already great AKG Q701 headphones sound even better. But for my secondary headphones, the Beyerdynamic Custom One Pro, the innerfidelity profiles were completely useless and resulted in a outcome that had veryt hin bass and a super loud and overamplified treble end of the spectrum. In the case of the Custom One Pros, the referenceaudioanalyser profile resulted in a much more even sound.

But what if I don’t want to install python and go through all this trouble? It sounds like a lot of boring work and I’m busy?

In that case, the provided Harman profiles on the Github page are also useful to give a second opinion about your mix.

Let’s assume you are using the Sennheiser HD650 headphones. Several options for measurements exist for them, but for an example the innerfidelity data is in the folder :

In each results folder there is (if the parameter “– show plot” was used when making your own) an image that looks like this:

Sennheiser HD 650.png

The grey-black line is the measured one. From this you will see that in the case of this product Sennheiser targeted the Harman curve (like almost every other headphone manufacturer), and since I used to own a pair of these in the past, I can believe the measurement. Slightly dark highs and a bit weak sub-bass on the cost of a bit bumped high-lows around 150hz, but otherwise a quite even curve besides that common 3K peak.

The blue is curves are the target, which in the case of the ones provided on Github are always one the Harman preferred curves with an additional added bass bump.

The reds are the difference between the measurement and the target curve, and the greens are the EQ curve required to arrive (as closely as possible) at the target (blue) curve.

In the directory are also two text files with settings for parametric equalisers. For the HD650, the one for parametric equalisers looks like this:

Preamp: -6.3 dB
Filter 1: ON PK Fc 23 Hz Gain 6.2 dB Q 0.47
Filter 2: ON PK Fc 168 Hz Gain -2.7 dB Q 0.74
Filter 3: ON PK Fc 2073 Hz Gain 1.0 dB Q 3.92
Filter 4: ON PK Fc 5297 Hz Gain 1.7 dB Q 2.63
Filter 5: ON PK Fc 7864 Hz Gain 3.2 dB Q 2.01
Filter 6: ON PK Fc 1196 Hz Gain -1.3 dB Q 1.98
Filter 7: ON PK Fc 1613 Hz Gain 0.6 dB Q 0.57
Filter 8: ON PK Fc 3271 Hz Gain -1.7 dB Q 3.10
Filter 9: ON PK Fc 4164 Hz Gain 1.3 dB Q 3.60
Filter 10: ON PK Fc 4741 Hz Gain -0.6 dB Q 3.22

Now it’s just a matter of typing those numbers in EQ+. The data provided on the Github is always for ten bands, so they can’t catch every peak required. I use the parameter “–max_filters=8+8” myself. This creates the parameters so that the first eight are the most relevant, catching the general shape, and the remaining 8 are optional, adding detail. This is so that since I anyway need two EQ+ devices to house more than 8 bands, I have the option of disabling the second one (for any reason whatsoever) without compromising the correction. I’m not sure if this is better than using “–max_filters=16”, you’ll need to make your own listening tests and make up your own opinion.

I have set up the correction in a FX Selector layer so that I can easily switch and compare between different profiles and methods. The first one has a flat profile (you’ll see in the image how the first EQ+ instance holds the bulk of the correction, and the rest has just some small details), the second one a Harman Over-Ear 2018 profile, and in the last I have placed a convolution processor with the linear phase response loaded with a flat target.

This might change in the future, but for now (BW 3.3.7) we regrettably don’t have a native convolution processor available. I’m using the LMS Impulse Response plugin myself since I’m on Linux. For Windows there’s several free options available like SIR etc. Personally I think the linear phase impulse sounds the most neutral, but the correction by EQ+ is good too. The difference in the case of the Q701 profile at least is in how upfront the sound is. The correction produced by EQ+ has more high end than either of the impulses, even though theoretically they aim at the same target. I’m not sure if this is some alising artefact, some internal saturation in EQ+, or just some phase charasteristic of the filters in EQ+.

The Peak Limiter allows to adjust the overall sound since in order to make sure that no signal will cause clipping, there needs to be quite a bit of negative gain in the beginning of the chain (the text file will always provide this information).

So. That’s about it!

Remember that the “flat” profile will in reality be nowhere close to a really flat response, but at least personally I feel that the correction I was getting with my main headphones is relevant, and best of all none of this costs anything, so this is a great alternative to one of the commercial options on the market.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.