 # Logarithm and exponential function with OpAmps

27 Feb 2022 - tsp
Last update 28 Feb 2022 7 mins

## A look at diodes

So lets first take a look at diodes. These are build by forming pn-junctions - i.e. usually a p-well inside a n-well on p substrate in the most common circumstances. The pn junction conducts current only when biased in one direction but not into the other. A typical diode data-sheet shows three regions:

• A conductive region when forward biased above a given threshold voltage. When one increases the forward voltage too much the diode will be thermally damaged due to high current.
• An isolated region when reversed biased in which the diode ideally would not conduct any current (in practice there is a low leakage current, usually on the scale of $nA$ or $pA$)
• If one increases the reverse voltage even more there is a point at which the diode will break down. For most diodes this will mean permanent failure, for Zener diodes this is the designed operational behavior to switch on only after exceeding a given well defined threshold voltage - there this is often used for voltage regulation, overvoltage protection, etc.

When bias voltage is increased above a given threshold the diode switches into conductive region. In this case the current in large signal region is described in theory the best way by the so called Shockley equation that provides a basic model for drift due to biasing, thermal diffusion and thermal recombination-generation processes. The curves shown in datasheets are usually looking approximately linear due to logarithmic scaling:

[ I \approx I_S(T) * (e^{\frac{U}{n * U_t}} - 1) ]

In this equation:

• $I$ is the current flowing over the diode
• $U$ is the biasing voltage
• $I_S(T)$ is the temperature dependent saturation current. The saturation current is the leakage current flowing through a diode while being operated in reverse biased (blocking) mode.
• $U_t$ is the thermal voltage $U_t = \frac{k_B * T}{q}$ with elementary charge $q$. This basically accounts for the thermal diffusion.
• The empirical emission coefficient $n$ that takes into account deviations of the real diode from the optimal model. This is mostly caused by recombination effects that reduce the Saturation current. An ideal diode would have a emission coefficient of $1$.
• The constants used are (in SI system):
• Boltzmann constant $k_B \approx 1.38 * 10^{-23} \frac{Ws}{K}$
• Elementary charge $q = e = 1.6 * 10^{-19} As$

As one can clearly see from the formula this is approximately an exponential function (dropping the $-1$ term is insignificant in the large signal operation region of the diode) ## Building an logarithmic amplifier

So how does one build an exponential amplifier using this knowledge about diodes? The idea is simple and works the same as as the inverting amplifier. One just uses the diode in the feedback path: How does this circuit work? Basically one just has to look at the current balance at the non inverting summation point while assuming that this summation point is virtual ground since the operational amplifier compares with the reference ground on the non inverting input:

[ I_R = \frac{U_{in}}{R_1} \\ I_D \approx I_S(T) * e^{\frac{U_D}{n * U_t}} \\ I_R = I_D \\ \frac{U_{in}}{R_1} = I_S(T) * e^{\frac{U_{out}}{n * U_t}} \\ \frac{U_{in}}{R_1 * I_S(T)} = e^{\frac{U_{out}}{n * U_t}} \\ \ln(\frac{U_{in}}{R_1 * I_S(T)}) = \frac{U_{out}}{n * U_t} \\ n * U_t * \ln(\frac{U_{in}}{R_1 * I_S(T)}) = U_{out} \\ n * U_t * \ln(U_{in}) - \underbrace{n * U_t * \ln(R_1 * I_S(T))}_{\approx 0} = U_{out} ]

In the above equations I’ve assumed that $I_S(T)$ is typically on the range of $10^{-9}$ ampere. Thus the logarithm might be in the range of $-10$ when using $k\Omega$ resistors. In addition to a typical $U_t$ on the range of $0.03V$ this leads to voltages in the $-0.4V$ range - this has to be compensated for in the final design of course but will be neglected during the circuit description.

As one can see $U_{out} \propto \ln{U_{in}}$

Note that these equations only hold as long as the input signal is positive with respect to the reference ground since the diode would block the feedback voltage when operating in the other regime.

To make the equations a little bit more readable one can of course absorb the scaling factor into the base of the exponential:

[ \frac{U_{in}}{R_1 * I_S(T)} = e^{\frac{U_{out}}{n * U_t}} \\ \frac{U_{in}}{R_1 * I_S(T)} = (e^{\frac{1}{n * U_t}})^{U_{out}} \\ a = e^{\frac{1}{n * U_t}} \\ \frac{U_{in}}{R_1 * I_S(T)} = a^{U_{out}} \\ \log_{a}(\frac{U_{in}}{R_1 * I_S(T)}) = U_{out} \\ \log_{a}(U_{in}) - \log_{a}(R_1 * I_S(T)) = U_{out} ]

