Cockos Incorporated Forums How do you convert decibels (dB) to amplitude and back again?
 Register Track Bugs/Feature Requests Search Today's Posts Mark Forums Read

 View Poll Results: How do you convert dB to amp and back again? 6/ln(2) = 8.656170245 1 25.00% 20/ln(10) = 8.685889638 3 75.00% Voters: 4. You may not vote on this poll

12-15-2019, 03:08 AM   #1
GLD
Human being with feelings

Join Date: Jun 2019
Posts: 10
How do you convert decibels (dB) to amplitude and back again?

I am very new to making JSFX and I have been trying to figure out how people convert decibels to amplitude and back again.

After digging around in other JSFX files, I have notice that people tend to use approximations of the two following numbers:

1. 6/ln(2) = 8.656170245 ('AMP_dB = 8.6562' seems quite common)
2. 20/ln(10) = 8.685889638

These numbers are similar but not the same, apart from the first two significant figures.

After experimenting in JSFX, I found that when converting from -6dB to amplitude and back again that the first number got me closest to a circuit without change in the dB on the way out.

1.Amp_dB = 8.6562;

0.50000119 = exp(-6dB / Amp_dB);

-6dB = Amp_dB * log(0.50000119);

1b. Amp_dB = 8.65617025;

0.5 = exp(-6dB / 8.65617025);

-5.99997938dB = 8.65617025 * log(0.5);

2. Amp_dB = 8.6858896380650365530225783783321;

0.50118723 = exp(-6dB / 8.6858896380650365530225783783321);

-6.02057922dB = 8.6858896380650365530225783783321 * log(0.50118723);

