librosa.stft 和 scipy.signal.stft 的区别

信息处理 Python stft scipy
2022-02-04 11:06:16

我看了librosa.stft和sicpy.signal.stft的源码,注意到这两个库中STFT(short-time Fourier transform)的计算结果有很大的不同:在scipy.signal.stft中,stft的结果是按比例缩放1.0/win.sum(),而在 librosa.stft 中不进行缩放或标准化过程。那么为什么 scipy.signal.stft 做额外的缩放过程呢?这两个库中STFT的计算还有其他区别吗?

2个回答

Fft 缩放(归一化)严格来说不是 fft 算法的一部分,尽管某些实现(如您提到的那个)包括它。由于缩放取决于实际的 fft 算法,因此在我看来,将其包含在实现中是有意义的,因为程序员决定使用什么缩放因子可能并不明显(通常的缩放因子是 ,(一种有效的 fft 算法,只使用一半的频谱,所以我们需要乘以 2 来补偿丢失的能量), ,1/N2/N1/sum(wnd)2/sum(wnd)

至于你的第二个问题,我没有查看代码(你没有提供任何指向源代码的链接),但是考虑到 fft 算法可以通过多种方式实现,可能存在一些(通常是微小的)计算差异(例如,实数 fft 与复数 fft,频率抽取与时间抽取,基数 2 与混合基数等及其组合)

scipy.signal.stft使用结果stft源代码的比例因子来获得与您需要
的相同的值:librosa.stft

_, _, stft_res = scipy.signal.stft(inputAudio, window='hamming', nperseg=640, noverlap=480, boundary=None, padded=False)
hamm_win = scipy.signal.get_window('hamming', 640)
scale = np.sqrt(1.0 / hamm_win.sum()**2)
stft_res = stft_res / scale