jaakkopasanen / AutoEq

Automatic headphone equalization from frequency responses
MIT License
13.43k stars 2.48k forks source link

Huge volume drop and incorrect curve with oratory1990 Beyerdynamic DT 880 250 Ohm parametric curve in Apple AUNBandEQ and SoundSource #240

Closed sacundim closed 2 years ago

sacundim commented 3 years ago

When I apply the oratory1990 Beyerdynamic DT 880 250 Ohm parametric curve in Apple's AUNBandEQ, I get a gigantic volume drop. Reading the comments in this unrelated issue and playing with the EQ settings, I can isolate the cause to one of the filters in the EQ:

Type Fc Q Gain
Peaking 19698 Hz 0.46 -11.8 dB

As @jaakkopasanen's comment I link from that issue remarks:

The total level being down so much in the newer one is caused by the 19 kHz filter which has very large bandwidth and a lot of negative gain. It looks to me like the DDC Toolbox and AutoEq are calculating the filters' frequency responses differently near Nyquist frequency. Is there a pre-amp option in DDC Toolbox?

I can't say I understand this topic very well all, but it sure does seem to me that AUNBandEQ exhibits similar behavior as what's remarked on there. Here's a screenshot of the AUNBandEQ plugin with the DT880 EQ settings applied (as close as I could reproduce them, which does include the -6.9 dB preamp):

With 19698 Hz

And here is with the 19,698 line disabled:

Without 19698 Hz

Not only does the first curve show a huge volume drop across nearly all of the spectrum, it also grossly mismatches the balance of bass vs. mids/treble of the EQ curve in the DT 880 profile:

Worth noting that I ran into this issue because the Headphone EQ filter in SoundSource 5, which very conveniently integrates with the EQ curves in this project, but much less conveniently is suffering from the same huge volume drop when I pick this DT880 curve.

jaakkopasanen commented 3 years ago

This is a tricky one because I can't calculate what will be the frequency response in AUNBandEQ. I suppose I could try avoiding filters close to Nyquist frequency but that will require rework of the parametric eq optimizer.

Could you help me out a bit here and test what AUNBandEQ does if you disable all the other filters except the problematic one? I would also be interested in knowing how the frequency response changes when you move the filter's center frequency bit by bit towards the lower frequencies.

sacundim commented 3 years ago

Here's just with the problematic filter on:

Screen Shot 2020-12-18 at 2 04 02 PM

There's also an "Export curve data" option in the plugin that produces a file that I can't understand but maybe you can figure it out and it might be helpful:

cut 19698.txt

Not sure how to pick other frequencies to help you out, here's the image for cutting at 15KHz:

Screen Shot 2020-12-18 at 2 08 39 PM

Text file export of 15KHz: cut 15000.txt

Here's 10 KHz:

Screen Shot 2020-12-18 at 2 06 36 PM

Text file for 10KHz: cut 10000.txt

If you want any others just ask.

sacundim commented 3 years ago

Looking at those text files again, I think they just say the decibel cut or boost of the EQ curve at each of a long list of frequencies, which looks like it might be useful

jaakkopasanen commented 3 years ago

Little investigation has revealed what I suspected: different equalizers implement parametric filters differently. AutoEq and EqualizerAPO calculate frequency responses for filters near Nuquist frequency similarly whereas AUNBandEq, DDC Toolbox and MAAT thEQorange do it diffrently. I think AUNBandEq do a better job since in these tools the filter shapes are similar regardless of if they are in the mid ranges or in the upper treble.

This is a frequency response curve of Stax SR-L300 parametric equalizer settings in MAAT thEQorange:

And here is what AutoEq thinks of the same filter parameters:

And EqualizerAPO with just the high frequency filter

The filters don't really have to be very close to the Nyquist frequency to have distorted shape in AutoEq and EqualizerAPO as long as they have low Q. Therefore I don't think it's possible to solve this problem by avoiding high frequency filters. Using high shelf filter to adjust the +10 kHz range isn't going to work either because the high shelf filters are subject to same shape distortion as peaking filters are.

I think the only solution to this problem is to implement another filter frequency response calculation which matches AUNBandEq and to produce two sets of parametric eq filters, one for EqualizerAPO and one for AUNBandEq. This however won't happen very soon as it will be a fair amount of work.

Mar-Shayal commented 3 years ago

I think this has to do with so-called "frequency warping" at the extremes? I think almost all digital EQs kind of manipulate or fudge parameters to avoid an improper balance with the too-steep drops that result.