3. Random method (I just played around with digits to get -6dB to be 0.5 and 0.5 to be -6dB on the way back:

Amp_dB (way out) = 8.6561703
Amp_dB (way back) = 8.6562

0.5 = exp(-6dB / 8.6561703);

-6dB = 8.6562 * log(-6dB);

Obviously, I changed the code to make it more legible. It was all done with variables, not numbers and I added the 'dB' bits in to make it clear.

The numbers above are the numbers shown in the panel at the right hand side of the the JSFX editor (I attached the image in case I copied them incorrectly).

So my question is this, how do you convert from decibels to amplitude (and back) and why?

After doing some research online I have seen both numbers used but I do not understand why some people tend to use one over the other.

This is very much out of my wheelhouse (I do not have a mathematical background and am just learning as I go) so I would appreciate the kind of an explanation/ opinion that a layman such as myself can interpret! Thank you!

GLD

4. EDIT: found the best way (I think) :

log2db = 8.6858896380650365530225783783321; // 20 / ln(10)
db2log = 0.11512925464970228420089957273422; // ln(10) / 20
0.50118723 = exp(-6 * db2log);
-6dB = log(0.50118723) * log2db;

This gives the 0.501 that is what wikipedia says should be the amp from -6dB

and gets back to exactly -6dB

I could not change the poll so just select option 2 I guess if you use this method!

I would still really love to know why the two different constants are used though...
Attached Images
 JSFX snip.JPG (15.9 KB, 94 views)

Last edited by GLD; 12-15-2019 at 03:52 AM. Reason: Found another way dB to amp and back to dB!

 12-15-2019, 02:49 PM #2 Heart Doctor Human being with feelings   Join Date: Jan 2015 Location: Munich Posts: 115 Gain (in dB) vs. multiplier Let us assume that your signal has the amplitude (or voltage) x0 and you want to change the amplitude to x. The correct formula for calculation of the gain Lx (in dB) is: Lx = 20 * log10(x/x0) dB Lx is the gain in dB and log10 is the decadic logarithm (base 10). Examples: If you double the amplitude (x/x0 = 2), you apply positive gain of Lx = 6.0206 dB If you reduce the amplitude to half (x/x0 = 0.5), you apply negative gain of Lx = -6.0206 dB We can invert the formula. Now, if your gain change Lx (in dB) is given, you can calculate the corresponding amplitude ratio x/x0 as follows: x/x0 = 10 ^(Lx / 20 dB) Examples: Lx = 6 dB of gain multiply the amplitude by factor 1.995 Lx = -6 dB of gain multiply the amplitude by factor 5.012 --------------------------------------------------------------- You notice that the correct formula does not give us "nice" numbers. For this reason, it is common to use a different formula: x/x0 = 2 ^(Lx / 6 dB) This formula has the advantage that gain values of 6 dB and -6 dB correspond to multipliers of 2 and 0.5, respectively. Nice numbers, easy to remember and easy to type into a parameter window. Although these values are not fully correct, they are so close to the correct result that the difference does not matter in general. Last edited by Heart Doctor; 12-15-2019 at 03:02 PM.
 12-15-2019, 04:37 PM #3 GLD Human being with feelings   Join Date: Jun 2019 Posts: 10 Gain (in dB) vs. multiplier Thank you Heart Doctor! That makes sense- I do not understand how such things can be used interchangeably but I now have two ways to get the correct numbers in and out so I am very happy with that- thanks again- G
 12-16-2019, 01:48 AM #4 SaulT Human being with feelings   Join Date: Oct 2013 Location: Seattle, WA Posts: 806 When it comes to this type of thing there are often ways that are "correct" and ways that are "fast" but not often ways that are both "correct" and "fast". 2^(x/6) is a useful approximation because it's easy to remember, and in some contexts is faster than 10^(x/20). This type of approximation is not always necessary. The difference between 2^x and 10^x is fairly negligible. That said, there are functions that by default take up huge amounts of processor time, and so lots of time is spent finding shortcuts and approximations that will deliver satisfactory results with less CPU crunch. One example is a saturation algorithm like the hyperbolic tangent. Tanh() is sloooow, so we spend a lot of time trying to find alternative functions and approximations that will give us the look/sound/performance of tanh() without the CPU hit. There is always a tradeoff. TANFL - there ain't no free lunch. Need a steeper slope on your filter? It'll mean more CPU and possibly more filter ring. Need linear phase? Here's your group delay/latency. Want to preserve all of those nonlinearities in your filter structure? Be prepared to run an iterative solver like Newton Raphson. Ladder filter not very precise in the upper octave or two? Here's your oversampling, adding development time and a big hit to CPU. Realizing that everything is a tradeoff really opened my eyes.
12-16-2019, 12:28 PM   #5
ErBird
Human being with feelings

Join Date: Jan 2017
Location: Los Angeles
Posts: 381

Quote:
 Originally Posted by GLD I do not understand how such things can be used interchangeably
6/ln(2) and 20/ln(10) are actually change of base formulas, allowing you to use exp() and log() (actually natural log) functions.

Proof:

10^(x/20) and 20*log10(x) are the scientific standard, unfortunately. I feel like this is slightly at odds with common sense in audio. 6dB=2.0 feels more intuitive compared to 20dB=10.0, but I have run into problems before using base 2 and have stuck with base 10 since. Almost everyone, including Reaper internally, seem to use base 10.

 12-16-2019, 03:25 PM #6 GLD Human being with feelings   Join Date: Jun 2019 Posts: 10 Saul T- thank you for the response- I kind of guessed it might have been a performance choice but I did not really see much of an obvious difference in the 'amount' of calculation required so thank you for clarifying! ErBird - that is great thank you! Your explanation makes a lot of sense- you are essentially picking different points along the same scale it seems and that leads to greater accuracy because a 6dB increase is actually 1.995262315 times louder whearas a 20dB increase is exactly (or more exactly) 10 times louder, right? Maths is fun! Thank you all -G
 02-18-2020, 06:40 PM #7 ErBird Human being with feelings   Join Date: Jan 2017 Location: Los Angeles Posts: 381 I forgot to respond. Sry. The two formulas are very close: At 6 dB input, the first one equals exactly 2. Point (6,2) At 20 dB input, the second one equals exactly 10. Point (20,10) a^(x/b) is equivalent to (a^(1/b))^x so whether you change a or b you're just changing the base of the exponential equation (f(x)=c^x). For any positive c, f(0)=1, so by changing the base you can choose one other point that the function passes exactly through. 10^(x/20) is the scientific standard, so I'd follow that. 2^(x/6) is a rare case where a and b are both integers AND a^(1/b) ≈ 10^(1/20)
 02-20-2020, 05:35 AM #8 GLD Human being with feelings   Join Date: Jun 2019 Posts: 10 Wow thanks ErBird, I am getting a real education here! Great stuff! G
 02-20-2020, 06:08 PM #9 Thonex Human being with feelings   Join Date: May 2018 Location: Los Angeles Posts: 1,085 These are the 2 functions I use in Lua (thanks to SPK77): Code: ```------------------------------------------------------------ -- Mod from SPK77 -- http://forum.cockos.com/showpost.php?p=1608719&postcount=6 --Trak_Vol_dB = 20*math.log(val, 10) end --Trak Vol val = 10^(dB_val/20) end ------------------------------------------------------------ ------------------------------------------------------------- -- item Vol conversion https://forum.cockos.com/showthread.php?p=2200278#post2200278 ----------------------------------------------------------- local LN10_OVER_TWENTY = 0.11512925464970228420089957273422 function DB2VAL(x) return math.exp(x*LN10_OVER_TWENTY) end function VAL2DB(x) if x < 0.0000000298023223876953125 then return -150 else return math.max(-150, math.log(x)* 8.6858896380650365530225783783321); end end``` __________________ Cheers, Andrew K v6.03+dev0114 - January 14 2020 • Mac 10.12.+ • i7 Quad 2.9GHz • 24GB

 Thread Tools Display Modes Linear Mode

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is Off Forum Rules
 Forum Jump User Control Panel Private Messages Subscriptions Who's Online Search Forums Forums Home REAPER Forums     REAPER General Discussion Forum     newbieland     REAPER Q&A, Tips, Tricks and Howto     Recording Technologies and Techniques     REAPER Compatibility     REAPER Color Themes and Icon Sets     MIDI Hardware, Control Surfaces, and OSC     REAPER Non-English Speaking User Forums         Forum de REAPER en français         Foro de REAPER en Español         Fórum do REAPER em português         Forum di REAPER in italiano         Deutschsprachiges REAPER Userforum         Pyccкоязычный фopyм REAPER     REAPER Bug Reports     REAPER Feature Requests     Dstruct's Casa De Nitpicks     REAPER for Live Use     REAPER for Video Editing/Mangling     REAPER for Ambisonic and 3D positional audio uses     ReaScript, JSFX, REAPER Plug-in Extensions, Developer Forum     REAPER for macOS X     REAPER for Linux     REAPER Pre-Release Discussion     REAPER Music/Collaboration Discussion NINJAM Discussion     NINJAM User Discussion     NINJAM Developer Discussion Other Software Discussion     WDL users forum     LICEcap Discussion     OSCII-bot forum     Old Cockos Products Forum

All times are GMT -7. The time now is 04:27 AM.

 -- Cockos ---- REAPER 5 ---- Reaper 3 ---- Reaper 2 ---- Reaper 1 Contact Us - Çockos Incorporated - Archive - Top