autoeq.app Is a Web Application for Equalizing Headphones the Easy Way
May 14, 2023 at 9:03 AM Thread Starter Post #1 of 16

jaakkopasanen

100+ Head-Fier
Joined
Feb 5, 2018
Posts
315
Likes
268
Location
Helsinki, Finland
AutoEq is a project for automatically equalizing headphones. While this project is now familiar to many people engaged in headphone hobby, it has always been a bit of a pain to use if you want anything else than the pre-computed presets.

autoeq.app is a web app using AutoEq but now with a graphical user interface in the browser without needing to install anything yourself. All the same features and power that has made AutoEq great is now available on any device in your browser. The main driver behind developing a web app was to give an easy way for users to tweak their experience and not needing to settle for the single preset.

It's well know at this point that the preferred bass and treble levels are very individual and therefore should always be optimized. There are a lot more than those two though and I encourage you to explore the advanced parameters in the app. The player in the app simulates whatever equalizer app you choose so that you can quickly tweak and compare different profiles without needing to alwyas import them to the eq app.

You can even create completely custom changes to the frequency response target with sound signature or copy a sound signature from another headphone to simulate (roughly) other headphones on your single pair.

A fair bit of design, development and testing has gone into this app but no doubt there are still problems and room for improvement. Please share your opinions and discoveries in the comments and I'll take them to consideration for future updates.

I've also updated all measurements in the same release so all the data you have in the app (and the Github repo) are now the latest and greatest from all supported sources.
 
May 16, 2023 at 3:36 AM Post #2 of 16
Amazing I will give it a try soon.
 
Jul 1, 2023 at 8:46 PM Post #5 of 16
I just discovered autoeq.app, and the interface is truly wonderful.

Many thanks to, and a question for, @jaakkopasanen, about customizing the target:

In the wiki, you say that "Even more control over the preference target can be had by creating sound signatures which allow customizing the target with an arbitrary curve." For my Focal Utopia 2022, I would like to customize the target such that the output convolution filter has less of a midrange dip, i.e., making the sound slightly more mid forward.

Essentially, I want to do what a +2db peaking filter at 1270 Hz with a Q of 1.7 would do. I imagine this would involve bringing up the target curve around 1270 Hz.

How would I do this? I know my way around REW, if that helps...


UPDATE:

I took a shot at it.
  1. I entered the parametric filter (above) in REW,
  2. Did Filter Tasks -> Generate measurement from filters,
  3. Exported the resulting measurement as text, and
  4. Pasted that text into the "Sound Signature" box in autoeq.app. I deleted the "phase(degrees)" column before pasting: is that fine?
 
Last edited:
Jul 2, 2023 at 6:21 AM Post #6 of 16
I just discovered autoeq.app, and the interface is truly wonderful.

Many thanks to, and a question for, @jaakkopasanen, about customizing the target:

In the wiki, you say that "Even more control over the preference target can be had by creating sound signatures which allow customizing the target with an arbitrary curve." For my Focal Utopia 2022, I would like to customize the target such that the output convolution filter has less of a midrange dip, i.e., making the sound slightly more mid forward.

Essentially, I want to do what a +2db peaking filter at 1270 Hz with a Q of 1.7 would do. I imagine this would involve bringing up the target curve around 1270 Hz.

How would I do this? I know my way around REW, if that helps...


UPDATE:

I took a shot at it.
  1. I entered the parametric filter (above) in REW,
  2. Did Filter Tasks -> Generate measurement from filters,
  3. Exported the resulting measurement as text, and
  4. Pasted that text into the "Sound Signature" box in autoeq.app. I deleted the "phase(degrees)" column before pasting: is that fine?
I if it looks and sounds right then it's probably right. You could have also done this simpler by adding something like this manually to sound signature box

Code:
frequency,raw
20,0
700,0
1270,2
2300,0
20000,0
 
Jul 2, 2023 at 11:10 AM Post #7 of 16
AutoEq is a project for automatically equalizing headphones. While this project is now familiar to many people engaged in headphone hobby, it has always been a bit of a pain to use if you want anything else than the pre-computed presets.

autoeq.app is a web app using AutoEq but now with a graphical user interface in the browser without needing to install anything yourself. All the same features and power that has made AutoEq great is now available on any device in your browser. The main driver behind developing a web app was to give an easy way for users to tweak their experience and not needing to settle for the single preset.

It's well know at this point that the preferred bass and treble levels are very individual and therefore should always be optimized. There are a lot more than those two though and I encourage you to explore the advanced parameters in the app. The player in the app simulates whatever equalizer app you choose so that you can quickly tweak and compare different profiles without needing to alwyas import them to the eq app.

