Skip to content

Commit

Permalink
Merge pull request #110 from jaidevd/jd-minor-fixes
Browse files Browse the repository at this point in the history
Minor cleanup
  • Loading branch information
jaidevd committed Feb 26, 2016
2 parents 35a45b0 + 1aa1aa9 commit 245c70f
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 53 deletions.
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))

0 comments on commit 245c70f

Please sign in to comment.