Note: This text assumes knowledge of Ohm’s Law, series and parallel resistances, and voltage dividers

Are you trying to control volume in an audio circuit using a potentiometer? Then you should probably want a “logarithmic-taper” potentiometer, also called an “audio-taper” or “A”-taper potentiometer. Those allow you to logarithmically vary the voltage of a signal going through it as you turn.

potentiometers with A and B tapers
Potentiometers with A- and B- tapers, shown along with the pseudo-logarithmic technique. By "endolith" via flickr and used under the CC BY-NC-SA 2.0 license

By contrast, ordinary “linear taper”, or “B”-taper, potentiometers vary the voltage linearly—the fraction of the turn you set is exactly the fraction of the original voltage you expect. Then, this voltage drives a speaker at a lower or higher power. However, human hearing has been shown to be logarithmic. For something to sound louder and louder with equal steps, we must dump more and more power into the same sound with every next step.

figure showing logarithmic hearing vs exponentially increasing voltage

Conversely, we can cut the power by less and less with every step to get something to sound quieter and quieter with equal steps.

figure showing logarithmic hearing vs exponentially decreasing voltage

However, linear-taper potentiometers don’t take this human phenomenon into account. As a result, the volume collapses more rapidly as you turn the knob down, and it creeps up more slowly as you turn the knob up. Using a unit called the “decibel”, we can properly plot this behavior on a graph. The “decibel”, formally defined as

20log10(VV0)dB20 \log_{10} \left( \frac{V}{V_0} \right) \text{dB}

where V/V0V / V_0 is the fraction of the original voltage, is that equal step. Since this fraction is exactly equal to the fraction of the turn for linear potentiometers, we can set this equal to a turn variable cc between 00 and 11. We can then plot the perceived loudness as 20log10c20 \log_{10} c.

perceived loudness of linear-taper in dB

By contrast, logarithmic-taper potentiometers would appear here as a straight line. (In practice, logarithmic-taper potentiometers only approximate the true logarithmic behavior, but they still do a better job than linear-tapers!)

Now, what if we’ve already ordered linear-taper potentiometers but need logarithmic behavior ASAP? You can consider the “loading resistor” technique for a pseudo-logarithmic behavior. This circuit has circulated on the internet long before me, but let’s do a rigorous construction of it to see where and why it works, but also where and why it can fail.

When a potentiometer is used to vary the fraction of the original voltage, it is installed as an adjustable voltage divider.

potentiometer as a voltage divider

This method works because of the way turning the knob affects the resistances of the upper and lower legs.

VV0=cR1cR1+(1c)R1=cR1R1+cR1cR1=c\begin{align*} \frac{V}{V_0} & = \frac{c R_1}{c R_1 + (1-c) R_1} \\ & = \frac{c R_1}{R_1 + c R_1 - c R_1} \\ & = c \end{align*}

On the other hand, the circulating design suggests putting a resistor in parallel with the lower leg

potentiometer and loading resistor as a voltage divider

and this gets us a new divider.

VV0=11cR1+1R211cR1+1R2+(1c)R1\begin{align*} \frac{V}{V_0} & = \frac{\frac{1}{\frac{1}{c R_1} + \frac{1}{R_2}}}{\frac{1}{\frac{1}{c R_1} + \frac{1}{R_2}} + (1-c) R_1} \end{align*}

This is an intimidating expression! However, sources on the loading resistor design typically mention the ratio between R1R_1 and R2R_2 as the thing to tune. If we let this ratio be the variable r=R2/R1r = R_2/R_1, the expression can be dramatically simplified.

VV0=11cR1+1R211cR1+1R2+(1c)R1  11cR1+1R2=cR1R2cR1+R2=cR1R2cR1R2+(1c)R1(cR1+R2)=cR2/R1cR2/R1+(1c)(c+R2/R1)r=R2/R1=crcr+(1c)(c+r)=crrc+c+rc2rc=crr+cc2\begin{align*} \frac{V}{V_0} & = \frac{\frac{1}{\frac{1}{c R_1} + \frac{1}{R_2}}}{\frac{1}{\frac{1}{c R_1} + \frac{1}{R_2}} + (1-c) R_1} \\ & \, \, \left\downarrow \frac{1}{\frac{1}{c R_1} + \frac{1}{R_2}} = \frac{c R_1 R_2}{c R_1 + R_2} \right. \\ & = \frac{c R_1 R_2}{c R_1 R_2 + (1-c) R_1 (c R_1 + R_2)} \\ & = \frac{c R_2 / R_1}{c R_2 / R_1 + (1-c)(c + R_2 / R_1)} \\ & \, \downarrow r = R_2 / R_1 \\ & = \frac{c r}{c r + (1-c)(c + r)} \\ & = \frac{cr}{rc + c + r - c^2 -rc} \boxed{ = \frac{cr}{r + c - c^2} } \end{align*}

This reduction shows that the behavior of the loading resistor design as you turn the knob—thereby varying cc—depends only on the ratio rr. There seem to be many good ratios, but we can take just r=0.12r=0.12 for example. This can be implemented with the potentiometer R1R_1 valued at 100kΩ100 \text{k}\Omega and a loading resistor R2R_2 at 12kΩ12 \text{k}\Omega. The behavior in decibels would be

20log10(0.12c0.12+cc2)dB20 \log_{10} \left( \frac{0.12 c}{0.12 + c - c^2} \right) \text{dB}
perceived loudness of linear taper and loading resistor in dB

Now, this looks closer to linear! That was a neat result, but the loading resistor method needs to be considered in the bigger picture.

Review: Output impedances and input impedances

