librosa.feature.rms()返回值数量过少的原因及解决方法
问题解答
为什么返回87个RMS值?
librosa计算帧特征时,默认帧移(hop_length)为512,帧长(frame_length)默认是2048。为了完整覆盖整个音频,librosa会自动对音频末尾补零,最终帧数的计算逻辑是取ceil(音频总采样数 / hop_length)。
代入你的数据:44100(总采样数)÷512≈86.13,向上取整后就是87,所以返回87个RMS值。你之前只修改了frame_length,但没调整hop_length——帧移决定了相邻帧的间隔,是影响总帧数的核心参数,所以帧数不会变化。
如何获取更多RMS值?
要增加RMS的数量,关键是减小hop_length,缩小帧与帧之间的间隔,这样就能得到更多的帧,对应更多的RMS值:
示例1:获取高密度RMS值
如果想要每1个采样点滑动一次窗口(得到接近采样数的RMS值),可以设置hop_length=1,同时按需调整帧长:
rms = librosa.feature.rms(y=audiodata, frame_length=64, hop_length=1)
示例2:按时间间隔生成RMS
比如要每10ms生成一个RMS值,44100Hz采样率下10ms对应441个采样点,设置hop_length=441即可:
rms = librosa.feature.rms(y=audiodata, hop_length=441)
手动计算(更灵活)
也可以用librosa.util.frame手动分割音频帧,自行计算RMS:
import numpy as np # 按指定帧长和帧移分割音频 frames = librosa.util.frame(audiodata, frame_length=1024, hop_length=256) # 计算每帧的RMS rms_manual = np.sqrt(np.mean(frames**2, axis=0)) print("手动计算的RMS数量:", len(rms_manual))
内容的提问来源于stack exchange,提问作者Alice Mabille
相关产品推荐
相关产品推荐

