torch.stft
以滑动窗口形式,在不同窗口内部做FFT,时域数据到频域数据
调用参数:
torch.stft(input, n_fft, hop_length=None, win_length=None, window=None,
center=True, pad_mode='reflect', normalized=False, onesided=None, return_complex=None)
输入:
1维时域数据 shape(L) 或 2维时域数据 shape(batch, L)
输出:
(N, T, 2) 或 (batchsize, N, T, 2)
其中N为频段数,T为使用的总帧数,2为频谱的实部和虚部
N = n_fft // 2 + 1
T = (L - 1) // hopsize + 1, hopsize默认值为 1/4 的n_fft
其他参数:
hop_length 默认为n_fft/4,每次滑动窗口的步长,即每次的帧移
win_length 默认等于n_fft。需要满足win_length <= n_fft。因为fft要求输入的时域数据点数=输出的频段点数,所以当采样出win_length个时域数据时,需要用0填充至n_fft个
window shape (n_fft, ),可以由torch.hann_window()等函数生成。其本质是一个加权求和操作里的“权重”。如果当win_length < n_fft时,torch.hann_window() 生成的窗也会被填充成(n_fft,)
在使用过程中,发现输出的维度(batchsize, N, T, 2) 中的 T 比计算的分帧要多一帧,参考官方文档:torch.stft — PyTorch 1.12 documentation
其中有一个参数 center 默认为true,输入会在两侧pad,pad长度为n_fft // 2。如果将center设为false,则不再两侧pad。pad的value不是0,默认pad_mode 为‘reflect’ ,即为反射,如果输入的信号为:1,2,3,4,5,6, 在两侧pad n_fft // 2 = 3个,则pad之后的结果为:
4,3,2,【1,2,3,4,5,6】,5,4,3