Source code for hyperion.feats.stft

"""
 Copyright 2018 Johns Hopkins University  (Author: Jesus Villalba)
 Apache 2.0  (http://www.apache.org/licenses/LICENSE-2.0)
"""

import logging

import numpy as np

from ..hyp_defs import float_cpu


[docs]def stft(x, frame_length, frame_shift, fft_length, window=None): if window is None: window = 1 num_frames = int(np.floor((len(x) - frame_length + frame_shift) / frame_shift)) X = np.zeros((num_frames, fft_length), dtype="complex64") j = 0 for i in range(num_frames): X[i, :] = np.fft.fft(x[j : j + frame_length] * window, n=fft_length) j += frame_shift return X
[docs]def istft(X, frame_length, frame_shift, window=None): if window is None: window = np.ones((frame_length,), dtype=float_cpu()) num_samples = (X.shape[0] - 1) * frame_shift + frame_length x_overlap = np.zeros((num_samples,), dtype="complex64") w_overlap = np.zeros((num_samples,), dtype=float_cpu()) xx = np.fft.ifft(X, axis=-1)[:, :frame_length] j = 0 for i in range(X.shape[0]): x_overlap[j : j + frame_length] += xx[i] w_overlap[j : j + frame_length] += window j += frame_shift w_overlap[w_overlap == 0] = 1 iw = 1 / w_overlap # iw[w_overlap==0] = 0 x = x_overlap * iw return x
[docs]def strft(x, frame_length, frame_shift, fft_length, window=None): if window is None: window = 1 num_frames = int(np.floor((len(x) - frame_length + frame_shift) / frame_shift)) X = np.zeros((num_frames, int(fft_length / 2 + 1)), dtype="complex64") j = 0 for i in range(num_frames): X[i, :] = np.fft.rfft(x[j : j + frame_length] * window, n=fft_length) j += frame_shift return X
[docs]def istrft(X, frame_length, frame_shift, window=None): if window is None: window = np.ones((frame_length,), dtype=float_cpu()) num_samples = (X.shape[0] - 1) * frame_shift + frame_length x_overlap = np.zeros((num_samples,), dtype=float_cpu()) w_overlap = np.zeros((num_samples,), dtype=float_cpu()) xx = np.fft.irfft(X, axis=-1)[:, :frame_length] j = 0 for i in range(X.shape[0]): x_overlap[j : j + frame_length] += xx[i] w_overlap[j : j + frame_length] += window j += frame_shift w_overlap[w_overlap == 0] = 1 iw = 1 / w_overlap # iw[w_overlap==0] = 0 x = x_overlap * iw return x
[docs]def st_logE(x, frame_length, frame_shift): """Computes log-energy before preemphasis filter Args: x: wave signal Returns: Log-energy """ num_frames = int(np.floor((len(x) - frame_length + frame_shift) / frame_shift)) x2 = x ** 2 e = np.zeros((num_frames,), dtype=float_cpu()) j = 0 for i in range(num_frames): e[i] = np.sum(x2[j : j + frame_length]) j += frame_shift return np.log(e + 1e-15)