I've tried these settings on a bunch of different (fairly standard) EQs, though, all with virtually the same result. For example:

EqualizerAPO FF Q3

That small rise around 4KHz is not nearly enough to offset the huge -10.6 cut (with a very wide Q) higher up. And you can see that the curve for the 20KHz peaking or bell curve (the blue coloured area in the second image) is quite different to the corresponding slope in AutoEQ. The whole top end indeed looks nothing like the AutoEQ curve. So the problem is, what user-available EQ is able to replicate what AutoEQ is doing?

But here it is using a different EQ:

Blue_LI

Instead of the normal (symmetrical) EQ architecture I tried the Constant Q "Asymmetrical" this time and that looks quite a bit more like the AutoEQ curve. (This is basically an "old-skool" approach to EQ, such as you used to see on the old analog consoles.) It looks like AutoEQ is using a less-standard approach, which may be more "ideal", but might not be as easy to replicate on typical software implementations. Though it may be apparent only on the occasional outlier, like these two cases. I'll try this approach out on a few other headphone settings and see what happens.

Mar-Shayal commented 3 years ago

This is the Beyerdynamic DT 880 curve, also using the asymmetrical architecture. Again, pretty close to the AutoEQ curve, if not exact. But with symmetrical boost and cut, I get the same result as the OP.

beyer_LI

Mar-Shayal commented 3 years ago

I think this has more to do with the way AutoEQ is performing the calculations than anything to do with frequencies at the extremes. Here's an example, more or less at random, for another headphone, the Beyerdynamic 1990, showing how results can be dramatically different, on the same software EQ, with same settings:

Beyerdynamic DT 1990 (balanced earpads)

1990_LI

1990a_LI

the only difference is that in one, the more typical "symmetrical" EQ architecture is used (calculations performed for both boost and cut from 0db), and in the other one "asymmetrical" is used, meaning the calculations for cut are done from -3db. Hope this helps :)

jaakkopasanen commented 3 years ago

Very strange, your EqualizerAPO plots Stax SR-L300 frequency response completely different from mine:

This is the picture you posted earlier

And this is my equalizer apo when I import the SR-L300 parametric eq settings SR-L300 EqualizerAPO

The 4 kHz peak in your graph is about 5 dB below 25 Hz peak while mine is only 4 dB. The big difference however is with the 10 kHz peak which is at almost 9 dB below 25 Hz peak and for me it's about 5 dB. Are you sure you have the filters correctly set up? I copied mine directly from this to the config.txt.

AutoEq's numeric data shows:

I looked at the filter cookbook again and I suspect AutoEq might actually calculate the filter frequency responses incorrectly but that doesn't explain why your EqualizerApo and mine show different results.

Mar-Shayal commented 3 years ago

The mystery deepens. I double checked and my numbers are the same. My graph is still the same as the picture I posted. However, when I changed the "device" at the top right of the app (from my DAC to my monitor) the graph changed to this: apo

which is closer if not identical to yours but it doesn't seem to to correspond to the numeric data either. My 9748 peak is only about 1.6db. But whatever EQ I input these numbers into show the same result as my first graph, with the the catastrophic drop in the high end. I have dozens of EQs, from freeware to stock plugins to ultra high-end niche products like the MAAT, which is something no normal, or sane, person should own. I tried many yesterday, all with the identical result. So I don't know why the EqualizerAPO curve would be so different from a "standard" EQ, or give two different curves for the exact same numbers.

