Module pyspecan.utils.stft

Functions

def psd(samples, nfft=1024, overlap=0.8, Fs=1.0, vbw=None, win='blackman')
Expand source code
def psd(samples, nfft=1024, overlap=0.8, Fs=1.0, vbw=None, win="blackman"):
    win_func = WindowLUT[win]
    overlap = 1-overlap
    n_samp = len(samples)
    n_frames = int(n_samp/(nfft*overlap))
    out = np.zeros((nfft, n_frames))

    # 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]

        _psd = np.fft.fft(segment*win_func(nfft))
        _psd = np.abs(_psd)
        _psd = _psd**2 / (nfft*Fs)
        _psd = 10.0*np.log10(_psd)
        _psd = np.fft.fftshift(_psd)
        if vbw is not None:
            _psd = _vbw(_psd, vbw)
        out[:,i] = _psd
    return out