| What does the compress opcode do?
>From a cursory look at the doc, it uses dB, and rather than calculating rms,
looks at peaks.
Art Hunkins
----- Original Message -----
From: "Oeyvind Brandtsegg"
To: "Csound mailing list address"
Sent: Friday, September 20, 2013 4:11 AM
Subject: [Csnd] compression, logarithmic or linear
> Hi,
> I'm building a compressor for pedagogical purposes,
> and stumbled upon a question.
> When calculating the gain reduction, should we always work in dB or in
> a linear amplitude scale?
> For example, with a threshold of -20 and a ratio of 2:1, using an
> input signal at 0dB:
> - should I get a stable output at -10 dB,
> - or at amplitude 0.55 (-20 dB is amp=0.1, 0 dB is amp=1.0)
>
> I'm guessing it should work in dB,
> but figured it sensible to ask.
> It's not just the relation between parameter values and output level,
> the compressor will react differently to a dynamic input as well, so
> transients will be shaped differently.
> They sound differently, so of course there's no reason not to have
> both methods available, but it would be interesting to get insight
> into what is most common, what other implementations use, and what
> good old hardware boxes do.
>
> Below is a csd doing linear compression on the right channel and dB
> compression in the left.
>
> best
> Oeyvind
>
>
>
>
> -ocompressor1compare.wav ; output to audio file
>
>
>
> sr = 48000
> ksmps = 1
> nchnls = 2
> 0dbfs = 1
>
> ;***************************************************
> ;ftables
> ;***************************************************
>
> giSine ftgen 0, 0, 65536, 10, 1 ; sine
>
> ;***************************************************
> ; compare linear and dB based compression
> ;***************************************************
> instr 2
>
> iamp = ampdbfs(p4) ; Amp in -dB
> kthresh = p5 ; compression threshold
> kratio = p6 ; compression ratio
>
> ; audio generator
> a1 oscili iamp, 440, giSine ; sine tone
>
> ; compressor (dB)
> krms1 rms a1 ; analyze amplitude
> of input signal
> krms1 = krms1 * 1.42 ; normalize the
> rms measurement
> krms_dB1 = dbfsamp(krms1) ; convert to dB scale
> kovershoot1 = kthresh - krms_dB1 ; how much
> over the threshold are we?
> ktarget1 = kthresh - (kovershoot1*(1/kratio)) ;
> target output level (with current input level, threshold and ratio)
> kampMod_dB1 = ktarget1 - krms_dB1 ;
> difference from target = adjust amount
> kampMod_dB1 limit kampMod_dB1, -150, 0 ; do not
> adjust unless negative
> kampMod1 = ampdbfs(kampMod_dB1) ; convert
> back to normalized scale
> acomp1 = a1*kampMod1 ; apply
> amplitude modification
>
> ; compressor (linear)
> krms rms a1 ; analyze amplitude
> of input signal
> krms = krms * 1.42 ; normalize the
> rms measurement
> krms_dB = dbfsamp(krms) ; convert to dB
> scale
> kovershoot = krms - ampdbfs(kthresh) ; how much
> over the threshold are we?
> ktarget = ampdbfs(kthresh) + (kovershoot*(1/kratio))
> ; target output level (with current input level, threshold and ratio)
> kampMod = ktarget/krms ; get
> adjustment factor as ratio between target and input amp
> kampMod limit kampMod, 0, 1 ; do not
> adjust if over 1
> acomp = a1*kampMod ; apply amplitude
> modification
>
> ; audio out
> outs acomp1, acomp
> endin
> ;***************************************************
>
>
>
>
>
> ;compression
> ; start dur amp thresh ratio
> i2 0 3 -0 -20 2
> i2 ^+4 3 -0 -20 3
> i2 ^+4 3 -0 -20 6
>
>
>
>
> --
>
> Oeyvind Brandtsegg
> Professor of Music Technology
> NTNU
> 7491 Trondheim
> Norway
> Cell: +47 92 203 205
>
> http://flyndresang.no/
> http://www.partikkelaudio.com/
> http://soundcloud.com/brandtsegg
> http://soundcloud.com/t-emp
>
>
> Send bugs reports to the Sourceforge bug trackers
> csound6:
> https://sourceforge.net/p/csound/tickets/
> csound5:
> https://sourceforge.net/p/csound/bugs/
> Discussions of bugs and features can be posted here
> To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
> csound"
>
>
|