pytorch语音处理函数
短时快速傅里叶变换,计算复数图谱幅度值
librosa库的stft函数仅支持numpy类型计算,无法扩展到torch.tensor类型的数据计算。以下pytorch版本代码中,torch.stft可用于短时快速傅里叶变换,但需要设定window函数为hamming_window,因为其默认为hann_window。pad_mode需要修改为constant,不能使用其默认的reflect。经过不断试错排坑,终于找到与librosa相同计算结果的pytorch函数参数/(ㄒoㄒ)/~~。
# librosa
D = librosa.stft(y, n_fft=n_fft, hop_length=hop_length,win_length=win_length, window="hamming")
spect, phase = librosa.magphase(D)
# pytorch
D = torch.stft(y, n_fft=n_fft, hop_length=hop_length, win_length=win_length, window=torch.hamming_window(win_length),pad_mode='constant')
spect = torch.norm(D, p=2, dim=-1).to(torch.float32)
pytorch相关函数
gather
用法:gather(input, dim, index)
功能:根据index,在dim维度上选取数据,输出的shape与index一致
>>> a
tensor([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 7]])
>>> c
tensor([[2],
[2],
[1],
[0]])
>>> torch.gather(a,1,c)
tensor([[3],
[4],
[4],
[4]])
split与chunk
相同点:split和chunk的返回值是tuple类型,不能直接用于后续的tensor操作,需要用torch.stack来转换为tensor类型
不同点:split是规定每batch是多少size,而chunk是规定总共分为多少batch
>>> a=torch.zeros(100)
>>> b=torch.split(a,5)
>>> type(b)
<class 'tuple'>
>>> b=torch.stack(b)
>>> b.shape
torch.Size([20, 5])
>>> c=torch.chunk(a,5)
>>> type(c)
<class 'tuple'>
>>> c=torch.stack(c)
>>> c.shape
torch.Size([5, 20])
注意,使用split和chunk时,若整个vector不能整除第二个参数,最后一个值不会自动填充元素,需要自行补充或舍去!!
>>> a=torch.zeros(19)
>>> b=torch.split(a,5)
>>> b
(
tensor([0., 0., 0., 0., 0.]),
tensor([0., 0., 0., 0., 0.]),
tensor([0., 0., 0., 0., 0.]),
tensor([0., 0., 0., 0.])
)