该函数是音频信号短时傅里叶变化的librosa实现,旧版本调用方式为librosa.core.stft, 目前新版本已经修改为librosa.stft
文档地址 : https://librosa.org/doc/0.8.0/generated/librosa.stft.html
函数头:
librosa.stft(y, n_fft=2048, hop_length=None, win_length=None, window=‘hann’, center=True, dtype=None, pad_mode=‘reflect’)
- stft : short-time Fourier Transform。
- y : numpy数组,一般来自librosa.load(path, sr)[0]。
- n_fft : stft计算过程中的帧长,单位为采样点,默认值为2048,指的是采样率为22050时93ms音频对应的采样点,对于其他采样率的音频,可以适当修改。
- hop_length : 帧移。默认hop_length=nfft // 4。分帧涉及的概念,由于stft是短时傅里叶变换,需要首先将音频分帧,一帧一帧向后滑动不断计算,这里向后滑动的距离就是hop_length, 单位也是采样点数。此外这个概念与overlapping相关,帧与帧之间需要有重叠,才能保证信号的平滑星,这里重叠的长度(采样点数)就是overlapping, n_fft = hop_length + overlapping。这里hop_length会影响最终结果的帧数,但是对频率分辨率并不会产生影响。
- win_length : 窗函数的长度,一般与 n_fft 相等。帧长会影响stft的时间分辨率,但是需要注意与频率分辨率取得平衡。窗函数的长度与频带宽一般成反比,具体可参见语谱图 基频 共振峰和宋知用老师《matlab语音信号分析与合成》2.4.2节。
- window : 窗函数。默认使用汉宁窗。
- center : 一帧开始的位置。默认是True, 表示当前帧t是以 t*hop_length 这一点为第t帧的中心点。否则是以 t*hop_length 这一点为一帧的起始点。
- dtype:D的复数值类型。默认值为64-bit complex复数
- pad_mode:如果center = True,则在信号的边缘使用填充模式。默认情况下,STFT使用reflection padding。
- 返回 : 是一个复数矩阵,shape = [1+n_fft/2, n_frams]
- 其中,n_fft/2是因为实数FFT信号具有对称性,我们只需要去一般的数据分析即可,全部返回有数据冗余。
- n_frames: n_frames = (speech_len) // hop_len + 1。 具体可以画图,信号处理之前首先需要padding, padding之后分帧,画图可以看到,真正与帧数有关系的,是hop_len。
一个示例如下:
参考: