""" This module handles conversion between frequency units.
The supported units and their shorthands are:
- wl : wavelength in meter
- om: angular frequency in rad/s
- f: frequency in 1/s
- k: angular wavenumber in rad/m
The conversion functions have the form `shorthand2shorthand` which is not
pythonic but very short. A more pythonic conversion can be achieved by using
the `convert` function
>>> convert(x, 'wl', 'om')
The shorthands will be used throughout the package to identify frequency units.
The functions in this module should be used wherever a frequency convention
is necessary to avoid mistakes and make the code more expressive.
"""
from copy import copy
from .lib import sol, twopi
frequency_labels = {
'wl': 'wavelength',
'om': 'angular frequency',
'f': 'frequency',
'k': 'angular wavenumber'
}
frequency_units = {
'wl': 'm',
'om': 'Hz rad',
'f': 'Hz',
'k': 'rad/m'
}
[docs]def om2wl(om):
return twopi/om*sol
[docs]def k2wl(k):
return twopi/k
[docs]def f2wl(f):
return sol/f
[docs]def wl2f(wl):
return sol/wl
[docs]def om2f(om):
return om/twopi
[docs]def k2f(k):
return k*sol/twopi
[docs]def wl2om(wl):
return twopi*sol/wl
[docs]def f2om(f):
return twopi*f
[docs]def k2om(k):
return k*sol
[docs]def wl2k(wl):
return twopi/wl
[docs]def om2k(om):
return om/sol
[docs]def f2k(f):
return twopi*f/sol
# this dictionary can be used for programmatic conversions
conversions = {
'wl': {
'wl': lambda x: copy(x),
'om': wl2om,
'f': wl2f,
'k': wl2k
},
'om': {
'wl': om2wl,
'om': lambda x: copy(x),
'f': om2f,
'k': om2k
},
'f': {
'wl': f2wl,
'om': f2om,
'f': lambda x: copy(x),
'k': f2k
},
'k': {
'wl': k2wl,
'om': k2om,
'f': k2f,
'k': lambda x: copy(x)
}
}
[docs]def convert(x, unit1, unit2):
""" Convert between two frequency units.
Parameters
----------
x : float or array_like
Numerical value or array that should be converted.
unit1, unit2 : str
Shorthands for the original unit (`unit1`) and the destination unit
(`unit2`).
Returns
-------
float or array_like
The converted numerical value or array. It will always be a copy, even
if `unit1 == unit2`.
Notes
-----
Unit shorthands can be any of
`wl` : wavelength in meter
`om` : angular frequency in rad/s
`f` : frequency in 1/s
`k` : angular wavenumber in rad/m
"""
return conversions[unit1][unit2](x)