Tremolo Clicks and the One-Pole Smoother

April 22, 2026 · Luciano Muratore

Tremolo Clicks and the One-Pole Smoother

While working on a small C++ Tremolo effect, an audible click appeared every time the modulation depth changed suddenly. It happened consistently at around 5 seconds—exactly at the moment when the depth parameter jumped from one value to another in a single sample. The waveform showed nothing alarming. But the ears heard it immediately.

Understanding why it happened, and how to fix it, is a small but satisfying lesson in DSP.


Why the Click Happens

A Tremolo effect modulates the amplitude of a signal using a low-frequency oscillator (LFO). The gain applied to each sample looks like this:

gain = 1 - depth * lfo(t)

When depth changes abruptly—say, from 0.2 to 0.8 in a single sample—the gain multiplier makes a discontinuous jump. One sample the gain is one value; the very next sample it is something entirely different. The waveform has a hard edge.

That hard edge is a discontinuity. And discontinuities in audio translate directly to clicks. The ear is extraordinarily sensitive to sudden amplitude changes—it has no trouble distinguishing a smooth envelope from a step function, even at sample resolution.

The bottom plot in the figure tells the whole story: the difference between the unsmoothed and smoothed signals is exactly zero everywhere, except for a sharp spike right at 5 seconds. That spike is the click.

Tremolo amplitude plot showing the difference between smoothed and unsmoothed signals


The Fix: A One-Pole Smoother

The solution is to not apply the new depth value instantly. Instead, smooth the transition using a one-pole IIR filter:

y[n] = a * y[n-1] + (1 - a) * x[n]

Where the coefficient a is:

a = exp(-1 / (tau * fs))
  • tau is the time constant in seconds—how quickly the smoother responds.
  • fs is the sample rate.
  • x[n] is the new target value.
  • y[n] is the smoothed output.

Rather than snapping to the new depth, the smoother exponentially approaches it. The larger tau is, the slower and gentler the transition. The smaller it is, the faster it tracks—at the extreme of tau → 0, it becomes instantaneous again and the click returns.


What the Plot Shows

The top plot shows the tremolo amplitude between 3 and 7 seconds. Both the unsmoothed and smoothed signals are nearly indistinguishable to the eye—the orange trace covers the teal one almost entirely. The modulation envelope looks clean in both cases.

But the bottom plot shows their difference. Before and after the parameter change, the difference is flat at zero—both approaches produce identical output when the depth is stable. At exactly 5 seconds, a sharp spike appears: the unsmoothed signal jumps, the smoothed one ramps, and for a brief moment they diverge. That transient is the click. After a few milliseconds, the smoother catches up and the difference returns to zero.

The smoother does not change the steady-state behavior. It only bridges the gap between one parameter value and the next.


Why This Matters

Parameter discontinuities are one of the most common sources of audio artifacts in DSP. Any time a value changes—depth, frequency, gain, filter cutoff—if it changes faster than the ear can track as intentional, it will click. The one-pole smoother is the simplest and most efficient tool for preventing this.

It is a single multiply and add per sample. It introduces no allocations, no lookup tables, no latency worth mentioning. And it makes the tremolo feel analog again—smooth, gradual, natural.


Summary

  • A Tremolo effect applies the gain 1 - depth * lfo(t) sample by sample.
  • When depth changes abruptly, the gain makes a discontinuous jump—a step function—which the ear hears as a click.
  • A one-pole IIR smoother y[n] = a * y[n-1] + (1 - a) * x[n] replaces the step with an exponential ramp.
  • The coefficient a = exp(-1 / (tau * fs)) controls the ramp speed via the time constant tau.
  • The difference plot confirms it: zero everywhere except at the moment of change, where the smoother absorbs the transient.
  • Final Insight: The click was never in the audio signal. It was in the parameter. Smoothing the parameter, not the signal, is what makes it disappear.