About This Project
AutoEQ is a project for equalizing headphone frequency responses automatically, and it achieves this by parsing frequency response measurements and producing equalization settings which correct the headphone to a neutral sound. This project currently has over 4000 headphones covered in the results folder. See Usage for instructions how to use the results with different equalizer softwares and Results section for details about parameters and how the results were obtained.
AutoEQ is not just a collection of automatically produced headphone equalization settings but also a tool for equalizing
headphones for yourself.
autoeq.py provides methods for reading data, equalizing it to a given target
response and saving the results for usage with equalizers. It's possible to use different compensation (target)
curves, apply tilt for making the headphones brighter/darker and adding a bass boost. It's even possible to make one
headphone sound (roughly) like another headphone. For more info about equalizing see Equalizing. If
you're looking for something light weight to install as a dependency for your own project, you'll find
autoeq-pkg much more suited for your needs.
Third major contribution of this project is the measurement data and compensation curves all in a numerical format except for Crinacle's raw data. Everything is stored as CSV files so they are easy to process with any programming language or even Excel.
Sennheiser HD 800 equalization results plotted
AutoEQ produces settings for basically all types of equalizer apps.
Convolution equalizer is the most powerful type of equalizer software. These equalizers allow extremly precise control over the frequency response and the results are the same on all devices and platforms when using the same FIR filter. Convolution equalizer is the preferred way to use AutoEq results.
AutoEq supports convolution equalizers with FIR filters as WAV files and with EqualizerAPO's GraphicEQ filter type. The default results contain FIR filters for both 44.1 kHz and 48 kHz sampling rates. Other sampling rates are supported but not given in the default results. EqualizerAPO's GraphicEQ works with any sampling rate.
To use the FIR filters, download the appropriate WAV file and import it to the EQ software of your choice. Please keep in mind that not all EQ softwares support convolution. Some equalizers can load multiple FIR filters at the same time. Download both WAV files, create a Zip file containing both and load the Zip file to for example Roon.
See EqualizerApo for instructions on how to use the GraphicEQ.
Parametric equalizers have filters (bands) with user adjustable gain, center frequency and quality Q. Keep in mind that parametric eq accuracy depends on the number of filters available. Usually 10 filters produce very good results but as little as 5 can be good enough. Keep in mind that different parametric equalizers will produce different outcomes with the same parameter values. Parameters produced by AutoEq are equal with EqualizerAPO using 44.1 kHz sampling rate. When using other equalizers or sampling rates, it's always highly recommended to check that the frequency response of the equalizer matches the parametric eq curve in the graphs.
All parametric equalizer except Peace require you to configure the filter parameters manually with the software user
interface. Some parametric equalizer use filter width (band width) instead of Q. Filter width can be calculated as:
bw = Fc / Q where
bw is the band width in Herts,
Fc is center frequency and
Q is quality. Filter width in
octaves can be calculated as:
N = ln(1 + 1/(2*Q^2) + sqrt(((2*Q^2 + 1) / Q^2 )^2 / 4 - 1)) / ln(2) where
ln is the
natural logarithm. See http://www.sengpielaudio.com/calculator-bandwidth.htm for an online calculator.
It's very important to set preamp according to the value given in the result README.md document. Parametric eq filters will produce positive gains and to avoid clipping a preamp with negative gain is required.
Parametric eq settings can be used with Peace or any other parametric eq which has at least 5 bands available. Even fewer bands is possible but pre-computed results require you to use at least the five first of the filters. Parametric equalizer filter parameters look like this:
|LowShelf||105 Hz||0.70||6.3 dB|
|Peaking||162 Hz||0.91||-2.3 dB|
|Peaking||2237 Hz||1.94||-4.6 dB|
|Peaking||6093 Hz||2.26||-4.7 dB|
|Peaking||8251 Hz||3.71||-2.9 dB|
Fixed Band Equalizers
Fixed band eq is more commonly known as graphic equalizer but in order not to confuse with EqualizerAPO GraphicEQ it is called like that in this project. Fixed band equalizer is like parametric equalizer with several peaking filters but don't have adjustable frequency information, only gain. All other types are preferred over fixed band equalizers but on some devices these are the only available ones.
Fixed band equalizers have trouble compensating for narrow notches and peaks that fall between two bands. Good example is Sennheiser HD 800 with it's 6 kHz peak that is right in between 4 kHz and 8 kHz bands of standard 10-band equalizer. When using 10-band equalizer check if the fixed band equalization curve is very different than the desired equalization curve at some frequency and adjust the nearby filters by ear for best results.
Fixed band equalizer settings look like this:
|Peaking||31 Hz||1.41||6.1 dB|
|Peaking||62 Hz||1.41||3.0 dB|
|Peaking||125 Hz||1.41||-1.1 dB|
|Peaking||250 Hz||1.41||-2.2 dB|
|Peaking||500 Hz||1.41||-0.9 dB|
|Peaking||1000 Hz||1.41||0.1 dB|
|Peaking||2000 Hz||1.41||3.6 dB|
|Peaking||4000 Hz||1.41||-1.0 dB|
|Peaking||8000 Hz||1.41||-4.1 dB|
|Peaking||16000 Hz||1.41||-7.5 dB|
It's possible to use plain EqualizerAPO and edit configuration file in
C:\Program Files\EqualizerAPO\config\config.txt. Replace contents of the file with the GraphicEQ.txt file found in
results. Preamp is not needed because it is incorporated into the GraphicEQ line. Using
Sennheiser HD 650
would make config file look like this:
GraphicEQ: 20 -0.5; 21 -0.5; 22 -0.5; 23 -0.5; 24 -0.5; 26 -0.5; 27 -0.5; 29 -0.5; 30 -0.5; 32 -0.9; 34 -1.2; 36 -1.5; 38 -1.8; 40 -2.1; 43 -2.4; 45 -2.4; 48 -2.5; 50 -2.6; 53 -3.0; 56 -3.2; 59 -3.3; 63 -3.6; 66 -4.0; 70 -4.5; 74 -5.0; 78 -5.5; 83 -5.9; 87 -6.3; 92 -6.7; 97 -7.0; 103 -7.3; 109 -7.6; 115 -7.8; 121 -8.0; 128 -8.1; 136 -8.4; 143 -8.6; 151 -8.7; 160 -8.8; 169 -8.8; 178 -8.9; 188 -8.9; 199 -9.0; 210 -9.0; 222 -9.0; 235 -8.9; 248 -8.8; 262 -8.6; 277 -8.5; 292 -8.4; 309 -8.3; 326 -8.2; 345 -8.1; 364 -7.9; 385 -7.8; 406 -7.7; 429 -7.6; 453 -7.6; 479 -7.5; 506 -7.4; 534 -7.2; 565 -7.1; 596 -7.0; 630 -7.0; 665 -7.0; 703 -7.0; 743 -7.0; 784 -7.1; 829 -7.1; 875 -7.1; 924 -7.0; 977 -7.1; 1032 -7.2; 1090 -7.3; 1151 -7.2; 1216 -7.0; 1284 -6.9; 1357 -6.7; 1433 -6.4; 1514 -6.2; 1599 -6.1; 1689 -5.9; 1784 -5.6; 1885 -5.4; 1991 -5.2; 2103 -5.1; 2221 -5.2; 2347 -5.5; 2479 -5.8; 2618 -6.2; 2766 -6.6; 2921 -6.9; 3086 -7.0; 3260 -6.8; 3443 -6.2; 3637 -5.6; 3842 -5.1; 4058 -4.6; 4287 -4.2; 4528 -4.2; 4783 -4.8; 5052 -5.2; 5337 -4.8; 5637 -4.3; 5955 -4.7; 6290 -4.9; 6644 -4.7; 7018 -4.8; 7414 -5.7; 7831 -6.3; 8272 -6.5; 8738 -6.5; 9230 -6.5; 9749 -6.5; 10298 -6.5; 10878 -6.5; 11490 -6.5; 12137 -6.5; 12821 -7.8; 13543 -9.9; 14305 -9.7; 15110 -9.0; 15961 -11.0; 16860 -13.5; 17809 -14.5; 18812 -15.2; 19871 -15.7
EqualizerAPO has a graphical user interface for adjusting configurations. Launch the editor from
EqualizerAPO Editor GUI
Peace is a GUI for manipulating parametric eq filters with EqualizerAPO. Peace also has visualization for the end result equalization frequency response, profile manager for multiple different eq settings and a switch for disabling everything among other features. Load eq settings into Peace by clicking Import button and select the ParametricEQ.txt file. Set the preamp to value mentioned in the results.
Peace with full GUI for EqualizerAPO
Android has several different equalizer options but not too many powerful apps which work with all apps. Wavelet is the best option for newer Androids (version 9 and up) but older devices have a built-in fixed band equalizer which works system wide but the center frequencies and Q values vary so might need to produce your own results.
Wavelet is an Android app which comes with all the AutoEq eq profiles built in. The app works with all music apps so is closest to system-wide equalizer one can have on Android without rooting. The equalizer built into this app is very powerful and can represent the AutoEq profiles very accurately. There is also an option to tune the sound with graphic equalizer. Wavelet has the best Bluetooth device compatibility of all the tested eq apps on Android.
The main functionalities of Wavelet are free (including AutoEq profiles and graphic eq) but some extra features can be unlocked with an in-app purchase.
Neutron is a music player with parametric equalizer and comes with all of the AutoEq profiles built in but is not free.
USB Audio Player PRO
USB Audio Player PRO is an Android app with improved USB audio drivers for usage with USB DACs. USB Audio Player PRO is not system-wide but works with local files and many streaming services though not with Spotify. USB Audio Player has Toneboosters Morphit plugin which has parametric equalizer. This app and the plugin are not free.
Music EQ Equalizer
The best app for system wide equalization on older Android phones (without rooting) is Music Equalizer EQ which is a 10-band standard equalizer. Gains for each band can be adjusted with only 1 dB resolution but this isn't a problem because the average error is then only 0.25 dB, hardly noticeable. Bigger problem is the potential narrow peaks and notches between the bands' center frequencies since there isn't really anything that can be done for those. See notes about fixed band equalizers.
The app starts in the presets view so you need to click the left arrow in the top left corner to get to the manual view. Here you can adjust the bands. Set each band level to the closest value to what the equalization settings ask. Pre-computed results only support standard 10-band equalizers which have band center frequencies at 31, 63, 125, 250, 500, 1000, 2000, 4000, 8000 and 16000 Hz. Q values are not adjustable so you don't have to worry about those even though they are given in the result settings.
Viper4Android is a system-wide convolution based equalizer (and much more) on Android but it requires rooting of the device. Viper4Android is supported with impulse response (WAV) files. For rooted users this is the best option.
JamesDSP is an alternative to Viper4Android. It provides a system wide solution, has a convolution engine but requires rooting.
PulseEffects / EasyEffects
PulseEffects / EasyEffects is a Linux module with wide variety of signal processing tools including convolution and parametric equalizers.
From version 4.7.2 onwards PulseEffects added support for convolution FIR filters. This is the recommended way to apply
AutoEq presets. Navigate to the plugins tab and add the convolver plugin, then click the waveform button above the stereo width controls (or just the 'Impulses' button as of 6.1.x), click "Import impulse" and select the AutoEq
generated WAV file. You may also need to manually click 'load' in the Impulses menu for the filter to be fully loaded. PulseEffects' convolver requires you to set the input gain to prevent clipping. The gain required
by parametric eq should be sufficient, maybe 0.5 dB of negative gain more. Depending on the version, you may need to
.wav file as
To use parametric eq, from version 6.0.0 onwards, first select the
plugins tab at
the bottom of the screen, add the equalizer plugin, and load APO settings by clicking "Load APO Preset" and
selecting the ParametricEQ.txt file. For EasyEffects <= 6.1.3, Pre-amp can be adjusted with the input slider.
Later versions support reading this from ParametricEQ.txt.
From version 5.0.0 onwards, PulseEffects was renamed to EasyEffects and uses PipeWire instead of PulseAudio as backend. Load eq settings by clicking the top center cog & clicking Import ACO Presets button and select the ParametricEQ.txt file. Pre-amp can be adjusted with the input slider.
For versions prior to v4.8.0, adjust filter parameters by clicking the cog button on each filter and set type to "Bell", mode to "APO" and adjust the gain with the slider. Number of filters can be changed by clicking the screwdriver and wrench button.
OSX / MacOS
System wide parametric EQ solutions on OSX typically rely on separate plugin hosting software and the actual plugin which does the actual equalization.
Pardon the lack of documentation for these. I have not tested any of the methods myself but they have been suggested by helpful AutoEQ users.
SoundSource is the easiest way to use AutoEq on Mac since it comes with all of the profiles built in. The software is however not free.
Audio plugin hosts include:
- Apple's own AU Lab hosts AU plugins and can be used as a system-wide audio output via BlackHole or Soundflower.
- MenuBus has a free version but is no longer actively developed.
- Hosting AU with BlackHole or Soundflower can be used as a system wide AU plugin host.
EQ plugins include:
- Voxengo PrimeEQ is a parametric EQ plugin but is not free.
- Fabfilter Pro Q3 is another parametric EQ plugin, more expensive than Voxengo but might be easier to install and use. Note: Pro Q3 uses a different system and all Q values need to be multiplied by 1.41!
- LAConvolver plugin is a free convolver EQ which works with impulse response WAV files.
- AUNBandEq comes built in with Mac OSX. Works at least with HostingAU + BlackHole
iOS unfortunately doesn't allow system-wide equalizers, so the only options are either music players with built-in equalizer or hardware solutions.
Neutron is a music player with parametric equalizer and comes with all of the AutoEq profiles built in but is not free.
EQE is a system wide parametric equalizer on iOS but requires jailbreaking. Here are instructions on how to set it up: https://www.reddit.com/r/headphones/comments/dqbt81/psa_if_you_have_a_jailbroken_iphone_you_can/
Some devices have built-in equalizers and since they do the processing in the device, they work with any source which can connect to the device.
Qudelix 5K is a portable DAC and amplifier with wired and Bluetooth connectivity and 10 band parametric equalizer.
Radsone EasStudio ES100 is a Bluetooth DAC and amp with built-in 10 band equalizer. Since this is a hardware solution it will work with practically any source.
autoeq.py is the tool used to produce the equalization results from measurement data. There is no
fancy graphical user interface but instead it is used from command line.
- Download and install Git: https://git-scm.com/downloads. When installing Git on Windows, use Windows SSL verification instead of Open SSL or you might run into problems when installing project dependencies.
- Download and install 64-bit Python 3.10. Make sure to check Add Python 3.10 to PATH.
- You may need to install libsndfile if you're having problems with
- On Linux you may need to install Python dev packages
sudo apt install python3-dev python3-pip python3-venv
- On Linux you may need to install pip
- On Windows you may need to install Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017, and 2019
- Open a terminal / command prompt. On Windows, search
cmdin the start menu.
- Clone AutoEq
git clone https://github.com/jaakkopasanen/AutoEq.git
- Go to AutoEq location
- Check Python version. You should see Python 3.10.x printed out. If you see for example 3.11.x, you need to install Python 3.10.
- Create a python virtual environment
python -m venv venv
- Activate virtualenv
# On Windows venv\Scripts\activate.bat # On Linux and Mac . venv/bin/activate
- Update pip
python -m pip install -U pip
- Install required packages
python -m pip install -U -r requirements.txt
- Verify installation. If everything went well, you'll see the list of command line parameters AutoEq accepts.
python autoeq.py --help
When coming back at a later time you'll only need to activate virtual environment again
# On Windows cd AutoEq venv\Scripts\activate.bat # On Linux and Mac cd AutoEq . venv/bin/activate
To learn more about virtual environments, read Python' venv documentation.
AutoEq is in active development and gets new measurements, results and features all the time. You can get the latest version from git
Dependencies may change from time to time, you can update to the latest with
python -m pip install -U -r requirements.txt
Command Line Arguments
usage: autoeq.py [-h] --input_dir INPUT_DIR [--output_dir OUTPUT_DIR] [--standardize_input] [--new_only] [--compensation COMPENSATION] [--equalize] [--parametric_eq] [--fixed_band_eq] [--rockbox] [--ten_band_eq] [--parametric_eq_config PARAMETRIC_EQ_CONFIG] [--fixed_band_eq_config FIXED_BAND_EQ_CONFIG] [--convolution_eq] [--fs FS] [--bit_depth BIT_DEPTH] [--phase PHASE] [--f_res F_RES] [--bass_boost BASS_BOOST] [--iem_bass_boost IEM_BASS_BOOST] [--tilt TILT] [--sound_signature SOUND_SIGNATURE] [--max_gain MAX_GAIN] [--window_size WINDOW_SIZE] [--treble_window_size TREBLE_WINDOW_SIZE] [--treble_f_lower TREBLE_F_LOWER] [--treble_f_upper TREBLE_F_UPPER] [--treble_gain_k TREBLE_GAIN_K] [--show_plot] [--thread_count THREAD_COUNT] options: -h, --help show this help message and exit --input_dir INPUT_DIR Path to input data directory. Will look for CSV files in the data directory and recursively in sub-directories. --output_dir OUTPUT_DIR Path to results directory. Will keep the same relative paths for files found in input_dir. --standardize_input Overwrite input data in standardized sampling and bias? --new_only Only process input files which don't have results in output directory. --compensation COMPENSATION File path to CSV containing compensation (target) curve. Compensation is necessary when equalizing because all input data is raw microphone data. See "compensation", "innerfidelity/resources" and "headphonecom/resources". --equalize Will run equalization if this parameter exists, no value needed. --parametric_eq Will produce parametric eq settings if this parameter exists, no value needed. --fixed_band_eq Will produce fixed band eq settings if this parameter exists, no value needed. --rockbox Will produce a Rockbox .cfg file with 10 band eq settings if this parameter exists,no value needed. --ten_band_eq Shortcut parameter for activating standard ten band eq optimization. --parametric_eq_config PARAMETRIC_EQ_CONFIG Name of parametric equalizer configuration or a path to a configuration file. Available named configurations are "10_PEAKING" for 10 peaking filters, "8_PEAKING_WITH_SHELVES" for 8 peaking filters and a low shelf at 105 Hz for bass adjustment and a high shelf at 10 kHz for treble adjustment, "4_PEAKING_WITH_LOW_SHELF" for 4 peaking filters and a low shelf at 105 Hz for bass adjustment, "4_PEAKING_WITH_HIGH_SHELF" for 4 peaking filters and a high shelf at 10 kHz for treble adjustments. You can give multiple named configurations by separating the names with commas and filter sets will be built on top of each other. When the value is a file path, the file will be read and used as a configuration. The file needs to be a YAML file with "filters" field as a list of filter configurations, each of which can define "fc", "min_fc", "max_fc", "q", "min_q", "max_q", "gain", "min_gain", "max_gain" and "type" fields. When the fc, q or gain value is given, the parameter won't be optimized for the filter. "type" needs to be either "LOW_SHELF", "PEAKING" or "HIGH_SHELF". Also "filter_defaults" field is supported on the top level and it can have the same fields as the filters do. All fields missing from the filters will be read from "filter_defaults". Defaults to "4_PEAKING_WITH_LOW_SHELF,4_PEAKING_WITH_HIGH_SHELF". Optimizer behavior can be adjusted by defining "optimizer" field which has fields "min_f" and "max_f" for lower and upper bounds of the optimization range, "max_time" for maximum optimization duration in seconds, "target_loss" for RMSE target level upon reaching which the optimization is ended, "min_change_rate" for minimum rate of improvement in db/s and "min_std" for minimum standard deviation of the last few loss values. "min_change_rate" and "min_std" end the optimization when further time spent optimizing can't be expected to improve the results dramatically. See peq.yaml for an example. --fixed_band_eq_config FIXED_BAND_EQ_CONFIG Path to fixed band equalizer configuration. The file format is the same YAML as for parametric equalizer. --convolution_eq Will produce impulse response for convolution equalizers if this parameter exists, no value needed. --fs FS Sampling frequency in Hertz for impulse response and parametric eq filters. Single value or multiple values separated by commas eg 44100,48000. When multiple values are given only the first one will be used for parametric eq. Defaults to 44100. --bit_depth BIT_DEPTH Number of bits for every sample in impulse response. Defaults to 16. --phase PHASE Impulse response phase characteristic. "minimum", "linear" or "both". Defaults to "minimum" --f_res F_RES Frequency resolution for impulse responses. If this is 20 then impulse response frequency domain will be sampled every 20 Hz. Filter length for impulse responses will be fs/f_res. Defaults to 10. --bass_boost BASS_BOOST Bass boost shelf. Sub-bass frequencies will be boosted by this amount. Can be either a single value for a gain in dB or a comma separated list of three values for parameters of a low shelf filter, where the first is gain in dB, second is center frequency (Fc) in Hz and the last is quality (Q). When only a single value (gain) is given, default values for Fc and Q are used which are 105.0 Hz and 0.71, respectively. For example "--bass_boost=6" or "--bass_boost=9.5,150,0.69". --iem_bass_boost IEM_BASS_BOOST iem_bass_boost argument has been removed, use "--bass_boost" instead! --tilt TILT Target tilt in dB/octave. Positive value (upwards slope) will result in brighter frequency response and negative value (downwards slope) will result in darker frequency response. 1 dB/octave will produce nearly 10 dB difference in desired value between 20 Hz and 20 kHz. Tilt is applied with bass boost and both will affect the bass gain. --sound_signature SOUND_SIGNATURE File path to a sound signature CSV file. Sound signature is added to the compensation curve. Error data will be used as the sound signature target if the CSV file contains an error column and otherwise the raw column will be used. This means there are two different options for using sound signature: 1st is pointing it to a result CSV file of a previous run and the 2nd is to create a CSV file with just frequency and raw columns by hand (or other means). The Sound signature graph will be interpolated so any number of point at any frequencies will do, making it easy to create simple signatures with as little as two or three points. --max_gain MAX_GAIN Maximum positive gain in equalization. Higher max gain allows to equalize deeper dips in frequency response but will limit output volume if no analog gain is available because positive gain requires negative digital preamp equal to maximum positive gain. Defaults to 6.0. --window_size WINDOW_SIZE Smoothing window size in octaves. --treble_window_size TREBLE_WINDOW_SIZE Smoothing window size in octaves in the treble region. --treble_f_lower TREBLE_F_LOWER Lower bound for transition region between normal and treble frequencies. Treble frequencies can have different max gain and gain K. Defaults to 6000.0. --treble_f_upper TREBLE_F_UPPER Upper bound for transition region between normal and treble frequencies. Treble frequencies can have different max gain and gain K. Defaults to 8000.0. --treble_gain_k TREBLE_GAIN_K Coefficient for treble gain, affects both positive and negative gain. Useful for disabling or reducing equalization power in treble region. Defaults to 1.0. --show_plot Plot will be shown if this parameter exists, no value needed. --thread_count THREAD_COUNT Amount of threads to use for processing results. If set to "max" all the threads available will be used. Using more threads result in higher memory usage. Defaults to 1.
Reproducing pre-computed results for oratory1990 measured on-ear headphones:
python autoeq.py --input_dir="measurements/oratory1990/data/onear" --output_dir="my_results/oratory1990/harman_over-ear_2018" --compensation="compensation/harman_over-ear_2018_wo_bass.csv" --equalize --parametric_eq --parametric_eq_config=8_PEAKING_WITH_SHELVES --ten_band_eq --bass_boost=4.0 --convolution_eq --fs=44100,48000
Reproducing pre-computed results for Rtings measured IEMs:
python autoeq.py --input_dir="measurements/rtings/data/inear" --output_dir="my_results/rtings/avg" --compensation="measurements/rtings/resources/rtings_compensation_avg.csv" --equalize --parametric_eq --parametric_eq_config=8_PEAKING_WITH_SHELVES --ten_band_eq --bass_boost=6.0 --convolution_eq --fs=44100,48000
All parameters used for pre-computed results can be found in the
Equalizing Individual Headphones
Equalizing Sennheiser HD 650 and saving results to
python autoeq.py --input_dir="measurements/innerfidelity/data/onear/Sennheiser HD 650" --output_dir="my_results/HD650" --compensation="measurements/innerfidelity/resources/innerfidelity_harman_over-ear_2018_wo_bass.csv" --equalize --bass_boost=4 --show_plot --convolution_eq --fs=44100,48000
Fixed Band Equalizers
Fixed band equalizer settings can be produced the same way as parametric eq. Create
fbeq.yaml with contents
filter_defaults: type: PEAKING q: 1.05 filters: - fc: 400 - fc: 1000 - fc: 2500 - fc: 6300 - fc: 16000
to optimize for Sony WH-1000XM3 app.
python autoeq.py --input_dir="measurements/oratory1990/data/onear/Sony WH-1000XM3" --output_dir="my_results/Sony WH-1000XM3 (app)" --compensation="compensation/harman_over-ear_2018_wo_bass.csv" --equalize --bass_boost=4.0 --fixed_band_eq --fixed_band_eq_config=fbeq.yaml
Using Sound Signatures
AutoEQ provides a way to play around with different sound signatures easily. The use-cases include making headphones deviate from the neutral target or making one headphone sound like another.
Equalizing Sennheiser HD 800 to sound like Sennheiser HD 650 using pre-computed results. Both have been measured by oratory1990 so we'll use those measurements. Pre-computed results include 4dB of bass boost for over-ear headphones and therefore we need to apply a bass boost of 4dB here as well.
python autoeq.py --input_dir="measurements/oratory1990/data/onear/Sennheiser HD 800" --output_dir="my_results/Sennheiser HD 800 (HD 650)" --compensation="compensation/harman_over-ear_2018_wo_bass.csv" --sound_signature="results/oratory1990/harman_over-ear_2018/Sennheiser HD 650/Sennheiser HD 650.csv" --equalize --parametric_eq --max_filters=5+5 --ten_band_eq --bass_boost=4 --convolution_eq --fs=44100,48000
Equalizing Massdrop x Sennheiser HD 800 to sound like AKG K701. There is no K701 measurement made by oratory1990 so we'll use Innerfidelity's measurement for the sound signature. The list of recommended results always points to best measurement so you can check there which one to use (measurement system can be found in the URL).
python autoeq.py --input_dir="measurements/oratory1990/data/onear/Sennheiser HD 800" --output_dir="my_results/Sennheiser HD 800 (K701)" --compensation="compensation/harman_over-ear_2018_wo_bass.csv" --sound_signature="results/innerfidelity/innerfidelity_harman_over-ear_2018/AKG K701/AKG K701.csv" --equalize --parametric_eq --max_filters=5+5 --ten_band_eq --bass_boost=4 --convolution_eq --fs=44100,48000
Equalizing HiFiMAN HE400S to sound like Massdrop x Meze 99 Noir. HE400S is measured only by Innerfidelity so we'll point compensation file pointing to Innerfidelity's calibrated Harman target. Meze 99 Noir has massive natural bass boost and to capture that we need to relax max gain to +12dB.
python autoeq.py --input_dir="measurements/innerfidelity/data/onear/HiFiMAN HE400S" --output_dir="my_results/HE400S (99 Noir)" --compensation="measurements/innerfidelity/resources/innerfidelity_harman_over-ear_2018_wo_bass.csv" --sound_signature="results/oratory1990/harman_over-ear_2018/Meze 99 Noir/Meze 99 Noir.csv" --equalize --parametric_eq --max_filters=5+5 --ten_band_eq --bass_boost=4 --max_gain=8
Applying V-shaped sound signature to Audeze Mobius. First step is to create the sound signature file. Save this to
frequency,raw 20,4.0 1000,-4.0 10000,4.0 20000,0.0
Then use it by providing the path to
--sound_signature parameter. We'll set bass boost to 0dB because the sound
signature already has a significant bass boost. Of course it's possible to add bass boost on top of the sound signature
file if you want even more bass.
python autoeq.py --input_dir="measurements/rtings/data/onear/Audeze Mobius" --output_dir="my_results/Audeze Mobius (V-signature)" --compensation="measurements/rtings/resources/rtings_compensation_avg.csv" --sound_signature="my_data/v.csv" --equalize --parametric_eq --max_filters=5+5 --ten_band_eq --bass_boost=4.0
The main principle used by AutoEQ for producing the equalization function is to invert the error curve. Error is the difference between raw microphone data and the compensation (target) curve. If headphone's frequency response is 4 dB below the target at 20 Hz equalization function will have +4 dB boost at 20 Hz. In reality simply inverting the error is not sufficient since measurements and equalization have several problems that need to be addressed, see Technical Challenges for more details.
Results provided in this project currently have all the headphone measurements from
- Reference Audio Analyzer
- Rtings with the exception of Reference Audio Analyzer measurements done on the SF1 system.
Results are organized by
source/target/headphone so a Sennheiser HD 650 measured by Innerfidelity and tuned to a
calibrated Harman target would be found in
innerfidelity/innerfidelity_harman_over-ear_2018/Sennheiser HD 650.
Multiple measurements of the same headphone by the same measurement entity are averaged. All different measurements for
averaging have been renamed with snXXX (serial number) or sample X in the end of the name to distinguish from the
averaged data which has no suffixes in the name.
oratory1990 measurements have been done on Gras 43AG and 43AC couplers, the same which were used to develop Harman
target responses by Olive et al. and therefore use Harman target responses for the equalization targets. These results
are recommended over all other measurements because of this reason. Harman target data is in the
Crinacle's in-ear measurements have been performed with IEC 60318-4 coupler and are therefore compatible with Harman in-ear targets. This fact also earns Crinacle's measurements second highest ranking recommendation after oratory1990. Crinacle's over-ear measurements use the same ear simulator attached to a MiniDSP ears pinna. The measurements done on this system are not as accurate as oratory1990's but because of the high quality ear simulator, these are a bit better than rest.
Innerfidelity, Rtings and Headphone.com measurements have been performed on Head Acoustics HMSII.3 measurement system. This system is not an industry standard anymore because of the rigid pinnae. The Headphone.com measurements are the old ones which are no longer available. These are not to be consfused with the new measurements Resolve is producing using GRAS system.
Reference Audio Analyzer have three different measurement systems none of which seem to represent human hearing particularly well. The most recent HDM-X system is close to the Head Acoustics HMSII.3 systems but seems to suffer a bit more in the bass range. HDM1 is clearly worse than other systems and the measurements done on the SF1 system are not included at all because that is a flat plate coupler. IEM measurements are done with what looks like a tubing coupler and these don't look very accurate. Reference Audio Analyzer measurements and results are a last resort.
All of the results use frequency response targets that were specifically developed for this project except oratory1990 and Crinacle's IEM measurements which use standard Harman targets. The target curves were developed by calibrating measurements against reference measurements by oratory1990 and Crinacle (IEMs) and modifying the Harman 2018 over-ear and 2019 in-ear targets with the calibration data.
None of these targets have bass boost seen in Harman target responses and therefore a +4dB boost was applied for all over-ear headphones, +6dB for in-ear headphones and no boost for earbuds. Harman targets actually ask for about +6dB for over-ears and +9dB for in-ears but since some headphones cannot achieve this with positive gain limited to +6dB, a smaller boost was selected. Above 6 to 12 kHz data is filtered more heavily to avoid equalizing the narrow dips and notches that depend heavily on the listener's own ears.
oratory1990 IEM Target
In-ear results with oratory1990 target (formerly "Usound" target) are not longer given because the new 2019 Harman in-ear fixes the +10 kHz problems of the 2017 target. Also it is easy to transform results created for Harman 2019 to oratory1990 target without running the processing yourself if you are using parametric equalizer and have two filters (bands) available by adding these two to your eq software:
The results will be remarkably similar to results produced with the actual oratory1990 target:
Of course it's still possible to produce native results with oratory1990 target by pointing compensation to the
oratory1990 target file:
Innerfidelity Target by Super Best Audio Friends Forum User "Serious"
Innerfidelity and Headphone.com measured headphones previously used
SBAF-Serious target only.
The SBAF-Serious curve is no longer used for these measurements since a new targets were developed by calibrating Harman
targets. This is a modified version of Innerfidelity target curve produced by a user called Serious on Super Best Audio
Friends forum. This curve doesn't have any glaring problems and is quite well balanced overall. Curve was turned into a
compensation for raw microphone data and tilted 0.2 dB / octave brighter. Innerfidelity measurements are recommended
over Headphone.com measurements because SBAF-Serious target was developed for Innerfidelity. SBAF-Serious curve was
modified to be suitable for Headphone.com measurements. CSV data files for Innerfidelity and
Headphone.com are at
Rtings measured headphones have a frequency response target made for this project. This treble average target is using an average of frequency responses of all Rtings measured headphones in the treble range with small manual reduction of the 9kHz peak and the Rtings native response below 2500 Hz without bass boost. Three different targets were compared in listening tests and the treble average target was found to sound the best. Other two were the Rtings native target curve and calibrated and uncalibrated versions of SBAF Serious target curve. Rtings uses the same measurement system as Innerfidelity uses so in theory the uncalibrated SBAF Serious target should work similarly with Rtings but listening tests found the treble average target to be slightly better. Rtings have a very informative video about how they are doing the measurements and how they came up with the target they use.
All of these Rtings targets retired when new calibrated Harman targets were developed for Rtings measurements.
Simply inverting headphone frequency response deviation from target response does not usually produce sufficient results. Some problems are caused by imperfections in measurements, some are reliability issues and some are practical end-user problems. Rtings has a good video on Youtube about measurement system challenges and solutions which is definitely worth checking out. Innerfidelity also has a very educational video on Youtube about measurements and what constitutes as a neutral sound. Main takeoffs are that bass and treble measurements are very inconsistent, neutral sound is not very well defined yet and on-ear headphones have big reliability problems in 8 to 9kHz range due to resonances which move when headphone placement is changed. Harman international has done some solid research into preferred headphone frequency response but since that research was done on a different measurement system the target does not apply directly to Innerfidelity (Summer 2018) and Headphone.com measurements.
There is very little that can be done for fighting bass inconsistencies because the same problems will be there whether equalization is used or not. Headphones simply have different bass responses on different listeners (heads). Therefore bass is taken as is in AutoEQ and equalized as if there was nothing wrong with it. Your mileage may vary. Luckily bass has smaller impact on music and having too much bass (especially sub-bass) doesn't create problems of the same magnitude as having too much treble.
Moving resonances around 8 to 9kHz may cause big problems if not taken into account. Spikes and dips in this range are of great amplitude and very narrow. If one equalizes these spikes and dips according to frequency response measurement in worst case scenario a spike will move in a place of dip when headphone is moved, and therefore the spike is amplified significantly, leading to a very sharp and piercing sound signature. To counter these problems by default AutoEQ uses heavy smoothing and limited positive gain above 6 to 8kHz. This way the equalization will follow a broader trend of the region and will not care so much about narrow spikes and dips. Also positive gain is limited to 0dB as an extra safety measure against amplifying spikes due to moving the headphone. Suppressing a narrow dip even further is not an optimal thing to do but in practice has little negative effect on the sound. Both of these measures will also alleviate upper treble measurement inconsistencies above 11 to 12 kHz.
A practical end-user problem is if too high positive gain is allowed which asks for equal amount of negative digital
pre-amp to prevent clipping. This negative preamp will limit maximum volume produced by the system if there is no analog
gain available. If a dedicated headphone amplifier is available or if the motherboard/soundcard can drive the headphones
loud enough even when using high negative preamp larger
--max_gain values can be used. By default
--max_gain is set
to +6dB so as not to cripple the user's volume too much. Max gain will clip the equalization curve which produces sharp kinks
in it. Sharp changes in equalization may produce unwanted equalization artifacts. To counter this AutoEQ rounds the
corners whenever max gain clips the curve.
Parametric Equalizer Optimization
AutoEQ has an optimizer to fit several filters to the desired equalization curve. Optimization is an iterative process where the filter parameters which provide the best results are searched until optimization finishes or any of the early stopping conditions are met.
The optimizer can be configured quite flexibly. The filter type (peaking, low shelf or high shelf) and minimum and maximum values for center frequency (fc), quality (q) and gain can be set as well as disable optimization for any of these in favor of fixed value. The optimizer itself can be configured to stop the process early when the changes being made are too small, a target error level has been reached or maximum amount of time has been used.
peq.yaml has an example configuration. Feel free to adjust the file to your needs.
Here's an animation of what happens during the optimization.
Optimization of parametric eq filters (click to play again)
Technically speaking the optimization is an error minimization process. The error is the root mean squared difference between the equalization target and the frequency response from the current set of filter parameters. The optimizer adjusts the filter parameters multiple times on each iteration to figure out in which direction each should be adjusted to decrease the error. In addition to the RMSE between target and current equalizer frequency response, the undesired combination of filter parameters is penalized. Currently that means adding more error if the filter has positive gain and too steep slope (as this can cause audible ringing). The additional error (regularization) ensures the optimizer doesn't produce these kinds of filter parameter combinations.
The > 10 kHz frequency range is treated as a single average level because research indicates that the perceived sound quality is not sensitive to accurately following a curve above 10 kHz but rather a total energy in the range.
Issues are the way to go if you are experiencing problems or have ideas or feature requests. Issues are not the correct channel for headphone requests because this project sources the measurements from other databases and a headphone missing from AutoEq means it has not been measured by any of the supported sources.