Source code for spectral
import sys
import time
import numpy as np
try:
import pyfftw
pyfftw.interfaces.cache.enable()
except ImportError:
sys.stderr.write("pyfftw unavailable\n")
try:
from stfio import plot as stfio_plot
except ImportError:
sys.stderr.write("stfio unavailable\n")
[docs]def fgaussColqu(x, f_c):
"""
Eq. 5 from Colquhoun & Sigworth, p. 486 of the blue book
np.log(2.0)/2.0 = 0.34657359028
Parameters
----------
x : numpy.ndarray
Frequencies
f_c : Cutoff frequency (-3dB)
Returns
-------
gauss : numpy.ndarray
Transfer function to achieve -3dB at f_c
"""
return np.exp(-0.34657359028*(x/f_c)*(x/f_c))
[docs]def convolve(x, transfer, arglist, verbose=True):
"""
Convolves an array with a transfer function in the frequency domain
Parameters
----------
x : stfio_plot.Timeseries
Input data
transfer : function
Transfer function
arglist : list
Additional arguments to transfer
verbose : bool, optional
Verbose output. Default: False
Returns
-------
filtered : stfio_plot.Timeseries
Filtered data
"""
t0 = time.time()
inputa = x.data.copy()
outsize = int(len(inputa)/2.0 + 1)
outputa = np.empty((outsize), dtype=np.complex)
fft = pyfftw.FFTW(inputa, outputa, direction='FFTW_FORWARD',
flags=('FFTW_ESTIMATE',), threads=8)
ifft = pyfftw.FFTW(outputa, inputa, direction='FFTW_BACKWARD',
flags=('FFTW_ESTIMATE',), threads=8)
if verbose:
sys.stdout.write("Computing frequencies... ")
sys.stdout.flush()
f = np.arange(0, len(outputa), dtype=np.float) / (len(inputa) * x.dt)
try:
assert(len(f) == len(outputa))
except:
sys.stderr.write("\nError in array lengths: %d != %d\n" % (
len(f), len(outputa)))
sys.exit(0)
if verbose:
sys.stdout.write("done\nForward fft (convolve)... ")
sys.stdout.flush()
fft()
outputa *= transfer(f, *arglist)
if verbose:
sys.stdout.write("done\nReverse fft (convolve)... ")
sys.stdout.flush()
ifft(normalise_idft=False)
# Scale
inputa /= len(x.data)
if verbose:
sys.stdout.write("done (%.2f ms)\n" % ((time.time()-t0)*1e3))
sys.stdout.flush()
return stfio_plot.Timeseries(inputa, x.dt)
[docs]def gaussian_filter(x, f_c, verbose=True):
"""
Gaussian filter
Parameters
----------
x : stfio_plot.Timeseries
Input data
f_c : float
Cutoff frequency in kHz (-3 dB)
verbose : bool, optional
Verbose output. Default: False
Returns
-------
x convolved with a Gaussian filter kernel.
"""
return convolve(x, fgaussColqu, [f_c, ], verbose=verbose)
[docs]def lowpass(x, f_c, verbose=True):
"""
Lowpass filter
Parameters
----------
x : stfio_plot.Timeseries
Input data
f_c : float
Cutoff frequency in kHz (-3 dB)
verbose : bool, optional
Verbose output. Default: False
Returns
-------
x convolved with a Gaussian filter kernel.
"""
return gaussian_filter(x, f_c, verbose=verbose)
[docs]def highpass(x, f_c, verbose=True):
"""
Highpass filter
Parameters
----------
x : stfio_plot.Timeseries
Input data
f_c : float
Cutoff frequency in kHz (-3 dB)
verbose : bool, optional
Verbose output. Default: False
Returns
-------
x convolved with a Gaussian filter kernel.
"""
return convolve(
x, lambda f, f_c: 1.0 - fgaussColqu(f, f_c), [f_c, ],
verbose=verbose)