aboutsummaryrefslogtreecommitdiff
path: root/qolab/math/spectral_utils.py
diff options
context:
space:
mode:
authorEugeniy E. Mikhailov <evgmik@gmail.com>2024-07-13 21:30:08 -0400
committerEugeniy E. Mikhailov <evgmik@gmail.com>2024-07-13 21:30:08 -0400
commitd74643d7adfbf58e13f0a4607bf0fecbf950c144 (patch)
tree1f077cf56e549b52b84e25dd10c1c6142366a04d /qolab/math/spectral_utils.py
parent32f44d4e1d6ce8cae9d985cf49e08b94b2c44a3e (diff)
downloadqolab-d74643d7adfbf58e13f0a4607bf0fecbf950c144.tar.gz
qolab-d74643d7adfbf58e13f0a4607bf0fecbf950c144.zip
black formatter
Diffstat (limited to 'qolab/math/spectral_utils.py')
-rw-r--r--qolab/math/spectral_utils.py52
1 files changed, 43 insertions, 9 deletions
diff --git a/qolab/math/spectral_utils.py b/qolab/math/spectral_utils.py
index 797267e..dea7840 100644
--- a/qolab/math/spectral_utils.py
+++ b/qolab/math/spectral_utils.py
@@ -4,9 +4,17 @@ from scipy.fft import rfft, rfftfreq
def spectrum(t, y):
"""
- Calculate spectrum of real value signal with stripped away zero frequency component.
- Preserves amplitude of a coherent signal (Asin(f*t)) independent of sampling
- rate and time interval.
+ Calculate amplitude spectrum of real value signal.
+
+ Unlike ``scipy.fft.rfft()``, preserves amplitude (A) of a coherent signal
+ ``A*sin(f*t)`` independent of sampling rate and time interval.
+ I.e. at frequency 'f' we will get 'A'.
+
+ It also strips away zero frequency component.
+
+ Returns
+ -------
+ array of frequencies and corresponding amplitudes
"""
N = t.size
dt = np.mean(np.diff(t))
@@ -19,9 +27,17 @@ def spectrum(t, y):
def noise_density_spectrum(t, y):
"""
- Calculate noise amplitude spectral density (ASD), the end results has unitis of y/sqrt(Hz)
- i.e. it does sqrt(PSD) where PSD is powerd spectrum density.
+ Calculate noise amplitude spectral density (ASD) spectrum.
+
+ The end results has units of [units of y]/sqrt(Hz).
+ I.e. it calculates sqrt(PSD) where PSD is power spectrum density.
Preserves the density independent of sampling rate and time interval.
+
+ It also strips away zero frequency component, since it uses ``spectrum``
+
+ Returns
+ -------
+ reduced array of frequencies and corresponding ASDs
"""
freq, yf = spectrum(t, y)
yf = yf * np.sqrt(t[-1] - t[0]) # scales with 1/sqrt(RBW)
@@ -30,11 +46,29 @@ def noise_density_spectrum(t, y):
def noise_spectrum_smooth(fr, Ampl, Nbins=100):
"""
- Smooth amplitude spectrum, especially at high frequency end.
- Could be thought as logarithmic spacing running average.
- Since we assume the spectrum of the nose, we do power average (rmsq on amplitudes)
- Assumes that set of frequencies is positive and equidistant set.
+ Smooth amplitude spectral density (ASD) spectrum.
+
+ Could be thought as a running average with logarithmic spacing, so high
+ frequency components average bins with more "hits" and thus smoothed the most.
+
+ Since we assume the input spectrum of the nose (ASD),
+ we do power average (rmsq on amplitudes).
+
+ Assumes that the input frequencies are in positive and equidistant set.
Also assumes that frequencies do not contain 0.
+
+ Parametes
+ ---------
+ fr : list or array
+ array of frequencies
+ Ampl : list or array
+ array of corresponding noise amplitudes ASD
+ Nbin : integer
+ number of the bins (default is 100) in which frequencies are split
+
+ Returns
+ -------
+ reduced array of frequencies and corresponding ASDs
"""
frEdges = np.logspace(np.log10(fr[0]), np.log10(fr[-1]), Nbins)