Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Minor cleanup #110

Merged
merged 2 commits into from
Feb 26, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 20 additions & 5 deletions tftb/processing/ambiguity.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@

import numpy as np
from scipy.signal import hilbert
from tftb.utils import init_default_args, nextpow2
from tftb.utils import nextpow2


def wide_band(signal, fmin, fmax, N=None):
def wide_band(signal, fmin=None, fmax=None, N=None):
if 1 in signal.shape:
signal = signal.ravel()
elif signal.ndim != 1:
Expand All @@ -28,12 +28,26 @@ def wide_band(signal, fmin, fmax, N=None):
tmax = nx - 1
T = tmax - tmin

# determine default values for fmin, fmax
if (fmin is None) or (fmax is None):
from matplotlib.mlab import find
STF = np.fft.fftshift(s_ana)
sp = np.abs(STF[:m]) ** 2
maxsp = np.amax(sp)
f = np.linspace(0, 0.5, m + 1)
f = f[:m]
indmin = find(sp > maxsp / 100.0).min()
indmax = find(sp > maxsp / 100.0).max()
if fmin is None:
fmin = max([0.01, 0.05 * np.fix(f[indmin] / 0.05)])
if fmax is None:
fmax = 0.05 * np.ceil(f[indmax] / 0.05)
B = fmax - fmin
R = B / ((fmin + fmax) / 2.0)
nq = np.ceil((B * T * (1 + 2.0 / R) * np.log((1 + R / 2.0) / (1 - R / 2.0))) / 2.0)
nmin = nq - (nq % 2)
if N is None:
N = 2 ** (nextpow2(nmin))
N = int(2 ** (nextpow2(nmin)))

# geometric sampling for the analyzed spectrum
k = np.arange(1, N + 1)
Expand Down Expand Up @@ -101,7 +115,8 @@ def narrow_band(signal, lag=None, n_fbins=None):
lag = np.arange(tau_start, tau_end)
taucol = lag.shape[0]

n_fbins = init_default_args(signal, n_fbins=n_fbins)[0]
if n_fbins is None:
n_fbins = signal.shape[0]

naf = np.zeros((n_fbins, taucol), dtype=complex)
for icol in range(taucol):
Expand All @@ -122,7 +137,7 @@ def narrow_band(signal, lag=None, n_fbins=None):
if __name__ == '__main__':
from tftb.generators.misc import altes
sig = altes(128, 0.1, 0.45)
waf, tau, theta = wide_band(sig, 0.1, 0.35, 64)
waf, tau, theta = wide_band(sig)
from matplotlib.pyplot import contour, show
contour(tau, theta, np.abs(waf) ** 2)
show()
7 changes: 4 additions & 3 deletions tftb/processing/cohen.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
"""

import numpy as np
from tftb.utils import init_default_args
from tftb.processing.linear import ShortTimeFourierTransform
from tftb.processing.base import BaseTFRepresentation

Expand Down Expand Up @@ -208,8 +207,10 @@ def smoothed_pseudo_wigner_ville(signal, timestamps=None, freq_bins=None,
:return: Smoothed pseudo Wigner Ville distribution
:rtype: array-like
"""
timestamps, freq_bins = init_default_args(signal, timestamps=timestamps,
n_fbins=freq_bins)
if timestamps is None:
timestamps = np.arange(signal.shape[0])
if freq_bins is None:
freq_bins = signal.shape[0]

if fwindow is None:
winlength = np.floor(freq_bins / 4.0)
Expand Down
7 changes: 4 additions & 3 deletions tftb/processing/postprocessing.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
"""

import numpy as np
from tftb.utils import init_default_args
from tftb.processing.utils import integrate_2d


Expand Down Expand Up @@ -114,8 +113,10 @@ def ideal_tfr(iflaws, timestamps=None, n_fbins=None):
:rtype:
"""
ifrow, ifcol = iflaws.shape
timestamps, n_fbins = init_default_args(iflaws[0, :],
timestamps=timestamps, n_fbins=n_fbins)
if timestamps is None:
timestamps = np.arange(iflaws[0, :].shape[0])
if n_fbins is None:
n_fbins = iflaws[0, :].shape[0]

tcol = timestamps.shape[0]

Expand Down
34 changes: 22 additions & 12 deletions tftb/processing/reassigned.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import numpy as np
import scipy.signal as ssig
from tftb.processing.utils import derive_window
from tftb.utils import init_default_args