If I had to guess (and I've been trying!) I would say it has something to do with Q. I can approximate the curve pretty well just by tweaking the Q, even with the normal, symmetrical EQ topology. In fact 2.38 comes really close in this case (rather than .38 for the 9748 filter). But that's just a workaround for now. There does seem to be something strange going on.

Mar-Shayal commented 3 years ago

So I was trying to think what was different about the "DAC" vs the "monitor" device on the app, and my DAC is normally at 192KHz. So I changed it to 44.1 and this is what the graph looks like: 44 1 the 9.84KHz peak is just under 3db.

And in my DAW, with the same setting: eq441 now the peak is at 1.5db.

vs as an example 384KHz: EQ384 so clearly you were on the right track, but I'm not really sure what the implications of this are..

jaakkopasanen commented 3 years ago

Alright! So now things are looking a lot like what they should be. This is mostly an issue with sampling rate. AutoEq calculates the filters assuming sampling rate of 48 kHz which means the Nyquist frequency (ie. the upper limit) is 24 kHz. When the sampling rate is changed to 192 kHz, the Nyquist frequency becomes so large that it doesn't affect the filters anymore and the 19.9 kHz 0.38 Q filter takes the shape it would normally if it's center frequency were lower in the frequency range.

There still probably is a bug in AutoEq and some eq softwares have slightly different implementation (like fab filter 3). My EqualizerApo graph now looks a lot similar than your MAAT with 9.84 kHz peak at ~1.5 dB. I use 48 kHz always. Your slightly different curve in EqualizerAPO could be explained by 44.1 kHz sampling rate.

I'm going to add a notice about the sampling rates in the usage instructions and also make AutoEq's parametric equalizer optimizer respect --fs, which currently only affects FIR filters. And of course fix the bug with how the filters' frequency responses are calculated.

Mar-Shayal commented 3 years ago

Yes my curve is identical to yours with the rate @48. Thanks so much for looking into this! We're all grateful for your work here, so many of these headphones are completely unusable without EQ.

jaakkopasanen commented 3 years ago
I did some testing and looked at my code again. AutoEq doesn't have a bug in how it calculates the parametric eq frequency response. I checked several points in EqualizerAPO and the data matches exactly. Here is the numerical data which I used, this is produced by AutoEq: Frequency (Hz) Gain (dB)
24.89 6.29
203.19 -0.79
407.76 -0.26
1136.34 -2.69
2213.30 1.19
2326.20 1.15
3864.00 3.14
5810.49 -3.61
9651.68 1.59
13537.23 -2.43
14658.88 -4.01
15873.47 -5.84
17188.69 -7.73
18612.89 -9.48

EqualizerAPO's configuration editor shows the exact same gain values at these frequencies. Both were at 48 kHz.

@Mar-Shayal could you check AUNBandEq and MAAT against this data?

Next I'll test how much the sampling rate affects frequency response of the parametric eq.

jaakkopasanen commented 3 years ago

Impact of sampling rates on the Stax SR-L300 parametric equalizer frequency response.

This would indicate that using just a single value of 46 kHz for all pre-computed results would yield acceptable results for both 44.1 kHz and 48 kHz. This is almost the worst case scenario because this headphone requires more than -10 dB at 20 kHz. Theoretical headphone with poor high frequency extension would not have this big differences since that would require positive gain on the equalizer but the amount of positive gain is limited to 6 dB. It's unlikely that there would be many headphones with more energy at 20 kHz than Stax SR-L300.

Mar-Shayal commented 3 years ago

I'm on Windows so I can't try AUNBandEq unfortunately. MAAT is essentially the same measured against those values, but only using 44.1. With 48 kHz I'm off a bit more, the 9651 peak is at about -.2 db, instead of 1.6 db, for example.

Annotation 2020-12-31 110818

However, I also tried the FabFilter Q3 with a 48 KHz rate and it made no difference at all, it's the same as my earlier snapshot I made, @192 kHz. Same with the Crave EQ:

Annotation 2020-12-31 104433

For these and some other EQs the chosen sampling rate has no effect.

sacundim commented 3 years ago

I can check AUNBandEq, but I'm not clear exactly what to check. Is it the Stax SR-L300 settings here?

Mar-Shayal commented 3 years ago

Yes, that's the one.

sacundim commented 3 years ago

I wasn't sure whether to do it with the global gain = -7.0 dB setting the profile says, so I did it both with and without. With:

Stax SR-L300 (gain -7 0)

Stax SR-L300 (gain -7.0).txt

Without (i.e., global gain at 0.0 dB):

Stax SR-L300 (gain 0 0)

Stax SR-L300 (gain 0.0).txt

jaakkopasanen commented 3 years ago

@sacundim what is your sampling rate? Can you send another picture here with sampling rate of 48 kHz if you have something else currently?

@Mar-Shayal What does MAAT give you with 48 kHz and asymmetric architecture?

sacundim commented 3 years ago

@jaakkopasanen I don't see any option in AUNBandEQ to set a sample rate. I'm hosting it in SoundSource which I had set to 44.1, but after switching that to 48 and exporting the curve text file, the output is identical. Like, literally identical, I hashed the files to confirm.

Mar-Shayal commented 3 years ago

48 kHz with asymmetrical doesn't really work, it's lopsided and too high by almost 2 db at the 9 K peak.

3

Here's another EQ @48 kHz, a really good one, but the funny thing is this has almost the identical options as the MAAT in terms of architecture - choice between classic symmetrical, classic asymmetrical, proportional Q (three choices), "ideal" Q, parallel FF, parallel asymmetrical - so I expected it might give the same results. So far, though, MAAT (Blue) is the only one that can put out a curve the same as the AutoEQ @44.1 kHz.

Annotation 2021-01-02 100204

The curve does look slightly better with parallel (rather than series):

2

jaakkopasanen commented 3 years ago
I think the only realistic option to ever solve this problem is to start using high shelf filters for fixing the top octave. Could you @Mar-Shayal and @sacundim test how these two filters would look like in the equalizers you have at hand? Type Fc Q Gain
High shelf 14 000 Hz 0.7 -20 dB
Peaking 10 000 Hz 1.4 3 dB
Mar-Shayal commented 3 years ago

Looks promising, I don't get the big drop in the treble when using 192 kHz anymore, the sampling rate doesn't have any impact now, although the curve isn't exact. But that may be because I'm unsure about the filters now, the 19.86 kHz is being replaced with the shelf, but is the new peaking one @10 000 in addition to the ones I'm already using, or replacing one of them?

jaakkopasanen commented 3 years ago

@Mar-Shayal I meant put only the two filters and remove all others. If like to see how these two look in different equalizers.

sacundim commented 3 years ago
Screen Shot 2021-04-13 at 12 33 30 AM

2021-04-13 Peak and shelf for @jaakkopasanen.txt

Mar-Shayal commented 3 years ago

I see, I misunderstood. Here's the Q3, it makes no difference whether 44.1 or 192. However, the sampling rate did still make a difference on the MAAT, interestingly. Screenshot_2

That's with a normal 12db slope on the shelf. With 24db it looks like this: Screenshot_3

Another EQ: Screenshot_4

jaakkopasanen commented 3 years ago

@Mar-Shayal thanks a lot! Would you have the pictures for MAAT?

Mar-Shayal commented 3 years ago

Here is 44.1: Screenshot_6

And @192:

Screenshot_5

I can only drop it -18.

jaakkopasanen commented 3 years ago

@Mar-Shayal Thanks. Wow, these are significantly different. Was there some other types of architectures available in MAAT?

Mar-Shayal commented 3 years ago

Yes there was asymmetrical ("Old Skool, boost like № 1 [symmetrical] but with narrower cut" from manual), a small difference between the two sampling rates:

Screenshot_2

Screenshot_1

the others involved some minor variations in Q (proportional) but don't make a lot of difference. I remember playing around with them before and while they may improve things in one part of the spectrum, they made it worse in another.

jaakkopasanen commented 3 years ago

@sacundim what was the sampling rate with that AUNBandEQ?

jaakkopasanen commented 3 years ago

Alright here we go. As you can see all others but MAAT and ProQ3 with 12 dB/oct are quite close to each other. I'm personally quite happy with this result. I'm going to implement a penalty in the parametric eq optimizer which prevents the optimizer from producing filters with transition bands above 20 kHz. peq_diff

sacundim commented 3 years ago

@jaakkopasanen When I looked into the sampling rate a few months ago (yeah, it's been a while), this is what I concluded:

@jaakkopasanen I don't see any option in AUNBandEQ to set a sample rate. I'm hosting it in SoundSource which I had set to 44.1, but after switching that to 48 and exporting the curve text file, the output is identical. Like, literally identical, I hashed the files to confirm.

Mar-Shayal commented 3 years ago

The MAAT developers have some rather different ideas and ways of implementing their approach for sure so I'm not surprised that's an outlier. It's funny the Q3 with 24 db/oct is more similar to the others though, generally 12 db/oct is considered more industry standard (to the extent that many EQs don't even have the option to set it differently). But nice work just the same!

yikai-wu commented 3 years ago

I have also encountered this problem. I attached my screenshot below. Please let me know if you find any solutions or there is anything I can help. Screen Shot 2021-07-29 at 01 24 55

RAOEUS commented 2 years ago

Is there a consensus as to which EQ VST performs the best for use in a digital audio workstation? Are there any particular settings for that VST that are required?

jaakkopasanen commented 2 years ago

I believe it's time to close this ticket. The new PEQ optimizer doesn't produce filters (depending on configuration) above 10 kHz and there is also high shelf filter available and these together mitigate majority of this problem. The remaining (rather small) differences I was not able to fix because even when implementing a regularization for this in the optimizer, the results didn't improve.

Thanks everyone who contributed by investigating or providing info about different parametric equalizer!