## Building an exponential amplifier

Now one can calculate the natural logarithm one might also want to do the other way round and calculate the exponential function. This can be done by simply using the diode in the input path instead of the feedback. The equations work exactly the same way as for the logarithmic amplifier before - but they have input and output voltage exchanged:

[ I_R = \frac{U_{out}}{R_1} \\ I_D approx I_S(T) * e^{\frac{U_D}{n * U_t}} \\ I_R = I_D \\ \frac{U_{out}}{R_1} = I_S(T) * e^{\frac{U_{in}}{n * U_t}} \\ U_{out} = R_1 * I_S(T) * e^{\frac{U_{in}}{n * U_t}} ]

As one can see the output is proportional to the exponential of the input voltage. In both equations one can make ones life a little bit simpler when trying to imagine how these systems work by absorbing the scaling factor $\frac{1}{n * U_t}$ into the base as before:

[ \frac{U_{out}}{R_1} = I_S(T) * e^{\frac{U_{in}}{n * U_t}} \\ \frac{U_{out}}{R_1} = I_S(T) * a^{U_{in}} \\ U_{out} = R_1 * I_S(T) * a^{U_{in}} ]

## A simple application: Mixing signals

So where does one use such circuits? Of course there are many applications such as audio volume and generic computation, deflecting beams in logarithmic or exponential way, building function generators, etc. - but one is particular impressive in my opinion. This is the mixing of signals for low frequency applications (higher frequencies usually prohibit the usage of operational amplifiers and use more sophisticated layouts such as Gilbert cells for example).

As one can see the expressions for the exponential and logarithmic amplifier do exactly cancel each other:

[ U_{out} = R_1 * I_S(T) * a^{U_{1}} \\ U_{out} = R_1 * I_S(T) * a^{\log_{a}(U_{in}) - \log_{a}(R_1 * I_S(T))} \\ U_{out} = R_1 * I_S(T) * a^{\log_{a}(\frac{U_{in}}{R_1 * I_S(T)})} \\ U_{out} = R_1 * I_S(T) * \frac{U_{in}}{R_1 * I_S(T)} \\ U_{out} = U_{in} ]

Of course in reality there will be some drift between both stages but usually it’s closed enough.

To mix signals one usually wants to multiply them.

[ U_{out}(t) = U_{in,1}(t) * U_{in,2}(t) ]

Unfortunately there is no direct way of multiplying using an operational amplifier. But there is one to perform additions - the summation amplifier: The analysis of this circuit works similar to the inverting amplifier. One just has to sum up all currents flowing into the summation point at the inverting input:

[ I_{in,1} = \frac{U_{in,1}}{R_{in,1}} \\ I_{in,2} = \frac{U_{in,2}}{R_{in,2}} \\ I_{fb} = \frac{U_{out}}{R_{fb}} \\ I_{fb} = I_{in,1} + I_{in,2} ]

In the last equation it already has been taken into account that the current from feedback will flow into the different direction due to the inverting nature of this amplifier.

[ I_{fb} = I_{in,1} + I_{in,2} \\ \frac{U_{out}}{R_{fb}} = \frac{U_{in,1}}{R_{in,1}} + \frac{U_{in,2}}{R_{in,2}} \\ U_{out} = R_{fb} * (\frac{U_{in,1}}{R_{in,1}} + \frac{U_{in,2}}{R_{in,2}}) ]

In case all input resistors have the same resistance one only gets a single scaling factor:

[ I_{fb} = I_{in,1} + I_{in,2} \\ \frac{U_{out}}{R_{fb}} = \frac{U_{in,1}}{R_{in,1}} + \frac{U_{in,2}}{R_{in,2}} \\ U_{out} = \frac{R_{fb}}{R_{in}} * (U_{in,1} + U_{in,2}) ]

One can of course extend the concept of the summation amplifier to an arbitrary number of inputs:

[ U_{out} = R_{fb} * \sum_{n_{inputs}} \frac{U_{in,n}}{R_{in,n}} ]

So how does this summation become interesting for signal mixing? One can transform the problem of multiplication into an addition by taking the logarithm:

[ x * y \\ \ln(x*y) = \ln(x) + \ln(y) ]

Then one can of course apply the inverse transform again:

[ x * y \\ a^{\log_{a}(x*y)} = a^{\log_{a}(x) + \log_{a}(y)} ]

That way one can implement signal multiplication in an easy way using operational amplifiers: One of course has to take into account the saturation as well as the noise figures of the operational amplifiers.