Windows Volume Control Is Wonky

In Windows 10, the increase in volume between 2/100 and 6/100 is larger than the increase between 50/100 and 100/100.

Volume Control and Decibels

In electronics, the maximum level is “full-scale”, denoted by “0dBFS”, or 0dB, full scale. Full scale is the loudest signal that the system can produce; for instance, at its maximum electrical output (0dBFS) a computer might drive a certain pair of headphones to 100dB SPL (decibels of Sound Pressure Level). See this calculator to convert electrical levels to sound pressure levels for different headphones.

Lower signal levels are denoted by reducing, or attenuating, the signal relative to the full-scale level; for instance, -3dBFS is 3dB lower than maximum. In the example above, the headphones that were 100dBSPL at 0dBFS would be 90dBSPL at a setting of -10dBFS.

Humans don’t perceive sound linearly, and neither does the decibel scale. Rather, decibels represent a logarithmic (or exponential, depending on how you want to look at it) approach: doubling the level of a signal increases it by 6dB, rather than doubling the number of decibels. Halving correspondingly decreases a signal by 6dB.

To maximize its useful adjustment range, an ideal digital volume control would have each volume increment correspond to a set decibel amount, such that each step sounds equally spaced from the others. For instance, if each step corresponded to 1 dB, then increasing the volume from 10 to 11 would make the signal sound louder by the same amount that increasing the volume from 20 to 21 would. This way, regardless of the user’s preferred listening level, they would always be able to make fine adjustments to their liking. Such a scale might range from 0dBFS at the “100” setting down to -98dBFS at the “2” setting (the “0” setting, of course, corresponding to the sound being off entirely: -∞ in an ideal world).

Windows 10

Windows users are no doubt familiar with the volume steps at low levels feeling massive, and the steps at higher levels feeling barely perceptible.

This isn’t an accident: the volume steps at low levels are massive, and the steps at high levels are so small that some of them don’t even exist (the volume doesn’t change at all). This data was taken from a Gigabyte Aorus X470 Gaming 7 Motherboard and verified with an HP Envy laptop, so it is not hardware-specific. All of the output ports, and all of the Realtek “amplifier” settings, produce the same curve.

For instance, volume settings 96, 98, and 100 have exactly the same output level. Similarly, the difference between levels 2 and 6 (11dB) is greater than the difference between levels 50 and 100 (10dB).

It’s safe to say that for most users, Windows volume control is not ideal. For those who like to listen at low levels, the steps are too large to dial in an ideal volume. For those who like to listen at high levels, the steps are so small that it takes a lot of adjustment to find an ideal volume.

External DACs with Windows Volume

Repeating the measurement from the output of a Meizu Hifi DAC and Tempotec Sonata HD II produces very similar (but not identical) curves.

The external DACs vary slightly from the default Windows values but otherwise follow the same curve. Due to both of the external devices only changing volume in 0.5dB increments, they don’t follow exactly the same curve. Interestingly, the Meizu DAC has a slightly lower minimum level than the default curve, though that doesn’t make the overall result any better.

Not Linear, Not Logarithmic

The easiest way to implement a volume control is linearly (i.e., halfway on the volume control corresponding to halfway in terms of volts, but not decibels).

This turns out to not be the case (measured from ES9270 output, voltage level not calibrated so values are off by a scalar factor). The Windows volume is not linear with the output level. Instead there seems to be some sort of power/exponential relationship. I’m guessing squared or cubed (both look pretty close when fitted).

My first thought was that it might be meant to scale with power, which is proportional to the square of voltage, but the exponent is in the wrong direction for that to be the case.

Android 10

Android 10 (at least on my LG V50) has a logarithmic volume control, so good for them. The problem is that it only has 15 volume steps by default.

This means that at the high volume levels, each step corresponds to about 3dB of attenuation. Near the bottom, it’s about 6dB. Although Android’s volume control is technically more correct than Windows’ in that the volume always adjusts by about the same amount throughout the output range, it still has the same problem: the volume steps are still too large. Arguably, this isn’t as much of an issue in a mobile application where convenience is more important than getting things exactly right.

Interestingly, the Meizu Hifi dongle once again mostly tracks the system volume control but goes a little bit lower at the lowest settings.

Better Implementations

The LG V50 also has a “Quad DAC” option, under which the phone’s output is supposedly routed to an ESS DAC. More relevant to this article, it also increases the number of volume steps to 75.

Looking closely at the graph, it’s split into shallow steps with three substeps each. With the exception of the large jumps below -40dB, it’s quite good.

The Topping E50’s (and many other external DACs) volume control is basically perfect: 0.5dB steps at high levels, and 1dB steps all the way down to -99dBFS. Unfortunately this sort of behavior isn’t accessible in Windows; changing the system volume doesn’t affect the output level at all. Volume control has to be done on the DAC itself.