diff options
-rw-r--r-- | qolab/math/spectral_utils.py | 52 |
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) |