Module rpps.utils.stft
Functions
def psd(samples, Fs=1, vbw_hz=None)-
Expand source code
def psd(samples, Fs=1, vbw_hz=None): out = np.zeros_like(samples, dtype=np.float32) for i in range(samples.shape[1]): y = np.abs(samples[:,i])**2 / (len(samples)*Fs) y = np.fft.fftshift(10.0*np.log10(y)) if vbw_hz is not None: smooth = _psd.vbw_calc(samples.shape[0], Fs, vbw_hz) y = _psd.vbw(y, smooth) out[:,i] = y return out def stft(samples, nfft=1024, overlap=0.8, win='hamming')-
Expand source code
def stft(samples, nfft=1024, overlap=0.8, win="hamming"): win_func = Window.get(win) overlap = 1-overlap n_samp = len(samples) n_frames = int(n_samp/(nfft*overlap)) out = np.zeros((nfft, n_frames), dtype=samples.dtype) # print(f"stft for {n_samp} samples / {out.shape[1]}*{nfft} FFT @ overlap {overlap}") for i in range(n_frames): s_idx = int(i*(nfft*overlap)) e_idx = s_idx + nfft # print(f"snip {i} = [{s_idx}:{e_idx}]") if e_idx > n_samp: segment = np.zeros(nfft, dtype=samples.dtype) f_idx = n_samp-s_idx segment[:f_idx] = samples[s_idx:] # segment[f_idx:] = samples[-f_idx:] else: segment = samples[s_idx:e_idx] out[:,i] = np.fft.fft(segment*win_func(nfft)) return out