This is a simple way of expressing non-linear scales (such as decibels) in python. In stead of: gain = 10 ** (12/10.)
Use gain = 12 * dB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class DB:
'''
Convience class for decibel scale. Other non-linear scales such as the richter scale could be handled similarly.
Usage:
dB = DB()
.
. (later)
.
gain = 15 * dB
'''
def __rmul__(self, val):
'''
Only allow multiplication from the right to avoid confusing situation
like: 15 * dB * 10
'''
return 10 ** (val / 10.)
def __test__():
dB = DB()
gain = 10 * dB
assert abs(gain - 10) < 1e-8
try:
gain2 = dB * 10
raise Exception('Should raise a type error!')
except TypeError:
pass
__test__()
|
Often it is convenient to define constants that convert non-standard units to the canonical set of units you have chosen for your program. For instance if your prefer angles to be specified in radians you might define two constants:
RAD = 1. DEG = 180./pi
Later, you may specify values in either unit as:
theta = 25 * DEG phi = pi/2 * RAD
This trick does not work however for non-linear scales such as decibels, AKA dBs. This simple recipe allows similar convenience for those such situations.