关于常用的stft_spec计算方法与librosa库中的stft函数的区别:

计算stft_spec时,定义的window_length一般是指数据加hanning窗的长度,也会默认为一帧中数据的长度,毕竟数据跟窗长度是要相等的。

我们会先对数据按window_length和hop_length进行分帧,再按照定义的nfft长度进行补零,最后对每帧进行FFT,最后得到stft_spec。

而在librosa库中,定义的window_length仅仅是指hanning窗的长度,当window_length~=nfft时,会对窗进行两侧补零,让窗系数居中(真是醉了)

另外,数据分帧时的帧长度是nfft,在分帧之前,对数据也有几种补零方案,center=True时,默认pad_mode=‘reflect’,这时候会在数据两端按照镜面反射的方式补充nfft/2个数据,当然你也可以选择pad_mode=‘constant’,这时候原数据两端补充nfft/2个0,而center=False时,数据不会被补充(这是恼羞成怒了)。值得注意的是,对数据进行分帧时,如果最后一段数据长度不够一帧,那这段数据就会被丢弃,满满的bug。

所以librosa的期望输入是window_length=nfft,center可以调,frame是bug,pad_mode也反人类,只要一段数据两端没接上,谱泄露是必然的,整个reflect并不能真正减少谱估计误差。补0反而精度会高点。

    原文作者:minghe0109
    原文地址: https://blog.csdn.net/minghe0109/article/details/119452865
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