def __init__(self, signal_frames, window=scipy.hanning, positive_only=True):
"""
:param signal_frames: signal represented as SignalFrames instance
:param window: STFT window function - produces 1D window which will
be normalized
"""
self.signal_frames = signal_frames
x_frames = signal_frames.frames
w = normalized_window(window(signal_frames.frame_size))
# complex spectra of windowed blocks of signal - STFT
self.X_complex = np.fft.fft(x_frames * w)
# linear magnitude spectrogram
self.X_mag = abs(self.X_complex) / self.X_complex.shape[1]
# spectra of signal shifted in time
# This fakes looking at the previous frame shifted by one sample.
# In order to work only with one frame of size N and not N + 1, we fill the
# missing value with zero. This should not introduce a large error, since the
# borders of the amplitude frame will go to zero anyway due to applying a
# window function in the STFT tranform.
X_prev_time = np.fft.fft(shift_right(x_frames) * w)
# spectra shifted in frequency
X_prev_freq = shift_right(self.X_complex)
# cross-spectra - ie. spectra of cross-correlation between the
# respective time-domain signals
X_cross_time = cross_spectrum(self.X_complex, X_prev_time)
X_cross_freq = cross_spectrum(self.X_complex, X_prev_freq)
# instantaneous frequency estimates
# normalized frequencies in range [0.0, 1.0] - from DC to sample rate
self.X_inst_freqs = estimate_instant_freqs(X_cross_time)
# instantaneous group delay estimates
# relative coordinates within the frame with range [-0.5, 0.5] where
# 0.0 is the frame center
self.X_group_delays = estimate_group_delays(X_cross_freq)
if positive_only:
self.X_mag = positive_freq_magnitudes(self.X_mag)
self.X_complex, self.X_inst_freqs, self.X_group_delays = [
select_positive_freq_fft(values) for values in
[self.X_complex, self.X_inst_freqs, self.X_group_delays]
]
评论列表
文章目录