Filters

Filters are implemented from a base mixin class, FiltersMixin, some examples of the currently implemented filters are the Bessel filters, BesselFiltersMixin, Butterworth filters, ButterworthFiltersMixin and elliptic filters, EllipticFiltersMixin.

class FiltersMixin

Base class for filter mixins for Signal derived classes.

__init__(*args, **kwargs)

Class constructor.

filters_plot(path, signal, *args, begin=None, end=None, munits=0, **kwargs)

Performs a plot of the original signal and the provided filtered signal.

Parameters:
  • path (str) – The path where to store the plot, see Plotter.plot().

  • signal (Self) – The filtered signal.

  • args – Additional arguments to pass to the plotting function, see Plotter.plot().

  • begin (Optional[float]) – The begin value of the horizontal axis where the plot starts, see Plotter.plot()

  • end (Optional[float]) – The end value of the horizontal axis where the plot end, see Plotter.plot().

  • munits (float) – Margin units for the plot, see Plotter.plot()

  • kwargs – Additional keyword arguments to pass to the plotting function, see Plotter.plot().

Return type:

Self

Returns:

Instance of the class.

exception FiltersError

Filters exception class.

Bessel Filters

The BesselFiltersMixin implements a mixin that can be added to Signal derived classes to add Bessel filters functionality, as shown in the code snippet below:

import signal_edges.signal as ses

class ExampleSignal(ses.filters.BesselFiltersMixin, ses.Signal):
    pass

An example of its usage using VoltageSignal is described below:

import numpy as np
import signal_edges.signal as ses