def pseudo_wigner_ville(signal, timestamps=None, n_fbins=None, fwindow=None):
Expand All @@ -29,8 +28,10 @@ def pseudo_wigner_ville(signal, timestamps=None, n_fbins=None, fwindow=None):
:rtype:
"""
xrow = signal.shape[0]
timestamps, n_fbins = init_default_args(signal, timestamps=timestamps,
n_fbins=n_fbins)
if timestamps is None:
timestamps = np.arange(signal.shape[0])
if n_fbins is None:
n_fbins = signal.shape[0]
tcol = timestamps.shape[0]

if fwindow is None:
Expand Down Expand Up @@ -107,8 +108,10 @@ def pseudo_margenau_hill(signal, timestamps=None, n_fbins=None, fwindow=None):
:rtype:
"""
xrow = signal.shape[0]
timestamps, n_fbins = init_default_args(signal, timestamps=timestamps,
n_fbins=n_fbins)
if timestamps is None:
timestamps = np.arange(signal.shape[0])
if n_fbins is None:
n_fbins = signal.shape[0]
tcol = timestamps.shape[0]

if fwindow is None:
Expand Down Expand Up @@ -179,8 +182,10 @@ def pseudo_page(signal, timestamps=None, n_fbins=None, fwindow=None):
:return:
:rtype:
"""
timestamps, n_fbins = init_default_args(signal, timestamps=timestamps,
n_fbins=n_fbins)
if timestamps is None:
timestamps = np.arange(signal.shape[0])
if n_fbins is None:
n_fbins = signal.shape[0]
tcol = timestamps.shape[0]

if fwindow is None:
Expand Down Expand Up @@ -252,8 +257,10 @@ def morlet_scalogram(signal, timestamps=None, n_fbins=None, tbp=0.25):
:rtype:
"""
xrow = signal.shape[0]
timestamps, n_fbins = init_default_args(signal, timestamps=timestamps,
n_fbins=n_fbins)
if timestamps is None:
timestamps = np.arange(signal.shape[0])
if n_fbins is None:
n_fbins = signal.shape[0]
k = 0.001
tcol = timestamps.shape[0]
deltat = timestamps[1:] - timestamps[:-1]
Expand Down Expand Up @@ -371,8 +378,10 @@ def smoothed_pseudo_wigner_ville(signal, timestamps=None, n_fbins=None,
"""
xrow = signal.shape[0]

timestamps, n_fbins = init_default_args(signal, timestamps=timestamps,
n_fbins=n_fbins)
if timestamps is None:
timestamps = np.arange(signal.shape[0])
if n_fbins is None:
n_fbins = signal.shape[0]
if fwindow is None:
hlength = np.floor(n_fbins / 4.0)
hlength += 1 - (hlength % 2)
Expand Down Expand Up @@ -479,7 +488,8 @@ def spectrogram(signal, time_samples=None, n_fbins=None, window=None):
time_samples = np.arange(signal.shape[0])
elif np.unique(np.diff(time_samples)).shape[0] > 1:
raise ValueError('Time instants must be regularly sampled.')
n_fbins = init_default_args(signal, n_fbins=n_fbins)[0]
if n_fbins is None:
n_fbins = signal.shape[0]
if window is None:
wlength = int(np.floor(signal.shape[0] / 4.0))
wlength += 1 - np.remainder(wlength, 2)
Expand Down
30 changes: 0 additions & 30 deletions tftb/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
"""Miscellaneous utilities."""

import numpy as np
import warnings


TYPE1 = ['pmh', 'rpmh', 'sp', 'rsp', 'ppage', 'rppag', 'mhs', 'rgab', 'mh',
Expand Down Expand Up @@ -38,31 +37,6 @@ def is_linear(x, decimals=5):
return np.unique(derivative).shape[0] == 1


def init_default_args(signal, **kwargs):
"""Initialize default arguments for common time frequency representations.

:param x: signal, based on which default arguments are initialized.
:type x: numpy.ndarray
:return: tuple of default values
:rtype: tuple
"""
# FIXME: Remove tftb.utils.init_default_args
# This function was used like __init__, no need for it now since most
# distributions have their own classes.
for varname, value in kwargs.items():
if "time" in varname:
if value is None:
kwargs[varname] = np.arange(signal.shape[0])
elif ("n_fbins" in varname) or ("freq_bins" in varname):
if value is None:
kwargs[varname] = signal.shape[0]
elif 2 ** nextpow2(value) != value:
msg = "For faster computations, n_fbins should be a power of 2."
warnings.warn(msg, UserWarning)

return list(kwargs.values())


def izak(x):
"""Inverse Zak transform."""
if x.ndim == 2:
Expand Down Expand Up @@ -128,7 +102,3 @@ def modulo(x, N):
else:
y = np.mod(np.real(x), N) + 1j * np.mod(np.imag(x), N)
return y


if __name__ == '__main__':
print(init_default_args(np.arange(10), timestamps=list(range(10)), n_fbins=3))