pytorch 语音处理(可用于torch.tensor类型计算)及相关函数

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.])
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值