为何librosa.stft输出第二维不等于输入采样长度除以hop_length?
librosa.stft输出维度长度问题解答
你观察到的输出第二维长度等于ceil(输入采样长度/hop_length),是你当前输入长度非hop_length整数倍时的巧合,本质是librosa.stft的滑动窗口计数规则和center参数的补零逻辑共同作用的结果,具体原理如下:
1. 滑动窗口帧数基础计算规则
所有短时傅里叶变换的帧数计算都遵循滑动窗口的通用计数逻辑:
帧数 = (参与计算的总样本数 - 窗口长度) // 步长 + 1
你的参数中,STFT窗口长度n_fft=2048,帧移步长hop_length=512。
2. center=True的补零逻辑
当center=True(librosa默认配置)时,为了让第一帧窗口中心对齐原始音频第一个采样点、最后一帧窗口中心对齐原始音频最后一个采样点,避免边缘信号被截断,librosa会先对输入音频首尾各补n_fft//2个零。n_fft为偶数时,首尾补零总长度为n_fft//2 * 2 = n_fft,因此补零后参与计算的总样本数为:
补零后总长度 = 原始样本长度 + n_fft
3. 代入你的参数验证
将补零逻辑代入帧数公式:
帧数 = ( (原始长度 + n_fft) - n_fft ) // hop_length + 1 = 原始长度 // hop_length + 1
代入你提供的原始样本长度10848704计算:
10848704 // 512 + 1 = 21188 + 1 = 21189
和你拿到的输出第二维长度完全一致。
你观察到的结果等于ceil(原始长度/hop_length),是因为你当前的原始长度除以hop_length余448,非整数整除场景下x//y + 1的结果刚好和ceil(x/y)一致;如果原始长度刚好是hop_length的整数倍,输出帧数会比ceil(原始长度/hop_length)多1。
内容的提问来源于stack exchange,提问作者Martin Tin
相关产品推荐
相关产品推荐

