def istft(stft_signal, size=1024, shift=256,
window=signal.blackman, fading=True, window_length=None):
"""
Calculated the inverse short time Fourier transform to exactly reconstruct
the time signal.
:param stft_signal: Single channel complex STFT signal
with dimensions frames times size/2+1.
:param size: Scalar FFT-size.
:param shift: Scalar FFT-shift. Typically shift is a fraction of size.
:param window: Window function handle.
:param fading: Removes the additional padding, if done during STFT.
:param window_length: Sometimes one desires to use a shorter window than
the fft size. In that case, the window is padded with zeros.
The default is to use the fft-size as a window size.
:return: Single channel complex STFT signal
:return: Single channel time signal.
"""
assert stft_signal.shape[1] == size // 2 + 1
if window_length is None:
window = window(size)
else:
window = window(window_length)
window = np.pad(window, (0, size - window_length), mode='constant')
window = _biorthogonal_window_loopy(window, shift)
# Why? Line created by Hai, Lukas does not know, why it exists.
window *= size
time_signal = scipy.zeros(stft_signal.shape[0] * shift + size - shift)
for j, i in enumerate(range(0, len(time_signal) - size + shift, shift)):
time_signal[i:i + size] += window * np.real(irfft(stft_signal[j]))
# Compensate fade-in and fade-out
if fading:
time_signal = time_signal[
size - shift:len(time_signal) - (size - shift)]
return time_signal
评论列表
文章目录