Source code for timescales.conversions.conv
"""Conversion utilities."""
import numpy as np
from timescales.utils import normalize as _normalize
def convert_knee(knee_freq):
"""Convert knee parameter(s) to time-constant value.
Parameters
----------
knee : float or array
Knee of the aperiodic spectral fit.
Returns
-------
tau : float
Timescale, in seconds.
"""
tau = 1. / (2 * np.pi * knee_freq)
return tau
def convert_tau(tau):
"""Convert tau(s) to knee frequency.
Parameters
----------
tau : float
Timescale, in seconds.
Returns
-------
knee : float or array
Knee of the aperiodic spectral fit.
"""
return convert_knee(tau)
[docs]
def knee_to_tau(knee_freq):
# Alias
return convert_knee(knee_freq)
[docs]
def tau_to_knee(tau):
# Alias
return convert_knee(tau)
[docs]
def tau_to_phi(tau, fs):
return np.exp(-1/(tau * fs))
[docs]
def phi_to_tau(phi, fs):
return -1/(np.log(phi) * fs)
[docs]
def psd_to_acf(freqs, powers, fs):
"""Convert a PSD to ACF.
Parameters
----------
freqs : 1d array
Frequency definition.
powers : 1d
Power spectral density.
fs : float
Sampling rate, in Hertz.
Returns
-------
lags : 1d array
Lag definitions.
corrs : 1d array
Correlation coefficients.
"""
powers = powers / np.sum(powers)
corrs = np.fft.ifft(powers, norm='forward')[:len(powers)//2].real
lags = np.arange(len(corrs)) * (fs/freqs[-1])
return lags, corrs
[docs]
def acf_to_psd(corrs, fs):
"""Convert ACF to PSD.
Parameters
----------
corrs : 1d array
Auto-correlations.
fs : float
Sampling rate, in Hertz.
Returns
-------
freqs : 1d array
Frequency definition.
powers : 1d
Power spectral density.
"""
# Compute power
powers = np.abs(np.fft.fft(corrs))**2
freqs = np.fft.fftfreq(len(corrs), 1/fs)
# Drop imaginary
freqs = freqs[:len(corrs)//2]
powers = powers[:len(corrs)//2]
return freqs, powers