Skip to content

Commit

Permalink
v0.0.1 release
Browse files Browse the repository at this point in the history
  • Loading branch information
Bruno Lebon authored and Bruno Lebon committed May 24, 2019
1 parent fd68ba2 commit 8ab4745
Show file tree
Hide file tree
Showing 9 changed files with 74 additions and 55 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ docs/_build/

# Jupyter
.ipynb_checkpoints
*.ipynb

# Environments
.env
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ pip install cavitometer-deconvolve
```

## Usage
See docs/examples.rst for usage examples.
See [docs/examples.rst](https://github.com/blebon/cavitometer-deconvolve/blob/master/docs/examples.rst)
for usage examples.
55 changes: 31 additions & 24 deletions cavitometer_deconvolve/hardware/sensitivities.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,53 +5,60 @@
"""

from numpy import genfromtxt
from numpy import genfromtxt, ndarray


class Probe:
"""Contains the probe sensitivity values.
Probes are calibrated when resting vertically (i = 0) or at 45 deg (i = 1).
"""
def __init__(self, filename):
def __init__(self, filename: str) -> None:
"""Initializes the frequency and sensitivity arrays from file
Keyword arguments:
filename -- the name of the probe sensitivity values csv file
:param filename: the name of the probe sensitivity values csv file
:rtype: None
"""
self.filename = filename
self._filename = filename
_file_array = genfromtxt(filename,
delimiter=',',
skip_header=1,
usecols=None,
unpack=False,
)
self.frequencies = _file_array[:, 0]
self.sensitivities = _file_array[:, 1:]

def get_frequencies(self):
"""Return frequencies"""
return self.frequencies

def get_sensitivities(self, i=0):
"""Return sensitivities.
Keyword arguments:
i -- 0 = vertical probe, 1 = probe inclined at 45 deg.
self._frequencies = _file_array[:, 0]
self._sensitivities = _file_array[:, 1:]

@property
def frequencies(self) -> ndarray:
"""Return frequencies
:rtype: ndarray
"""
return self.sensitivities[:, i]
return self._frequencies

def get_sensitivities(self, i: int = 0) -> ndarray:
"""Return get_sensitivities.
:param i: 0 = vertical probe, 1 = probe inclined at 45 deg.
:rtype: ndarray
"""
return self._sensitivities[:, i]

def __repr__(self):
return self.filename
return self._filename

def __unicode__(self):
return self.filename
return self._filename

def __str__(self):
return self.filename
return self._filename


class PreAmplifier(Probe):
def get_sensitivities(self):
"""Return sensitivities. No orientation."""
return self.sensitivities[:, 0]
def get_sensitivities(self) -> ndarray:
"""Return get_sensitivities. No orientation.
:rtype: ndarray
"""
return self._sensitivities[:, 0]
23 changes: 15 additions & 8 deletions cavitometer_deconvolve/math/FFT.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,18 @@

from __future__ import division

from numpy import fft, empty
from numpy import fft, empty, ndarray
from pyfftw import interfaces


def fast_fourier_transform(time, signal, units):
def fast_fourier_transform(time: ndarray, signal: ndarray, units: list) -> tuple:
"""Performs the Fast Fourier Transform on the time signal.
Keyword arguments:
time -- the time numpy array
signal -- the signal numpy array
units -- the SI units for the time and signal arrays
:param time: the time numpy array
:param signal: the signal numpy array
:param units: the SI units for the time and signal arrays
:return: frequency, fourier transform
:rtype: tuple
"""
# If units in ms, multiply step time by 1e-3
step = (time[1] - time[0])
Expand All @@ -36,22 +37,28 @@ def fast_fourier_transform(time, signal, units):
return freq, fourier


def two_sided_to_one(two_sided):
def two_sided_to_one(two_sided: ndarray) -> ndarray:
"""Two sided FFT to one.
numpy/scipy FFT functions yield two sided spectra while calibration is on one
sided spectra. Conversion is required before deconvolution process.
:param two_sided: two sided FFT
:rtype: ndarray
"""
one_sided = empty(len(two_sided) // 2 + 1)
one_sided[1:len(two_sided) // 2 + 1] = 2 * two_sided[0:len(two_sided) // 2]
one_sided[0] = two_sided[len(two_sided) // 2]
return one_sided


def one_sided_to_two(one_sided):
def one_sided_to_two(one_sided: ndarray) -> ndarray:
"""One sided FFT to two.
Revert to two sided FFT before inverse fourier transform.
:param one_sided: one sided FFT
:rtype: ndarray
"""
two_sided = empty(2 * len(one_sided) - 1)
two_sided[0:len(one_sided) - 1] = 0.5 * one_sided[1:]
Expand Down
26 changes: 14 additions & 12 deletions cavitometer_deconvolve/math/deconvolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,30 @@
"""

from numpy import vectorize, linspace, sqrt
from numpy import vectorize, linspace, sqrt, ndarray
# from scipy.signal import blackman
from scipy.interpolate import interp1d

from pyfftw import interfaces

from cavitometer_deconvolve.math.FFT import fast_fourier_transform, two_sided_to_one, one_sided_to_two
from cavitometer_deconvolve.math.convert import dB_to_V
from cavitometer_deconvolve.hardware.sensitivities import Probe, PreAmplifier


def deconvolution(time, signal, units, probe, pre_amp=None):
def deconvolution(time: ndarray, signal: ndarray, units: list,
probe: Probe, pre_amp: PreAmplifier = None) -> tuple:
"""Converts the voltage signal to pressures.
1. Interpolate the sensitivities and amplification factors in the FFT frequency range.
1. Interpolate the get_sensitivities and amplification factors in the FFT frequency range.
2. Apply deconvolution formula
Keyword arguments:
time -- the time numpy array
signal -- the signal numpy array
units -- the SI units for the time and signal arrays
probe -- Probe instance containing the sensitivity values
pre_amp -- PreAmplifier instance containing the pre-amp factors
:param time: the time numpy array
:param signal: the signal numpy array
:param units: the SI units for the time and signal arrays
:param probe: Probe instance containing the sensitivity values
:param pre_amp: PreAmplifier instance containing the pre-amp factors
:rtype: tuple
"""
# For zero padding, uncomment concatenate lines if required
# N0 = len(x1)
Expand All @@ -39,7 +41,7 @@ def deconvolution(time, signal, units, probe, pre_amp=None):
# smooth = 0.0

# 1. Interpolation
sensitivity_function = interp1d(probe.get_frequencies(),
sensitivity_function = interp1d(probe.frequencies,
decibel_to_volts(probe.get_sensitivities()),
kind='nearest',
fill_value="extrapolate",
Expand All @@ -48,7 +50,7 @@ def deconvolution(time, signal, units, probe, pre_amp=None):
# sensitivity_function.set_smoothing_factor(smooth)

if pre_amp:
amplification_factor = interp1d(pre_amp.get_frequencies(),
amplification_factor = interp1d(pre_amp.frequencies,
pre_amp.get_sensitivities(),
kind='nearest',
fill_value="extrapolate",
Expand Down
16 changes: 8 additions & 8 deletions cavitometer_deconvolve/utils/read.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
from numpy import genfromtxt, isnan, nan_to_num


def get_units(filename, extension=".csv"):
def get_units(filename: str, extension: str = ".csv") -> tuple:
""" Read the units from the raw signal file.
Keyword arguments
filename -- name of raw signal file, including path
extension -- extension of raw files (default '.csv')
:param filename: name of raw signal file, including path
:param extension: extension of raw files (default '.csv')
:rtype: tuple
"""
with open(filename, "r") as f:
# Units are always in the second line
Expand All @@ -26,12 +26,12 @@ def get_units(filename, extension=".csv"):
return units


def read_signal(filename, extension='.csv'):
def read_signal(filename: str, extension: str = ".csv") -> tuple:
""" Read signals and remove Infs
Keyword arguments
filename -- name of raw signal file, including path
extension -- extension of raw files (default '.csv')
:param filename: name of raw signal file, including path
:param extension: extension of raw files (default '.csv')
:rtype: tuple
"""
units = get_units(filename, extension=extension)

Expand Down
1 change: 1 addition & 0 deletions docs/examples.rst
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Read signal
[ 2.00019988e+00, 1.47723100e+01, -7.99658100e-01],
[ 2.00039988e+00, 2.18776700e+01, -1.10487100e+00],
[ 2.00059988e+00, 2.98376300e+01, -1.10487100e+00]])
Deconvolve signal
-------------------

Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ license_files = LICENSE
universal=1

[build_sphinx]
project = 'cavitometer-deconvolve-blebon'
project = 'cavitometer-deconvolve'
version = 0.0.1
source-dir = 'doc'
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
requirements = fh.read()

setup(
name="cavitometer-deconvolve-blebon",
name="cavitometer-deconvolve",
version="0.0.1",
author="Bruno Lebon",
author_email="Bruno.Lebon@brunel.ac.uk",
Expand Down

0 comments on commit 8ab4745

Please sign in to comment.