DSPRelated.com
Forums

Audio Compressor/AGC in C or C++

Started by __GG December 9, 2005
On Sat, 10 Dec 2005 13:55:29 GMT, Richard Dobson
<richarddobson@blueyonder.co.uk> wrote:

>Any compressor is a non-linear effect, that modulates the source (watch out for >aliasing if the "corners" of the envelope are too sharp) and one way or another >will always have some sort of personality, which may or may not be deemed "musical".
Given that a sharp-cornered modulation will create harmonics, it would seem that even a slowly ramped mod would create harmonics, albeit low frequencies. Yet I don't remember seeing low-cut filtering on any post-mod stages.
>I think you really need to try all these ideas out for yourself, and decide! I >doubt you will get a complete answer here "do it this way"
Already got some valuable insights here. If I can get enough info and opinions on digital-domain approaches I'll be able to get a first version running and improve it later on.
>> G: >> What is the best way to control decay/release? Given that the release >> does not have to be micro-second accurate, I could add groups of, say, >> 100 sample abs values, then feed each into a fifo. Accumulate the >> total in the FIFO by adding each new value, ... > >Yes, that is a standard "closed-form" of averaging. >Envelope detection is a form of filtering, and filters can have all sorts of >slopes. The answers you seek may not be solely technical ones. For some >material, one style will work, for another it won't. The window over which >samples are scanned is itelf an important parameter,
I've also seen an approach that doesn't use a window per se. Each time a new sample comes in, the current tally is multiplied by (N - 1) / N. The new sample is divided by N and added in. I'm sure there's a specific name for that type of integration.
>One approach you might like to consider is to start by inspecting the behaviour >of some published compressors (download a few demos!), by feeding in a special >stereo source: one track contains simple dynamically changing waveforms (even a
Great idea.
>And (ahem) when the product is launched for which I was commissioned to supply a >"simple" compressor, you will be able to analyse that too! As a primarily >classically-oriented musician, I don't make much use of compressors, so it was >always a bit nerve-wracking designing something destined for unfamiliar musical >styles,
Can you tell us the name of the product? Obviously you'll lose the original range of a classical recording if compression is applied, but there are times that I'd like to raise the lower dynamic range above ambient traffic noise. Maybe that could be done in the CD player or playback chain, but I'm sure your compressor will serve a useful purpose.
On Fri, 09 Dec 2005 21:52:25 GMT, Richard Dobson
<richarddobson@blueyonder.co.uk> wrote:

>http://www.musicdsp.org/archive.php?classid=4#204
Thanks again for the reference, Richard. I've looked through that code and realized that I'm missing something. For one, the DC_OFFSET that's added in "to avoid log(0)." Another... I don't see where AttRelEnvelope is used. It looks like it was designed to wrap two EnvelopeDetector objects (for attack and release). However, the SimpleComp class uses two EnvelopeDetector objects directly. No visible AttRelEnvelope.
__GG wrote:

..
> Can you tell us the name of the product? >
Not yet; but I am told it may be released in January (unless there are delays etc, usual caveats), so remind me sometime in the new year. Like I said, it is a simple and basic compressor (just another leaf in the forest), maybe indistinguishable from dozens of other simple compressors out there, and not something there would be any point in "announcing" on public lists, even supposing that would be a proper thing to do. I mentioned it mainly to affirm that the suggestions I have offered reflect my own mini R&D journey making a compressor. Richard Dobson
I have done lots of digital compressors. RMS detection is a good way to
go because of the following;

When you play a musical note on an instrument like a piano, the
harmonics are NOT pure multiples of the fundamental. So if you look at
the waveform on a scope, after the initial attack you will see parts of
the waveform that have large peaks (because the instantaneous phase of
the harmonics is aligned in a certain way) and others where the
peak-to-average ratio is quite small. Your ear does not perceive this
as a change in amplitude because it seems to just add all the harmonics
together without regard to phase (in terms of judging amplitude). Now
the only method of detection that also has this property is RMS
detection. If you use peak detection you will hear un-natural sounding
modulation artifacts on supposedly steady tones from most real
instruments as the phase of the harmonics wanders around.

RMS detectors have strange transient behavior because they look like a
1st-order lowpass filter fed by the square of the input signal. That
means the attack time-constant is dependant on the size of the
amplitude step you are making, since it gets squared before being
applied to the filter. But there is a workable compromise for the time
constant that is fast enough for most normal applications, without
causing too much distortion on steady sine-waves (RMS detectors produce
a ripple on their outputs at 2X the input frequency, causing
3rd-harmonic distortion).

Of course multi-band compressor work better in general, and allow you
to tailor the time constants to the frequency band you are controlling.
But that's a whole different topic!

Bob Adams

Richard Dobson wrote:
> __GG wrote: > > .. > >> Can you tell us the name of the product? >> > > Not yet; but I am told it may be released in January (unless there are > delays etc, usual caveats), so remind me sometime in the new year. Like > I said, it is a simple and basic compressor (just another leaf in the > forest), maybe indistinguishable from dozens of other simple compressors > out there, and not something there would be any point in "announcing" > on public lists, even supposing that would be a proper thing to do. I > mentioned it mainly to affirm that the suggestions I have offered > reflect my own mini R&D journey making a compressor.
Richard, The simplest way I came up with to make a well behaved compressor with variable compression was to use a very flat compressor (1 dB variation of output level for 10 dB variation of input) output to one end of a fader pot and the uncompressed signal to the other end. Setting the slider chose the compression amount. Is your new product easily variable? Jerry -- Engineering is the art of making what you want from things you can get. &#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
Jerry Avins wrote:
..
> Richard, > > The simplest way I came up with to make a well behaved compressor with > variable compression was to use a very flat compressor (1 dB variation > of output level for 10 dB variation of input) output to one end of a > fader pot and the uncompressed signal to the other end. Setting the > slider chose the compression amount. Is your new product easily variable? > > Jerry
Not exactly in the way you describe. My design is entirely orthodox in that there is a user-variable threshold above which the compression applies, together with a variable compression slope. Your ratio of 10 is moderately steep (getting towards acting as a limiter). The only other standard refinement is to offer a choice of "hard" or "soft" knee, which simply says the transition between uncompressed and compressed is not represented by two lines at an angle, but by a nice rounded curve at the transition point. Just how rounded that curve might be is where the most individuality in a compressor can come in - in the limit it can make the whole transfer function a curve, rather than two straight lines with a rounded corner. The "simple" code examples one sees of compressors all use a 100% hard knee, as the code simply says "if above this value, do that". A soft knee requires a more elaborate approach - several ways to do it, needless to say, including the use of a literal stored transfer function. Quite a few commercial examples offer a custom user interface where you can see the transfer function drawn graphically, and even with control points to set parameters graphically with the mouse**. It is not usual in a compressor to offer a wet/dry mix control, which is what you describe, (depends in any case on the lookahead delay compensation being accurate, and unfortunately one cannot always rely on hosts doing that). ** One example of this is the "Cakewalk FX Compressor/Gate", supplied with SONAR, whrere indeed you have control of two turning points withkn the one effect. Richard Dobson
robert.w.adams@verizon.net wrote:

> I have done lots of digital compressors. RMS detection is a good way to > go because of the following; > > When you play a musical note on an instrument like a piano, the > harmonics are NOT pure multiples of the fundamental. So if you look at > the waveform on a scope, after the initial attack you will see parts of > the waveform that have large peaks (because the instantaneous phase of > the harmonics is aligned in a certain way) and others where the > peak-to-average ratio is quite small. ..
There are two distinct applications of a compressor. The first is what one might call macro-compression, perhaps applied to a whole vocal phrase. The goal here is to keep the overall loudness down, without (hopefully)otherwise colouring the sound. The likely confuration would be an RMS detector, with a medium to long attack and release times (could be as much as 300msecs). This is for example the job of an analog conditioning chain, to tame exuberant vocals before they are digitised. A second application is peak transient reduction, most especially in drums, which can generate extreme peaks which force the overlal level down to avoid clipping. The goal here is lodness maximisation, by compressing the peaks so that the overall level can be raised. Here a PEAK detector (typically combined with lookahead) can work extremely well, to compress a peak that may only last a few msecs. In other words, used this way the compressor effectively changes the envelope of a single sound; both attack and release times may be just a few msecs. Inevitably, the sound may be more coloured, but with drums that seems less important than regaining all that lost headroom. Of course, one can compromise by doing RMS detection over a very short window (say, 5msecs or even less), and I suspect some "Peak" options in compressors actually do it this way. I did find however that a plain peak detector, combined with a soft-ish knee, works pretty well on drums. But on something like a piano, using this form of compression is likely to change the character of the sound, by changing its envelope. On drums, the timbre change between the hit and the tail is important, so you can get away with heavy comression (which is of course a desired sound in it own right these days) while for a piano the envelope itself is also important; you run the risk of turning an acoustic piano into an electronic one! Or, described yet another way, short-window or peak compression is suited to the processing of a single (monophonic) voice, whereas macro-RMS compression may be applied to a whole (polyphonic) mix. Imagine the problems in compressing a polyphonic piano track, where a first note or chord is sustained, while a second note is struck. If you set the compressor fast enough to modify the envelope of the second note, that modification will be applied to the sustained note too! Richard Dobson
Richard Dobson wrote:
> Jerry Avins wrote: > .. > >> Richard, >> >> The simplest way I came up with to make a well behaved compressor with >> variable compression was to use a very flat compressor (1 dB variation >> of output level for 10 dB variation of input) output to one end of a >> fader pot and the uncompressed signal to the other end. Setting the >> slider chose the compression amount. Is your new product easily variable? >> >> Jerry > > > Not exactly in the way you describe. My design is entirely orthodox in > that there is a user-variable threshold above which the compression > applies, together with a variable compression slope. Your ratio of 10 is > moderately steep (getting towards acting as a limiter). The only other > standard refinement is to offer a choice of "hard" or "soft" knee, which > simply says the transition between uncompressed and compressed is not > represented by two lines at an angle, but by a nice rounded curve at the > transition point. Just how rounded that curve might be is where the most > individuality in a compressor can come in - in the limit it can make the > whole transfer function a curve, rather than two straight lines with a > rounded corner. The "simple" code examples one sees of compressors all > use a 100% hard knee, as the code simply says "if above this value, do > that". A soft knee requires a more elaborate approach - several ways to > do it, needless to say, including the use of a literal stored transfer > function. Quite a few commercial examples offer a custom user interface > where you can see the transfer function drawn graphically, and even with > control points to set parameters graphically with the mouse**. > > It is not usual in a compressor to offer a wet/dry mix control, which > is what you describe, (depends in any case on the lookahead delay > compensation being accurate, and unfortunately one cannot always rely on > hosts doing that). > > > ** One example of this is the "Cakewalk FX Compressor/Gate", supplied > with SONAR, whrere indeed you have control of two turning points withkn > the one effect.
My cobbled-together version was a variation of Mercury's microphone compressor, but only half as good. With fast attack and modestly long release, it was good with voice and acceptable for music. I'm sure there are lots of ways to vary the compression with a knob. The one I used seemed simple, so I did it. Although the compressor uses voltage dividers with diodes as one of the elements, distortion never exceeded .2% THD when I tested it at various levels. The design inherently has a long tail to the decay which can be mitigated with a shunt resistor. Jerry -- Engineering is the art of making what you want from things you can get. &#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
__GG wrote:

> On Fri, 09 Dec 2005 21:52:25 GMT, Richard Dobson > <richarddobson@blueyonder.co.uk> wrote: > >>http://www.musicdsp.org/archive.php?classid=4#204 > > Thanks again for the reference, Richard. I've looked through > that code and realized that I'm missing something. For one, the > DC_OFFSET that's added in "to avoid log(0)."
The logarithm has a pole at zero, corresponding to -infinity dB. So the code clamps the gain to some small value.
> Another... I don't see where AttRelEnvelope is used.
Right, the main class duplicates the functionality. Martin -- Quidquid latine scriptum sit, altum viditur.
"Vladimir Vassilevsky" <antispam_bogus@hotmail.com> wrote in message 
news:ICEmf.35582$Zv5.15048@newssvr25.news.prodigy.net...
> > > Jerry Avins wrote: > >> I wish car radios had compressors so I could ride over road noise with open >> windows without blasting myself on louder passages. It's not a great way to >> listen to music, but it's better than not listening. > > ...The FM broadcast is usually heavily compressed too.
Almost always true for pop music stations, but much less so for classical stations.