[LAD] Mixing audio: Noiseless volume changes

Fons Adriaensen fons at linuxaudio.org
Tue Mar 19 16:31:36 UTC 2013


On Tue, Mar 19, 2013 at 04:46:10PM +0100, Tim Goetze wrote:
 
> However, I still take issue with the rather exaggerated claim that
> using a biquad to smoothen gain changes would be "giant overkill".  It
> may be slightly less efficient than your now optimised version, but
> certainly not enough to substantiate this claim. 

A biquad is overkill because it has 5 free parameters, while the 
filter that is required only has 3: frequency, damping, and gain
(and those map almost 1 to 1 to w, a, b). Also, unless the user
computes the filter by hand and discovers it can be simplified,
he/she would probably use a library routine, i.e. a function call
for each sample.

> BTW, at the cost of that one extra multiplication, the biquad is more
> versatile if you run the gain filter permanently: you can simply feed
> it the current knob value and it will automatically produce a nice,
> smooth curve, without needing to be set up again for every gain
> change.

Exactly the same with the form I proposed, w, a, b need to be computed
just once, not for every gain change. In fact only w depends on the
sample rate, a and b are fixed constants. So actually you would code
it as:


gm = 1.07 * gt;
for (i = 0; i < nframes; i++)
{
    g1 += w * (gm - g1 - 0.07f * g2);
    g2 += w * (g2 - g1);
    out [i] = g2 * in [i];
}

Without the '-0.07f  * g2' it would just be two
first order LP filters in series.

Ciao,

-- 
FA

A world of exhaustive, reliable metadata would be an utopia.
It's also a pipe-dream, founded on self-delusion, nerd hubris
and hysterically inflated market opportunities. (Cory Doctorow)



More information about the Linux-audio-dev mailing list