Limiter question...

Ross Bencina rbencina at
Thu Aug 27 04:13:51 EDT 1998


Forget overlap-add for a start...

what you need is...

1. A level detector
2. An Envelope generator
3. [optionally] a delay line to re-align the envelope with the signal

I've put my (amature) suggestions on implementing these stages below, 
but'd be interested in what the more knowledgable members of our 
comunity have to say about implementation :)

The level detector gives you the average or peak level of the incoming  
signal. One way of doing this would be to scan for the absoloute maximum 
value in your incoming buffer such as:

int max = 0;
for( int i=0; i <bufferLength; i++ ){
  if( buffer[i] > max )
    max = buffer[i];
  else if (-buffer[i] > max )
    max = -buffer[i];

This could be performed over smaller or larger buffer lengths, depending 
on you preference (I'll mention trade-offs later )

another way is to maintain an instantaneous peak value, which slowly 
decays, and is reset at every new peak:

peakval = peakval *.99;
if( abs(insamp) > max )
  max = abs(insamp);

The envelope generator generates a _smooth_[ish] sample by sample value 
which you use to scale the output (sample by sample). This could be a 
straight line, and exponential curve etc. There are different ways of 
designing the envelope, but usually it will have seperate times for 
attack, sustain and release.
For a limiter, when the level detector exceeds a threshold, you ask the 
envelope to ramp down to [threshold / level], otherwise you ask the 
envelope to ramp to unity. If the newly requested envelope value is 
lower than the current one, the envelope immediately starts its attack 
portion (ramps to the target over the attack time), if the requested 
value is larger (closer to unity) the envelope completes its sutain 
portion (if it has one) and then starts its release portions (ramps to 
the target over the release time).

Even if you are updating the envelope target based on a sample by sample 
peak detector - the attack time of the envelope (which needs to  be a 
certain length to stop clicks etc.) will cause transiant peaks to be let 
through (ie the envelope won't close down quick enough and the won't get 
limited properly). Depending on the application you could: 

A. Clip the output to ensure it dosn't exceed a threshold (which should 
probably be higher than the threshold used to drive the envelope.

B. Do peak detection on the input signal, but delay the version of the 
signal you are sending out (and multiplying by the envelope) by the 
attack time of the envelope + the latency of the peak detector - this 
way the envelope will have ramped down by the time the transient gets to 

Having just written this, I suspect that there is a way of simplifying 
peak detector B. by using the envelope time characteristics to smooth 
the time characteristics of the peak detector...

Jumbled, but food for thought none-the-less.

Ross B.

Ross Bencina.                             rossb at
Interactive Digital Sound Design.

Get Your Private, Free Email at

More information about the music-dsp mailing list