def test_wignerVille(self): """ Test for wigner_ville_spectrum. Test uses only a fraction of the whole spectrum due to space consumtions. """ datafile = os.path.join(os.path.dirname(__file__), 'data', 'wv.npz') rec = np.load(datafile) wv = abs(wigner_ville_spectrum(signal_bursts(), 10, 3.5, smoothing_filter='gauss', verbose=False)) # No NaNs are supposed to be in the output. self.assertEqual(np.isnan(wv).any(), False) rms1 = rms(rec['wv_250_500_25'], wv[250:500:25]) rms2 = rms(rec['wv_750_1000_25'], wv[750:1000:25]) self.assertEqual(True, rms1 < 1e-6) self.assertEqual(True, rms2 < 1e-6)
def test_wignerVille(self): """ Test for wigner_ville_spectrum. Test uses only a fraction of the whole spectrum due to space consumtions. """ datafile = os.path.join(os.path.dirname(__file__), 'data', 'wv.npz') rec = np.load(datafile) wv = abs( wigner_ville_spectrum(signal_bursts(), 10, 3.5, smoothing_filter='gauss', verbose=False)) # No NaNs are supposed to be in the output. self.assertEqual(np.isnan(wv).any(), False) rms1 = rms(rec['wv_250_500_25'], wv[250:500:25]) rms2 = rms(rec['wv_750_1000_25'], wv[750:1000:25]) self.assertEqual(True, rms1 < 1e-6) self.assertEqual(True, rms2 < 1e-6)
def mtspec_wigner_ville(data,fs,filename): from mtspec import mtspec, wigner_ville_spectrum fig = plt.figure() t = np.arange(len(data)) / fs ax1 = fig.add_axes([0.2,0.75, 0.79, 0.23]) ax1.plot(t,data, color="0.3") #ax1.set_xlim(0, len(data)) ax2 = fig.add_axes([0.06,0.02,0.13,0.69]) spec, freq = mtspec(data, 10, 3.5) print "freq is ", freq ax2.plot(spec, freq, color="0.3") ax2.set_xlim(0, spec.max()) ax2.set_ylim(freq[0], freq[-1]) ax2.set_xticks([]) wv = wigner_ville_spectrum(data, 10, 3.5, smoothing_filter='gauss') ax3 = fig.add_axes([0.2, 0.02, 0.79, 0.69]) ax3.set_yticks([]) ax1.set_xticks([]) ax3.imshow(np.sqrt(abs(wv)), interpolation='lanczos', aspect='auto') plt.savefig(filename+'.pdf')
def wv_spect(values, times, fig=None, figsize=(8,10), trace_ylab=None, ylab='Frequency (kHz)', sampling_rate=5e6, max_freq=None, min_freq=.0, dbscale=False, vmin=.0, vmax=1., taper=False, number_of_plots=2, **kwargs): ''' Function to plot a multi-taper Wigner-Ville spectrogram of time series data. Arguments: --values: A 1-D array containing --times: An array of times against which the values are plotted --fig: The figure to plot the wiglle plot on --figsize: The figure size of the plot --trace_ylab: The y-axis label for the time series data --ylab: The y label for the plot --sampling_rate: The sampling rate of the time series data --max_freq: The maximum frequency to calculate the spectrogram for. --min_freq: The minimum frequency to calculate the spectrogram for. --dbscale: Either False (linear colour map), 'min' (decibel scale using the minimum value as a reference), or 'median' (decibel scale using the median power as the reference) --vmin: The minimum of the colour map dynamic range (fraction between 0 and 1) --vmax: The maximum of the colour map dynamic range (fraction between 0 and 1) --taper: The length of seconds at the start of the trace to taper with a Hanning window. --number_of_plots: The number of plots to be contained on the figure. Usually 2. --**kwargs: Keyqord arguments for figure formatting/saving (see format_fig) Returns: --None (by default) --WV spectrum (if wv_only=True)search_win=[10.0,15.5] ''' if taper: mute_ind = np.where(times <= taper)[0][-1] window = np.hanning(mute_ind*2)[:mute_ind] values[:mute_ind] = np.multiply(values[:mute_ind],window) if not max_freq: max_freq = sampling_rate / 2. wv = wigner_ville_spectrum(values, 1/sampling_rate, 5.5, smoothing_filter='gauss') frequency_divider = sampling_rate / 2. / max_freq if frequency_divider > 1.1: wv = wv[-int((wv.shape[0]-1.0)//frequency_divider):,:] if min_freq: wv = wv[:-int(min_freq*(wv.shape[0]-1.0)//max_freq),:] if dbscale == 'median': wv = 10 * np.log10(np.abs(wv)/np.median(np.abs(wv))) elif dbscale == 'min': wv = 10 * np.log10(np.abs(wv)/np.amin(np.abs(wv))) else: wv = np.where(wv > 0., wv, 0.) #OR: np.sqrt(np.abs(wv)) if not fig: fig = plt.figure(figsize=figsize) if number_of_plots > 2: gs = gridspec.GridSpec(number_of_plots, 2, height_ratios=[2,3]+[2]*(number_of_plots-2), width_ratios=[30,1]) else: gs = gridspec.GridSpec(2, 2, height_ratios=[2,3], width_ratios=[30,1]) ax1 = fig.add_subplot(gs[0]) ax2 = fig.add_subplot(gs[2], sharex=ax1) if number_of_plots > 2: [fig.add_subplot(gs[i], sharex=ax1) for i in range(4, number_of_plots*2-1,2)] ax1.plot(times, values, 'k') #Plot the waveform ax1.xaxis.set_tick_params(direction='in') extent = (times[0], times[-1], min_freq/1e3, max_freq/1e3) im = ax2.imshow(wv, interpolation='nearest', aspect='auto', extent=extent, cmap="nipy_spectral", vmin=vmin)#, vmax=vmax) cbar_axes = fig.add_subplot(gs[3]) units_list = ['','(dB)'] cb = plt.colorbar(im, cax = cbar_axes) cbar_axes.set_ylabel('Power {}'.format(units_list[dbscale!=False]),fontsize=16.0) cbar_axes.yaxis.set_label_position('right') cbar_axes.tick_params(labelsize=12.0) cb.formatter.set_powerlimits((-3,3)), cb.update_ticks() xlab = 'Time ($\mu$s)' if number_of_plots < 3 else '' format_kwargs = {key:val for key ,val in kwargs.items() if key not in ['show','save_dir']} fig, ax1 = format_fig(fig, ax1, ylab=trace_ylab, show=False, save_dir=False, xlim=(times[0], times[-1]), **format_kwargs) kwargs.update({'title':None}) fig, ax2 = format_fig(fig, ax2, xlab=xlab, ylab=ylab, xlim=(times[0], times[-1]), **kwargs) return fig, wv
from mtspec import mtspec, wigner_ville_spectrum from mtspec.util import signal_bursts fig = plt.figure() data = signal_bursts() # Plot the data ax1 = fig.add_axes([0.2,0.75, 0.79, 0.24]) ax1.plot(data, color="k") ax1.set_xlim(0, len(data)) # Plot multitaper spectrum ax2 = fig.add_axes([0.06,0.02,0.13,0.69]) spec, freq = mtspec(data, 10, 3.5) ax2.plot(spec, freq, color="k") ax2.set_xlim(0, spec.max()) ax2.set_ylim(freq[0], freq[-1]) ax2.set_xticks([]) # Create the wigner ville spectrum wv = wigner_ville_spectrum(data, 10, 3.5, smoothing_filter='gauss') # Plot the WV ax3 = fig.add_axes([0.2, 0.02, 0.79, 0.69]) ax3.set_yticks([]) ax3.set_xticks([]) ax3.imshow(abs(wv), interpolation='nearest', aspect='auto', cmap="magma") plt.show()
import matplotlib.pylab as plt from mtspec import wigner_ville_spectrum from mtspec.util import linear_chirp, exponential_chirp import numpy as np fig = plt.figure() data = linear_chirp() + exponential_chirp() # Plot the data ax1 = fig.add_axes([0.05,0.75, 0.90, 0.24]) ax1.plot(data) ax1.set_xlim(0, len(data)) ax1.set_yticks([]) # Get the smoothed WV spectrum. wv = wigner_ville_spectrum(data, 10, 5.0, smoothing_filter='gauss', filter_width=25) # Plot the WV ax2 = fig.add_axes([0.01, 0.025, 0.48, 0.64]) ax2.set_yticks([]) ax2.set_xticks([]) ax2.imshow(abs(wv), interpolation='nearest', aspect='auto') ax2.set_title('With smoothing') # Get the WV spectrum. wv = wigner_ville_spectrum(data, 10, 5.0, smoothing_filter=None) # Plot the WV ax3 = fig.add_axes([0.51, 0.025, 0.48, 0.64]) ax3.set_yticks([]) ax3.set_xticks([])
def spectrum(self, signal): return np.log(abs(wigner_ville_spectrum(signal, delta=self.sampling_freq, time_bandwidth=self.time_bandwidth, smoothing_filter=self.smoothing_filter))) + 1
from mtspec.util import linear_chirp, exponential_chirp import numpy as np fig = plt.figure() data = linear_chirp() + exponential_chirp() # Plot the data ax1 = fig.add_axes([0.05, 0.75, 0.90, 0.24]) ax1.plot(data) ax1.set_xlim(0, len(data)) ax1.set_yticks([]) # Get the smoothed WV spectrum. wv = wigner_ville_spectrum(data, 10, 5.0, smoothing_filter='gauss', filter_width=25) # Plot the WV ax2 = fig.add_axes([0.01, 0.025, 0.48, 0.64]) ax2.set_yticks([]) ax2.set_xticks([]) ax2.imshow(abs(wv), interpolation='nearest', aspect='auto') ax2.set_title('With smoothing') # Get the WV spectrum. wv = wigner_ville_spectrum(data, 10, 5.0, smoothing_filter=None) # Plot the WV ax3 = fig.add_axes([0.51, 0.025, 0.48, 0.64])
s9, f, jackknife, _, _ = mtspec(data=st9, delta=0.02, time_bandwidth=3.5, number_of_tapers=5, statistics=True) s10, f, jackknife, _, _ = mtspec(data=st10, delta=0.02, time_bandwidth=3.5, number_of_tapers=5, statistics=True) #Spectrograms #smoothing_filter='gauss',filter_width=10 wv1 = wigner_ville_spectrum(st1, delta=0.02, time_bandwidth=3.5, smoothing_filter='gauss', filter_width=50) wv10 = wigner_ville_spectrum(st10, delta=0.02, time_bandwidth=3.5, smoothing_filter='gauss', filter_width=50) wv1 = abs(wv1) wv10 = abs(wv10) twv = arange(0, len(st1) * 0.02 - 0.01, 0.02) - 500 * 0.02 T, F = meshgrid(twv, f[::-1]) # Plot the source time functions # Using contourf to provide my colorbar info, then clearing the figure Z = [[0, 0], [0, 0]]
from mtspec import mtspec, wigner_ville_spectrum from mtspec.util import signal_bursts fig = plt.figure() data = signal_bursts() # Plot the data ax1 = fig.add_axes([0.2, 0.75, 0.79, 0.24]) ax1.plot(data, color="k") ax1.set_xlim(0, len(data)) # Plot multitaper spectrum ax2 = fig.add_axes([0.06, 0.02, 0.13, 0.69]) spec, freq = mtspec(data, 10, 3.5) ax2.plot(spec, freq, color="k") ax2.set_xlim(0, spec.max()) ax2.set_ylim(freq[0], freq[-1]) ax2.set_xticks([]) # Create the wigner ville spectrum wv = wigner_ville_spectrum(data, 10, 3.5, smoothing_filter="gauss") # Plot the WV ax3 = fig.add_axes([0.2, 0.02, 0.79, 0.69]) ax3.set_yticks([]) ax3.set_xticks([]) ax3.imshow(abs(wv), interpolation="nearest", aspect="auto", cmap="magma") plt.show()