 the input signal was extended at its
    boundaries by supplying a non-`None` ``boundary`` argument to
    `stft`. Defaults to `True`.
time_axis : int, optional
    Where the time segments of the STFT is located; the default is
    the last axis (i.e. ``axis=-1``).
freq_axis : int, optional
    Where the frequency axis of the STFT is located; the default is
    the penultimate axis (i.e. ``axis=-2``).
scaling: {'spectrum', 'psd'}
    The default 'spectrum' scaling allows each frequency line of `Zxx` to
    be interpreted as a magnitude spectrum. The 'psd' option scales each
    line to a power spectral density - it allows to calculate the signal's
    energy by numerically integrating over ``abs(Zxx)**2``.

Returns
-------
t : ndarray
    Array of output data times.
x : ndarray
    iSTFT of `Zxx`.

See Also
--------
stft: Short Time Fourier Transform
ShortTimeFFT: Newer STFT/ISTFT implementation providing more features.
check_COLA: Check whether the Constant OverLap Add (COLA) constraint
            is met
check_NOLA: Check whether the Nonzero Overlap Add (NOLA) constraint is met

Notes
-----
In order to enable inversion of an STFT via the inverse STFT with
`istft`, the signal windowing must obey the constraint of "nonzero
overlap add" (NOLA):

.. math:: \sum_{t}w^{2}[n-tH] \ne 0

This ensures that the normalization factors that appear in the denominator
of the overlap-add reconstruction equation

.. math:: x[n]=\frac{\sum_{t}x_{t}[n]w[n-tH]}{\sum_{t}w^{2}[n-tH]}

are not zero. The NOLA constraint can be checked with the `check_NOLA`
function.

An STFT which has been modified (via masking or otherwise) is not
guaranteed to correspond to a exactly realizible signal. This
function implements the iSTFT via the least-squares estimation
algorithm detailed in [2]_, which produces a signal that minimizes
the mean squared error between the STFT of the returned signal and
the modified STFT.


.. versionadded:: 0.19.0

References
----------
.. [1] Oppenheim, Alan V., Ronald W. Schafer, John R. Buck
       "Discrete-Time Signal Processing", Prentice Hall, 1999.
.. [2] Daniel W. Griffin, Jae S. Lim "Signal Estimation from
       Modified Short-Time Fourier Transform", IEEE 1984,
       10.1109/TASSP.1984.1164317

Examples
--------
>>> import numpy as np
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()

Generate a test signal, a 2 Vrms sine wave at 50Hz corrupted by
0.001 V**2/Hz of white noise sampled at 1024 Hz.

>>> fs = 1024
>>> N = 10*fs
>>> nperseg = 512
>>> amp = 2 * np.sqrt(2)
>>> noise_power = 0.001 * fs / 2
>>> time = np.arange(N) / float(fs)
>>> carrier = amp * np.sin(2*np.pi*50*time)
>>> noise = rng.normal(scale=np.sqrt(noise_power),
...                    size=time.shape)
>>> x = carrier + noise

Compute the STFT, and plot its magnitude

>>> f, t, Zxx = signal.stft(x, fs=fs, nperseg=nperseg)
>>> plt.figure()
>>> plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=amp, shading='gouraud')
>>> plt.ylim([f[1], f[-1]])
>>> plt.title('STFT Magnitude')
>>> plt.ylabel('Frequency [Hz]')
>>> plt.xlabel('Time [sec]')
>>> plt.yscale('log')
>>> plt.show()

Zero the components that are 10% or less of the carrier magnitude,
then convert back to a time series via inverse STFT

>>> Zxx = np.where(np.abs(Zxx) >= amp/10, Zxx, 0)
>>> _, xrec = signal.istft(Zxx, fs)

Compare the cleaned signal with the original and true carrier signals.

>>> plt.figure()
>>> plt.plot(time, x, time, xrec, time, carrier)
>>> plt.xlim([2, 2.1])
>>> plt.xlabel('Time [sec]')
>>> plt.ylabel('Signal')
>>> plt.legend(['Carrier + Noise', 'Filtered via STFT', 'True Carrier'])
>>> plt.show()

Note that the cleaned signal does not start as abruptly as the original,
since some of the coefficients of the transient were also removed:

>>> plt.figure()
>>> plt.plot(time, x, time, xrec, time, carrier)
>>> plt.xlim([0, 0.1])
>>> plt.xlabel('Time [sec]')
>>> plt.ylabel('Signal')
>>> plt.legend(['Carrier + Noise', 'Filtered via STFT', 'True Carrier'])
>>> plt.show()

y