A Python implementation of a multitaper window method for estimating Wigner spectra for certain locally stationary processes
This module is a Python implementation of the multitaper window method described in  for estimating Wigner spectra for certain locally stationary processes.
Abstract from :
This paper investigates the time-discrete multitapers that give a mean square error optimal Wigner spectrum estimate for a class of locally stationary processes (LSPs). The accuracy in the estimation of the time-variable Wigner spectrum of the LSP is evaluated and compared with other frequently used methods. The optimal multitapers are also approximated by Hermite functions, which is computationally more efficient, and the errors introduced by this approximation are studied. Additionally, the number of windows included in a multitaper spectrum estimate is often crucial and an investigation of the error caused by limiting this number is made. Finally, the same optimal set of weights can be stored and utilized for different window lengths. As a result, the optimal multitapers are shown to be well approximated by Hermite functions, and a limited number of windows can be used for a mean square error optimal spectrogram estimate.
Install via pip:
pip install lspopt
Tests are run at every commit to GitHub and the results of this, as well as test coverage, can be studied at Azure Pipelines.
To generate the taper windows only, use the
from lspopt import lspopt H, w = lspopt(N=256, c_parameter=20.0)
There is also a convenience method for using the SciPy spectrogram method
lspopt multitaper windows:
from lspopt import spectrogram_lspopt f, t, Sxx = spectrogram_lspopt(x, fs, c_parameter=20.0)
This can then be plotted with e.g. matplotlib.
One can generate a chirp process realisation and run spectrogram methods on this.
import numpy as np from scipy.signal import chirp, spectrogram import matplotlib.pyplot as plt from lspopt.lsp import spectrogram_lspopt fs = 10e3 N = 1e5 amp = 2 * np.sqrt(2) noise_power = 0.001 * fs / 2 time = np.arange(N) / fs freq = np.linspace(1e3, 2e3, N) x = amp * chirp(time, 1e3, 2.0, 6e3, method='quadratic') + \ np.random.normal(scale=np.sqrt(noise_power), size=time.shape) f, t, Sxx = spectrogram(x, fs) ax = plt.subplot(211) ax.pcolormesh(t, f, Sxx) ax.set_ylabel('Frequency [Hz]') ax.set_xlabel('Time [sec]') f, t, Sxx = spectrogram_lspopt(x, fs, c_parameter=20.0) ax = plt.subplot(212) ax.pcolormesh(t, f, Sxx) ax.set_ylabel('Frequency [Hz]') ax.set_xlabel('Time [sec]') plt.show()
Top: Using SciPy's spectrogram method. Bottom: Using LSPOpt's spectrogram solution.
 Hansson-Sandsten, M. (2011). Optimal multitaper Wigner spectrum estimation of a class of locally stationary processes using Hermite functions. EURASIP Journal on Advances in Signal Processing, 2011, 10.
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
|Filename, size||File type||Python version||Upload date||Hashes|
|Filename, size lspopt-1.1.0-py2.py3-none-any.whl (34.8 kB)||File type Wheel||Python version py2.py3||Upload date||Hashes View hashes|
|Filename, size lspopt-1.1.0.tar.gz (8.1 kB)||File type Source||Python version None||Upload date||Hashes View hashes|
Hashes for lspopt-1.1.0-py2.py3-none-any.whl