Are you trying to control volume in an audio circuit but are stuck with just linear potentiometers? Don’t just use it in place of a logarithmic one, and consider this simple solution that works in a pinch: a loading resistor.

Pseudo-logarithmic volume control with loading resistors

This circuit is already circulating on the Internet; here is an already good article on the topic. The gist, though, is that it behaves likes a logarithmic potentiometer for most of the turn. That article also provides some good grab-and-go values for this: 100kOhm for $R_1$ and 12kOhm for $R_2$.

But why does this work? I’ve calculated the gain of this circuit to be exactly the following:

\[G(c) = \frac{rc}{r+c-c^2}\]

where $r = R_2/R_1$ (the ratio between the loading resistor and the potentiometer) and $c$ is a fraction that expresses the potentiometer’s turn.

Here’s a decibel plot of that curve, using 100kOhm for $R_1$ and 12kOhm for $R_2$, in Desmos. You can click through the “edit in Desmos” button if you want to play with the $R_1$ and $R_2$ interactively.

A straight line here would mean perfect logarithmic control, but this curve isn’t so bad either! There are, in fact, many values of $r$ that generate a decent-enough pseudo-logarithmic curve. This flexibility is a good thing because there are some constraints on $r$’s components, $R_1$ and $R_2$.

  1. $V_{\text{in}}$ can properly drive an impedance of at least $R_1 || R_2$.
    • If this constraint is broken—or if variable input impedance is a problem—then a unity-gain buffer in front is another alternative.
  2. $Z_\text{load} \gg R_2$.
    • In order for a potentiometer to function as a variable voltage divider, $Z_\text{load} \gg R_1$ is necessary, even logarithmic potentiometers!
    • In fact, using a loading resistor breaks that rule in a special way, but we get $Z_\text{load} \gg R_2$ in exchange.
      • Consider below a real-world loading resistor circuit: it in-fact has a loading resistance of $Z_\text{load} || R_2$.
      Real-world pseudo-logarithmic loading resistor circuit
      • We would like to ignore $Z_\text{load}$ as I intially pictured, and that requires $Z_\text{load} \gg R_2$. That said, carefully substituting $Z_\text{load} || R_2$ instead for the loading resistance is another alternative.
    • If this constraint is broken, then a unity-gain buffer after is another alternative.

Many line-level sources easily take care of the first constraint, but carefully check the second. If you just used 12kOhm for $R_2$, some line-level input impedances like 10k will definitely break the second. Other than that, the exact values of $R_1$ and $R_2$ may depend on your situation, but I personally use this process.

  1. For now, assume the second constraint ($Z_\text{load} \gg R_2$) is not broken.
  2. What input impedance $Z_\text{in}$ do you want? Let $R_2=Z_\text{in}$ for now.
    • Make sure $V_\text{in}$ is able to drive $Z_\text{in}$! This is the first constraint.
  3. Take some standard potentiometer value $R_1$.
  4. Calculate $r = R_2/R_1$.
  5. Plot $G(c) = (rc)/(r+c-c^2)$ in decibels.
  6. Repeat steps 3-5 if $G(c)$ doesn’t look right.
  7. Solve for and evaluate $R_2$ proper given $R_1 || R_2 = Z_\text{in}$.
  8. Consider what $Z_\text{load}$ will be, is the second constraint ($Z_\text{load} \gg R_2$) valid? If not, solve for and evaluate $R_{2,\text{new}}$ given $R_{2,\text{new}} || Z_\text{load} = R_{2,\text{old}}$.

But if all else fails, the paranoid approach of adding a unity-gain buffer to both ends will wipe away the constraints altogether. Anyway, you’d be blown away if you tried it! Doing it right, you can completely replace a logarithmic potentiometer with a linear one for the price of one resistor.

Addendum 1: Passive Volume Control

Consider an implementation where we decide to break the second constraint. Then, the loading resistance should be taken as $Z_\text{load} || R_2$ instead, but now what if we decided to remove $R_2$ from the circuit altogether? Then, we’d have a working configuration where $r = Z_\text{load}/R_1$.

Passive pseudo-logarithmic circuit

This realization has some applications for passive volume control, where $V_\text{out}$ is the end of the line. In fact, it is one of the only ways to do passive volume control when the other end is the load, so I’ve seen some consumer inline volume controls do this. To be specific, one used a 1k linear potentiometer, and that would mean $r=0.3$ if 300 ohm headphones were plugged into it.

That said, the impedance this circuit presents, $R_1 || Z_\text{load}$, is now way lower, so it can only be driven by an output stage. On top of that, let me mention how this isn’t good for audio quality. Consider a rule of thumb that circulates on the Internet: headphones should present an impedance eight times higher than the source’s output impedance, or $R_\text{out} > 8Z_\text{load}$. I’ve calculated that the maximum output impedance of any potentiometer $R_\text{pot}$ is $R_\text{out} = R_\text{pot}/4$. Combining this and the rule of thumb means the following new constraint.

\[r = \frac{Z_\text{load}}{R_1} > 2\]

If you plotted $G(c)$ for $r = 2$, the gain curve for that wouldn’t look too great. Breaking from this constraint / rule of thumb is necessary for passive volume control with this method.

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

Notice that the range of volume control for this circuit is 20dB, give or take. I’ve found 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.

Second-order pseudo-logarithmic circuit

It has a gain curve of:

\[G(c) = \frac{-c}{r-c+1}\]

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.