计算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反而精度会高点。