[Python] Scipy fft on winsize-long data array computes 2 windows

Discussão em 'Python' iniciado por Stack, Dezembro 20, 2024.

  1. Stack

    Stack Membro Participativo

    I'm trying to write an algorithm for lazily plotting spectrograms on long, high-sampled audio files. I want to break my audio array into chunks of size equal to the width of my fft sliding window for computing [nfft//2+1:1] sub-spectrogram arrays.

    However, scipy still wants to create 2 windows, one ranging from [-nfft/2 : nfft/2] and one from [nfft/2 : 1.5 * nfft/2].

    I understand from the doc that the first window is centered on the first sample. Does anyone know if I can force the first window to be aligned with the first sample? Or should I just create a new ShortTimeFFT with hop=nfft/2 and only consider the middle window of the 3 processed windows?

    Here is a minimal reproducible example:

    from scipy.signal import ShortTimeFFT
    from scipy.signal.windows import hamming
    import numpy as np

    sig = np.random.randn(1024)
    fs = 48_000
    nfft = 1024
    winsize = 1024
    window = hamming(M = nfft)
    fft = ShortTimeFFT(win = window, hop = nfft, fs = fs, mfft = nfft)

    print(f"{fft.p_num(sig.shape[0])} windows from samples {fft.k_min=} to sample {fft.k_max(sig.shape[0])=}")

    # 2 windows from samples fft.k_min=-512 to sample fft.k_max(sig.shape[0])=1536

    Continue reading...

Compartilhe esta Página