Skip to main content

A Python implementation of a multitaper window method for estimating Wigner spectra for certain locally stationary processes

Project description

LSPOpt

Build and Test PyPI version Code style: black

This module is a Python implementation of the multitaper window method described in [1] for estimating Wigner spectra for certain locally stationary processes.

Abstract from [1]:

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.

Installation

Install via pip:

pip install lspopt

If you prefer to use conda, see instructions in this repo.

Testing

Test with pytest:

pytest tests/

See test badge at the top of this README for link to test coverage and reports.

Usage

To generate the taper windows only, use the lspopt method:

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 with the 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.

Example

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 = 10000
N = 100000
amp = 2 * np.sqrt(2)
noise_power = 0.001 * fs / 2
time = np.arange(N) / fs
freq = np.linspace(1000, 2000, N)
x = amp * chirp(time, 1000, 2.0, 6000, 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.tight_layout()
plt.show()

Spectrogram plot

Top: Using SciPy's spectrogram method. Bottom: Using LSPOpt's spectrogram solution.

References

[1] 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.

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[1.3.0] - 2023-01-24

Changed

  • Modified test matrix in CI

Removed

  • Support for Python 2.7 and 3.6.
  • Dependency on six.

1.2.0 - 2022-06-08

Added

  • New plot file

Fixed

  • Source distribution was broken on PyPI. Modified MANIFEST.in to correct that (#5 and #6)
  • Url to missing plot file
  • Fixed some incorrect int declarations using 1e3 notation

Removed

  • Removed Pipfile

1.1.1 - 2020-09-28

Added

  • Added CHANGELOG.md

Changed

  • Change CI from Azure Devops to Github Actions

1.1.0 - 2019-06-19

Added

  • First PyPI-released version

[1.0.0] - 2016-08-22

Added

  • Regarded as a feature-complete, stable library.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lspopt-1.3.0.tar.gz (39.3 kB view details)

Uploaded Source

Built Distribution

lspopt-1.3.0-py2.py3-none-any.whl (35.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file lspopt-1.3.0.tar.gz.

File metadata

  • Download URL: lspopt-1.3.0.tar.gz
  • Upload date:
  • Size: 39.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for lspopt-1.3.0.tar.gz
Algorithm Hash digest
SHA256 288748dd48598f74d989551cc87877a4b17f7f923c89c09f39b7e0b30970c735
MD5 55c3586a73a7647148195dee52b1bb3f
BLAKE2b-256 5d1a1d95d1f3e7445eaafa5b61f14ec06ab0252bafcfead3cd1fb6b5c8955fd6

See more details on using hashes here.

File details

Details for the file lspopt-1.3.0-py2.py3-none-any.whl.

File metadata

  • Download URL: lspopt-1.3.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 35.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for lspopt-1.3.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 ab2521afa71d1db4bd5c503443a8edaded6dfb99020c0928272875f97f3b834a
MD5 62a8c4edd2a0fae83865f801fa26845c
BLAKE2b-256 ec62174bf4acf893a3a181ca295ac7e6a1fda3b376c010dd42a69780226fec32

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page