You may or may not already know about output impedances and input impedances, so I’ll still cover it here. My understanding of this comes from this excerpt of a Wikipedia article however, so feel free to look there or at other sources as well.

Putting aside all the complexity that goes into designing a good audio amplifier, they’re usually modeled as an “ideal voltage source” chained to an “output impedance”, and if it wasn’t for this output impedance the ideal voltage source could output its set voltage at an infinite amount of current. Instead, as the current drawn increases, the output impedance drops more and more of the set voltage.

model of audio output

When an amplifier’s spec contains the output impedance, that’s the model invoked. It may be reported as the symbol ZsZ_s, and so that will be the symbol used here.

Speakers, headphones, and even the input of an amplifier are usually modeled as a single “input impedance” to represent the fact that they draw current—some more eagerly than others.

model of audio inputs

Again, when the specs of these devices include an input impedance, that’s the model invoked. It may be reported as the symbol ZLZ_L, and so that will be the symbol used here.

In many diagrams, the bigger picture is not shown, and this usually has no consequence. However, because we’re now holding resistances to specific values, we cannot ignore it: the input and output impedances interfere!

potentiometer and loading resistor in the entire context

In this scenario, it would technically be possible to calculate exactly what the behavior would be, given the output and input impedances too, then tune R1R_1 and R2R_2 accordingly, but we shouldn’t want to do that. Instead, we can try to claim that the behavior in this bigger picture is a good approximation of the one we originally targeted. To do so, we have to look at the conditions for “neglecting” the input impedance ZLZ_L and the output impedance ZSZ_S.

Looking at ZSZ_S, we find it in series with the upper leg of the potentiometer (1c)R1(1-c) R_1. The condition for “neglecting” that fact is that ZSZ_S is “much smaller than” (1c)R1(1-c) R_1. In other words, ZS(1c)R1Z_S \ll (1-c) R_1. There’s no solid definition for “much smaller than”, but we can say for now that “much smaller than” means smaller by an order of magnitude, or ZS<101(1c)R1Z_S < 10^{-1} \cdot (1-c) R_1.

Now, (1c)R1(1-c) R_1 can actually get arbitrarily small with the right cc. What we can do about it is give up on getting the approximation right for, say, c>0.9c > 0.9 or the last tenth of the turn in other words. In that case, the condition for neglecting ZSZ_S is now

ZS<102R1Z_S < 10^{-2} \cdot R_1

Going back to the example where R1=100kΩR_1 = 100 \text{k}\Omega, that means ZS<1kΩZ_S < 1 \text{k}\Omega. If we refer to a Wikipedia excerpt about line-level impedances, we find that line-level output impedances vary from 100Ω100 \Omega to 600Ω600 \Omega. That means we can neglect ZSZ_S as long as we use a line-level output.

potentiometer and loading resistor in the entire context, Z_L neglected

Looking at ZLZ_L, we find it parallel with the loading resistor (the lower leg of the potentiometer isn’t part of the problem). The condition for neglecting that fact is that ZLZ_L is “much larger than” R2R_2. Going by “much larger than” meaning larger by an order of magnitude for now, that means

ZL>101R2Z_L > 10^{1} \cdot R_2

Going back to the example where R2=12kΩR_2 = 12 \text{k}\Omega, that means ZL>120kΩZ_L > 120 \text{k}\Omega. According to the same Wikipedia article, line-level input impedances go from 10kΩ10 \text{k} \Omega and up. So, therefore, we have a problem.

The only universal solution here is to place a unity-gain buffer, but I feel that is outside the scope of this article. Instead, we can talk about what we can do to R2R_2 if we focus on some specific ZLZ_L.

If ZLZ_L is on the low end of that “10kΩ10 \text{k}\Omega and up” range, then we can consider ditching the loading resistor altogether. As a result, ZLZ_L itself is our loading resistor! I saw this approach once in a real inline volume control, and it literally was just a linear-taper 1kΩ1 \text{k}\Omega potentiometer used as a voltage divider. If you used a pair of headphones with an input impedance of 120Ω120 \Omega, then you’d still get a ratio of r=0.12r = 0.12! I suspect that there is some analysis to be done here about damping, but I’m not qualified enough to think about it.

If ZLZ_L is past that low end but not large enough to be neglected, then another possibility is to choose R2R_2 such that 11/R2+1/ZL\frac{1}{1/R_2 + 1/Z_L} is equal to the R2R_2 you originally wanted.

If ZLZ_L is large enough that it can be neglected after all, then we can plot what the behavior actually looks like in the bigger picture and see that it’s very similar to what we originally targeted!

perceived loudness of linear taper and loading resistor and impedances in dB

Curiously, we accepted the possibility of significant error for c>0.9c > 0.9, but this doesn’t materialize. I suspect that there might be an explanation for this revolving around R2R_2. Regardless, at the very least I’m sure that the condition for neglecting ZSZ_S presented will always be sufficient, though it doesn’t appear to be necessary here.

Addendum: “Second-order” Pseudo-logarithmic Volume Control

Notice that the range of volume control for this circuit is 20dB, give or take. There is a class of pseudo-logarithmic volume control circuits that are “second-order” in nature, with a range of around 40dB, though they require an op-amp. Here is the simplest version I’ve found.

2nd-order pseudo-logarithmic circuit

It has a behavior of

VV0=crc+1\frac{V}{V_0} = \frac{-c}{r-c+1}

with the decibel plot

loudness of second-order method in dB

Though, I wouldn’t recommend using this specific example in the real world. If the potentiometer fails, it could break the negative feedback loop, and the op-amp would next go slamming into its rails. I’ve seen some safer “second-order” varieties out there, but I leave designing them as an open question.