STFT 生成的重叠帧数

Number of overlapping frames generated by STFT

我正在使用 scipy.signal.stft 获取音频的 stft。没有问题,我得到了结果。但是我不明白的是,当使用采样率为fs=44100 Hz169600 samples音频计算stft时,我得到3returns作为f, tZxx。这里 Zxx 的形状是 (2049, 84)

为了计算 stft,我使用大小 4096 的 window,作为 window 类型,使用 hanning window。默认情况下,scipy.signal.stft 在帧之间使用 window_size // 2 重叠。

我的问题:是否有 2049 重叠的帧?如果有或没有,如何计算 stft 中重叠帧的数量?如果 2049 不是重叠样本的数量,那这个数字是什么意思?

实值信号的 FFT 产生具有 Hermitian 对称性的频谱。这意味着可以从下半部分获得光谱的上半部分。另外,当 FFT 大小 N 为偶数时,中点是其自身的对称性。因此,频谱完全由 N//2 + 1 个频率点(即 scipy.signal.stft 返回的频谱大小)决定。在您的情况下 N4096,因此您会得到沿频率轴的 4096//2 + 12049 点的频谱。您应该能够确认 f 确实是 2049 频率值的数组(从 0 到 44100/2 Hz,以 44100/4096 或 ~10.77Hz 为增量)。

就时间值的数量而言,您可以将其计算为

number_of_samples = 169600
number_time_values = (number_of_samples+window_size)//(window_size - window_size//2) 
%  = (169600 + 4096)//(4096 - 2048) 
%  = 84

分子中的 +window_size(在您的情况下为 +4096)项是由于 boundary = 'zeros' 默认选项在实际 169,600 个输入样本前后用零填充输入.