Source code for pyrfu.pyrf.wave_fft
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 3rd party imports
import numpy as np
from scipy import signal
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"
[docs]def wave_fft(
inp,
window,
frame_overlap: float = 10.0,
frame_length: float = 20.0,
f_sampling: float = None,
):
r"""Short-Time Fourier Transform.
Parameters
----------
inp : xarray.DataArray
Time series of the one dimension data.
window : str
Window function such as rectwin, hamming (default).
frame_overlap : float, Optional
Length of each frame overlaps in second.
frame_length : float, Optional
Length of each frame in second.
f_sampling : float, Optional
Sampling frequency.
Returns
-------
spectrogram : ndarray
Spectrogram of x.
time : ndarray
Value corresponds to the center of each frame (x-axis) in sec.
frequencies : ndarray
Vector of frequencies (y-axis) in Hz.
"""
if f_sampling is None:
delta_t = np.median(np.diff(inp.time.data).astype(np.float64)) * 1e-9
f_sampling = 1 / delta_t
# convert ms to points
n_per_seg = np.round(frame_length * f_sampling).astype(np.int64)
n_overlap = np.round(frame_overlap * f_sampling).astype(np.int64)
options = {
"fs": f_sampling,
"window": window,
"nperseg": n_per_seg,
"noverlap": n_overlap,
"mode": "complex",
}
frequencies, time, spectrogram = signal.spectrogram(inp, **options)
return frequencies, time, spectrogram