# Create timestamps for the signal, and calculate the sampling frequency.
signal_timestamps = np.linspace(start=0, stop=160, num=160, endpoint=False)
sampling_frequency = 1 / (signal_timestamps[1] - signal_timestamps[0])
# Create voltages for the signal, and add some noise to them.
signal_voltages = np.asarray([0, 0, 0, 0, 5, 5, 5, 5, 5, 5] * (160 // 10)) + \
                  np.random.normal(0, 0.1, 160)
# Create signal.
signal = ses.VoltageSignal(signal_timestamps, signal_voltages, "s", "V")
# Create the filtered signal.
filtered_signal = signal.filters_bessel(sampling_frequency, 2, lp_cutoff=sampling_frequency / 2.5)

# Plot original signal and filtered signal.
signal.filters_plot("signal.png", filtered_signal)

This code snippet generates the following plot:

../../_images/001_example_bessel_signal.png

The generated signal and filtered signal in the code snippet.

class BesselFiltersMixin

Bases: FiltersMixin

Mixin derived from FiltersMixin for Signal that implements Bessel filters.

filters_bessel(sampling_frequency, order, lp_cutoff=None, hp_cutoff=None, bp_cutoff=None, bs_cutoff=None)

Runs a Bessel filter on the signal, refer to scipy.signal.bessel() for more information.

One of lp_cutoff, hp_cutoff, bp_cutoff or bs_cutoff must be specified. If none or more than one are specified, an error is raised as it won’t be possible to determine the type of filter to apply.

Parameters:
  • sampling_frequency (float) – Sampling frequency in Hertz.

  • order (int) – Order of the filter.

  • lp_cutoff (Optional[float]) – Use a lowpass filter with this cutoff frequency in Hertz, defaults to None.

  • hp_cutoff (Optional[float]) – Use a highpass filter with this cutoff frequency in Hertz, defaults to None.

  • bp_cutoff (Optional[tuple[float, float]]) – Use a bandpass filter with this pair of cutoff frequencies in Hertz, defaults to None.

  • bs_cutoff (Optional[tuple[float, float]]) – Use a bandstop filter with this pair of cutoff frequencies in Hertz, defaults to None.

Raises:
  • FiltersError – Could not determine the type of filter to use.

  • FiltersError – Could not create underlying Second Order Sections for filter.

Return type:

Self

Returns:

A new instance of the class with the filtered signal.

Butterworth Filters

The ButterworthFiltersMixin implements a mixin that can be added to Signal derived classes to add Butterworth filters functionality, as shown in the code snippet below:

import signal_edges.signal as ses

class ExampleSignal(ses.filters.ButterworthFiltersMixin, ses.Signal):
    pass

An example of its usage using VoltageSignal is described below:

import numpy as np
import signal_edges.signal as ses

# Create timestamps for the signal, and calculate the sampling frequency.
signal_timestamps = np.linspace(start=0, stop=160, num=160, endpoint=False)
sampling_frequency = 1 / (signal_timestamps[1] - signal_timestamps[0])
# Create voltages for the signal, and add some noise to them.
signal_voltages = np.asarray([0, 0, 0, 0, 5, 5, 5, 5, 5, 5] * (160 // 10)) + \
                  np.random.normal(0, 0.1, 160)
# Create signal.
signal = ses.VoltageSignal(signal_timestamps, signal_voltages, "s", "V")
# Create the filtered signal.
filtered_signal = signal.filters_butterworth(sampling_frequency, 2, lp_cutoff=sampling_frequency / 2.5)

# Plot original signal and filtered signal.
signal.filters_plot("signal.png", filtered_signal)

This code snippet generates the following plot:

../../_images/002_example_butterworth_signal.png

The generated signal and filtered signal in the code snippet.

class ButterworthFiltersMixin

Bases: FiltersMixin

Mixin derived from FiltersMixin for Signal that implements Butterworth filters.

filters_butterworth(sampling_frequency, order, lp_cutoff=None, hp_cutoff=None, bp_cutoff=None, bs_cutoff=None)

Runs a Butterworth filter on the signal, refer to scipy.signal.butter() for more information.

One of lp_cutoff, hp_cutoff, bp_cutoff or bs_cutoff must be specified. If none or more than one are specified, an error is raised as it won’t be possible to determine the type of filter to apply.

Parameters:
  • sampling_frequency (float) – Sampling frequency in Hertz.

  • order (int) – Order of the filter.

  • lp_cutoff (Optional[float]) – Use a lowpass filter with this cutoff frequency in Hertz, defaults to None.

  • hp_cutoff (Optional[float]) – Use a highpass filter with this cutoff frequency in Hertz, defaults to None.

  • bp_cutoff (Optional[tuple[float, float]]) – Use a bandpass filter with this pair of cutoff frequencies in Hertz, defaults to None.

  • bs_cutoff (Optional[tuple[float, float]]) – Use a bandstop filter with this pair of cutoff frequencies in Hertz, defaults to None.

Raises:
  • FiltersError – Could not determine the type of filter to use.

  • FiltersError – Could not create underlying Second Order Sections for filter.

Return type:

Self

Returns:

A new instance of the class with the filtered signal.

Elliptic Filters

The EllipticFiltersMixin implements a mixin that can be added to Signal derived classes to add elliptic filters functionality, as shown in the code snippet below:

import signal_edges.signal as ses

class ExampleSignal(ses.filters.EllipticFiltersMixin, ses.Signal):
    pass

An example of its usage using VoltageSignal is described below:

import numpy as np
import signal_edges.signal as ses

# Create timestamps for the signal, and calculate the sampling frequency.
signal_timestamps = np.linspace(start=0, stop=160, num=160, endpoint=False)
sampling_frequency = 1 / (signal_timestamps[1] - signal_timestamps[0])
# Create voltages for the signal, and add some noise to them.
signal_voltages = np.asarray([0, 0, 0, 0, 5, 5, 5, 5, 5, 5] * (160 // 10)) + \
                  np.random.normal(0, 0.1, 160)
# Create signal.
signal = ses.VoltageSignal(signal_timestamps, signal_voltages, "s", "V")
# Create the filtered signal.
filtered_signal = signal.filters_elliptic(sampling_frequency, 2, lp_cutoff=sampling_frequency / 2.5)

# Plot original signal and filtered signal.
signal.filters_plot("signal.png", filtered_signal)

This code snippet generates the following plot:

../../_images/003_example_elliptic_signal.png

The generated signal and filtered signal in the code snippet.

class EllipticFiltersMixin

Bases: FiltersMixin

Mixin derived from FiltersMixin for Signal that implements elliptic filters.

filters_elliptic(sampling_frequency, order, lp_cutoff=None, hp_cutoff=None, bp_cutoff=None, bs_cutoff=None, pb_ripple=0.1, sb_ripple=100.0)

Runs an elliptic filter on the signal, refer to scipy.signal.ellip() for more information.

One of lp_cutoff, hp_cutoff, bp_cutoff or bs_cutoff must be specified. If none or more than one are specified, an error is raised as it won’t be possible to determine the type of filter to apply.

Parameters:
  • sampling_frequency (float) – Sampling frequency in Hertz.

  • order (int) – Order of the filter.

  • lp_cutoff (Optional[float]) – Use a lowpass filter with this cutoff frequency in Hertz, defaults to None.

  • hp_cutoff (Optional[float]) – Use a highpass filter with this cutoff frequency in Hertz, defaults to None.

  • bp_cutoff (Optional[tuple[float, float]]) – Use a bandpass filter with this pair of cutoff frequencies in Hertz, defaults to None.

  • bs_cutoff (Optional[tuple[float, float]]) – Use a bandstop filter with this pair of cutoff frequencies in Hertz, defaults to None.

  • pb_ripple (float) – Pass band ripple, defaults to 0.1.

  • sb_ripple (float) – Stop band ripple, defaults to 100.0.

Raises:
  • FiltersError – Could not determine the type of filter to use.

  • FiltersError – Could not create underlying Second Order Sections for filter.

Return type:

Self

Returns:

A new instance of the class with the filtered signal.