You can even create completely custom changes to the frequency response target with sound signature or copy a sound signature from another headphone to simulate (roughly) other headphones on your single pair.

A fair bit of design, development and testing has gone into this app but no doubt there are still problems and room for improvement. Please share your opinions and discoveries in the comments and I'll take them to consideration for future updates.

I've also updated all measurements in the same release so all the data you have in the app (and the Github repo) are now the latest and greatest from all supported sources.
I just want to send a huge thanks for this and all the work you have put into this; for someone with more curiosity than expertise and experience like me, you work is invaluable. I can imagine the time it takes so just wanted to send a big thanks for your generosity. Alan
 
Jul 2, 2023 at 12:15 PM Post #8 of 16
I if it looks and sounds right then it's probably right. You could have also done this simpler by adding something like this manually to sound signature box

Code:
frequency,raw
20,0
700,0
1270,2
2300,0
20000,0

Thanks! The REW export method does seem to work & sound right. The target curve also updates appropriately in autoeq.app.

I'm now using multiple adjustments to the target (including the 1270Hz peak mentioned earlier). The REW export method seamlessly composes a complex curve into a single raw measurements file (from 20Hz to 20Khz for convenience).

(I'm guessing directly entering values such as "700, 0" (as above) would be problematic if there are multiple filters, since some other filter may be affecting the adjustment at 700Hz.)
 
Last edited:
Jul 5, 2023 at 3:31 PM Post #9 of 16
So by default this has a +6 db bass boost applied? Is that an additional +6 db ontop of the profiles that can be downloaded from GitHub or by default is it the same?
 
Jul 8, 2023 at 4:12 AM Post #10 of 16
So by default this has a +6 db bass boost applied? Is that an additional +6 db ontop of the profiles that can be downloaded from GitHub or by default is it the same?
For over-ear headphones it's 6 dB and it's on top of a target that doesn't have bass boost and so matches Harman target.
 
Jul 19, 2023 at 11:59 PM Post #12 of 16
@jaakkopasanen, bug report: no matter what sample rate I select for an output convolutional EQ file in autoeq.app currently, the resultant file is always 44.1Khz.

Also, and this may not be a bug, but whenever I convolve an audio file with an impulse .wav from autoeq.app, the volume reduces by a huge amount: about 20db.
 
Jul 20, 2023 at 4:38 PM Post #13 of 16
Looked a bit AutoEq suitability to make EQ preset for Foobar2k Desktop/Mobile (+ SuperEQ, DeaDBeeF, AviSynth) (yes, that 18-band build-in EQ in question). Biggest "problem" is how to 'compensate' Foobar2k EQ response because of it uses integer step gains at predefined bandwidths?

Tried three different approaches by using this configuration for example case of AKG K240 Studio in AutoEq to get the target model (rest is coded with Octave):

filter_defaults: type: PEAKING q: 2.871 filters: - fc: 55 - fc: 77 - fc: 110 - fc: 156 - fc: 220 - fc: 311 - fc: 440 - fc: 622 - fc: 880 - fc: 1200 - fc: 1800 - fc: 2500 - fc: 3500 - fc: 5000 - fc: 7000 - fc: 10000 - fc: 14000 - fc: 20000

Plot shows calculated responses :

3SuperEQcanditates.png

where responses are:
green lines = responses of each 18 peaking filters ( in EQ one maybe likes to use shelf filters at lowest/highest freqs ),
red line: response of summed 18 peaking filters ( = EQ for AKG K240 Studio here ) and


fb2keq1 calculations are based on gains of each peaking filter (gain of the "bar" @ 55Hz = total gain of peaking filter @ 55Hz, etc.) :

fb2keq1.png

Illustration @ https://www.desmos.com/calculator/eql4ij7tgs

fb2keq2 is calculated by splitting summed EQ (target) to equal bandwidths as which SuperEQ uses, then calculated total gain for each band separately and finally adjusted gains for SuperEQ bands by those numbers :

fb2keq2.png

fb2keq3 is calculated by matching center of each bandwidth (bar) at target curve :

fb2keq3.png


! (audio files generated by playing clean/flat sweep signal (1Hz-20kHz) with Foobar2k build-in EQ enabled (and set by result values) and recorded using Audacity).

Maybe one could add support for Foobar2k's in-build EQ (as seen, no need to implement the whole EQ system)?
 
Last edited:
Aug 3, 2023 at 5:19 AM Post #14 of 16
OK, I made one quick implementation (not very familiar with Python) which solves gains for SuperEQ from equalization column data which is showed in spreadsheet tables written by AutoEQ. I've forked AutoEq on GitHub so there you'll find all implemented. Command line script:

python3 -m autoeq --input-file="measurements/oratory1990/data/over-ear/AKG K240 Studio.csv" --output-dir="my_results" --bass-boost 3 --compensation="compensation/harman_over-ear_2018_wo_bass.csv" --supereq

results EQ response for AKG K240 Studio as:

AKG K240 Studio.png

and the preset file shows gains [6, 4, 0, -2, -3, -3, -2, -1, -1, 1, 4, -1, 3, 4, -1, -1, 1, 5]
 
Last edited:
Aug 8, 2023 at 5:09 AM Post #15 of 16
I've coded a routine which writes EQ settings for Voicemeeter Banana EQ. I'm not yet familiar with GitHub features so I list all needed code here if someone likes to pull a request... (I'll pull request at some point after learning how to).



I have tested functionality with command line script:

python3 -m autoeq --input-file="measurements/oratory1990/data/over-ear/AKG K240 Studio.csv" --output-dir="my_results" --bass-boost 3 --compensation="compensation/harman_over-ear_2018_wo_bass.csv" --voicemeeterpeq --parametric-eq --parametric-eq-config=VOICEMEETER_PEQ

which produces AKG K240 Studio.xml :

<?xml version="1.0" encoding="utf-8"?> <VBAudioVoicemeeterBUSEQConfig> <VoiceMeeterBUSEQ> <Bus index='1' channel='1' cell='1' EQon='1' EQtype='5' dblevel='6.09' freq='65.00' Q='0.70' /> <Bus index='1' channel='1' cell='2' EQon='1' EQtype='0' dblevel='-3.37' freq='205.49' Q='0.40' /> <Bus index='1' channel='1' cell='3' EQon='1' EQtype='0' dblevel='5.36' freq='4220.58' Q='2.96' /> <Bus index='1' channel='1' cell='4' EQon='1' EQtype='0' dblevel='3.52' freq='71.50' Q='0.93' /> <Bus index='1' channel='1' cell='5' EQon='1' EQtype='0' dblevel='5.50' freq='1591.25' Q='3.11' /> <Bus index='1' channel='1' cell='6' EQon='1' EQtype='6' dblevel='3.70' freq='16744.04' Q='0.70' /> <Bus index='1' channel='2' cell='1' EQon='1' EQtype='5' dblevel='6.09' freq='65.00' Q='0.70' /> <Bus index='1' channel='2' cell='2' EQon='1' EQtype='0' dblevel='-3.37' freq='205.49' Q='0.40' /> <Bus index='1' channel='2' cell='3' EQon='1' EQtype='0' dblevel='5.36' freq='4220.58' Q='2.96' /> <Bus index='1' channel='2' cell='4' EQon='1' EQtype='0' dblevel='3.52' freq='71.50' Q='0.93' /> <Bus index='1' channel='2' cell='5' EQon='1' EQtype='0' dblevel='5.50' freq='1591.25' Q='3.11' /> <Bus index='1' channel='2' cell='6' EQon='1' EQtype='6' dblevel='3.70' freq='16744.04' Q='0.70' /> <Bus index='1' channel='3' cell='1' EQon='1' EQtype='5' dblevel='6.09' freq='65.00' Q='0.70' /> <Bus index='1' channel='3' cell='2' EQon='1' EQtype='0' dblevel='-3.37' freq='205.49' Q='0.40' /> <Bus index='1' channel='3' cell='3' EQon='1' EQtype='0' dblevel='5.36' freq='4220.58' Q='2.96' /> <Bus index='1' channel='3' cell='4' EQon='1' EQtype='0' dblevel='3.52' freq='71.50' Q='0.93' /> <Bus index='1' channel='3' cell='5' EQon='1' EQtype='0' dblevel='5.50' freq='1591.25' Q='3.11' /> <Bus index='1' channel='3' cell='6' EQon='1' EQtype='6' dblevel='3.70' freq='16744.04' Q='0.70' /> <Bus index='1' channel='4' cell='1' EQon='1' EQtype='5' dblevel='6.09' freq='65.00' Q='0.70' /> <Bus index='1' channel='4' cell='2' EQon='1' EQtype='0' dblevel='-3.37' freq='205.49' Q='0.40' /> <Bus index='1' channel='4' cell='3' EQon='1' EQtype='0' dblevel='5.36' freq='4220.58' Q='2.96' /> <Bus index='1' channel='4' cell='4' EQon='1' EQtype='0' dblevel='3.52' freq='71.50' Q='0.93' /> <Bus index='1' channel='4' cell='5' EQon='1' EQtype='0' dblevel='5.50' freq='1591.25' Q='3.11' /> <Bus index='1' channel='4' cell='6' EQon='1' EQtype='6' dblevel='3.70' freq='16744.04' Q='0.70' /> <Bus index='1' channel='5' cell='1' EQon='1' EQtype='5' dblevel='6.09' freq='65.00' Q='0.70' /> <Bus index='1' channel='5' cell='2' EQon='1' EQtype='0' dblevel='-3.37' freq='205.49' Q='0.40' /> <Bus index='1' channel='5' cell='3' EQon='1' EQtype='0' dblevel='5.36' freq='4220.58' Q='2.96' /> <Bus index='1' channel='5' cell='4' EQon='1' EQtype='0' dblevel='3.52' freq='71.50' Q='0.93' /> <Bus index='1' channel='5' cell='5' EQon='1' EQtype='0' dblevel='5.50' freq='1591.25' Q='3.11' /> <Bus index='1' channel='5' cell='6' EQon='1' EQtype='6' dblevel='3.70' freq='16744.04' Q='0.70' /> <Bus index='1' channel='6' cell='1' EQon='1' EQtype='5' dblevel='6.09' freq='65.00' Q='0.70' /> <Bus index='1' channel='6' cell='2' EQon='1' EQtype='0' dblevel='-3.37' freq='205.49' Q='0.40' /> <Bus index='1' channel='6' cell='3' EQon='1' EQtype='0' dblevel='5.36' freq='4220.58' Q='2.96' /> <Bus index='1' channel='6' cell='4' EQon='1' EQtype='0' dblevel='3.52' freq='71.50' Q='0.93' /> <Bus index='1' channel='6' cell='5' EQon='1' EQtype='0' dblevel='5.50' freq='1591.25' Q='3.11' /> <Bus index='1' channel='6' cell='6' EQon='1' EQtype='6' dblevel='3.70' freq='16744.04' Q='0.70' /> <Bus index='1' channel='7' cell='1' EQon='1' EQtype='5' dblevel='6.09' freq='65.00' Q='0.70' /> <Bus index='1' channel='7' cell='2' EQon='1' EQtype='0' dblevel='-3.37' freq='205.49' Q='0.40' /> <Bus index='1' channel='7' cell='3' EQon='1' EQtype='0' dblevel='5.36' freq='4220.58' Q='2.96' /> <Bus index='1' channel='7' cell='4' EQon='1' EQtype='0' dblevel='3.52' freq='71.50' Q='0.93' /> <Bus index='1' channel='7' cell='5' EQon='1' EQtype='0' dblevel='5.50' freq='1591.25' Q='3.11' /> <Bus index='1' channel='7' cell='6' EQon='1' EQtype='6' dblevel='3.70' freq='16744.04' Q='0.70' /> <Bus index='1' channel='8' cell='1' EQon='1' EQtype='5' dblevel='6.09' freq='65.00' Q='0.70' /> <Bus index='1' channel='8' cell='2' EQon='1' EQtype='0' dblevel='-3.37' freq='205.49' Q='0.40' /> <Bus index='1' channel='8' cell='3' EQon='1' EQtype='0' dblevel='5.36' freq='4220.58' Q='2.96' /> <Bus index='1' channel='8' cell='4' EQon='1' EQtype='0' dblevel='3.52' freq='71.50' Q='0.93' /> <Bus index='1' channel='8' cell='5' EQon='1' EQtype='0' dblevel='5.50' freq='1591.25' Q='3.11' /> <Bus index='1' channel='8' cell='6' EQon='1' EQtype='6' dblevel='3.70' freq='16744.04' Q='0.70' /> </VoiceMeeterBUSEQ> </VBAudioVoicemeeterBUSEQConfig>

AKG K240 Studio.png

Also tested with a config file voicemeeterpeq.yaml :

optimizer: min_f: 20 max_f: 20000 max_time: null min_change_rate: null min_std: null filter_defaults: min_fc: 20 max_fc: 10000 min_q: 0.18248 max_q: 6 min_gain: -20 max_gain: 20 filters: - type: LOW_SHELF fc: 65.406392 q: 0.7 - type: PEAKING - type: PEAKING - type: PEAKING - type: PEAKING - type: HIGH_SHELF fc: 16744.036 min_fc: 15000 max_fc: 20000 min_q: 0.4 max_q: 0.7

which generates similar .xml file (some differences in parameter values but response is about the same):

python3 -m autoeq --input-file="measurements/oratory1990/data/over-ear/AKG K240 Studio.csv" --output-dir="my_results" --bass-boost 3 --compensation="compensation/harman_over-ear_2018_wo_bass.csv" --voicemeeterpeq --parametric-eq --parametric-eq-config=voicemeeterpeq.yaml


Both .xml files loaded properly in Voicemeeter BANANA.
 
Last edited:

Users who are viewing this thread

Back
Top