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

这篇博客介绍了如何在PyTorch中使用stft函数进行短时快速傅里叶变换,并与librosa库的相同操作进行对比。博主详细阐述了参数设置,特别是window函数和pad_mode的选择,以确保结果的一致性。此外,还提到了torch.gather、split和chunk的功能和用法,强调了它们在处理tensor时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.])
)
要在PyTorch中创建多维数组,你可以使用`torch.tensor`和`torch.Tensor`两种方式。对于`torch.tensor`,它是一个函数,可以根据提供的数据动态地创建张量,并根据内容推断数据类型。而`torch.Tensor`是一个具体的类,创建的对象是张量的实例,通常用于需要特定操作方法和属性的场合。两者创建的张量都可以通过`.to(device)`方法移动到GPU上进行加速。 参考资源链接:[PyTorchtorch.tensortorch.Tensor详解:差异与实战应用](https://wenku.csdn.net/doc/6401ad04cce7214c316edf9d?spm=1055.2569.3001.10343) 为了比较它们在GPU上的性能提升,你可以进行简单的基准测试。首先,使用相同的数值创建一个CPU上的张量,然后分别将其移动到GPU上,并执行一些基本的数学运算,如矩阵乘法。通过记录操作前后的执行时间,可以评估GPU加速的效果。 具体步骤如下: 1. 使用`torch.tensor`创建一个张量: ```python cpu_tensor = torch.tensor([[1, 2], [3, 4]]) ``` 2. 使用`torch.Tensor`创建一个张量: ```python cpu_torch_tensor = torch.Tensor([[1, 2], [3, 4]]) ``` 3. 将两个张量移动到GPU上: ```python gpu_tensor = cpu_tensor.to('cuda') gpu_torch_tensor = cpu_torch_tensor.to('cuda') ``` 4. 执行基准测试,计算执行时间: ```python import time # 使用torch.tensor创建的张量在GPU上的性能测试 start_time = time.time() result_tensor = gpu_tensor @ gpu_tensor.transpose(0, 1) print(f 参考资源链接:[PyTorchtorch.tensortorch.Tensor详解:差异与实战应用](https://wenku.csdn.net/doc/6401ad04cce7214c316edf9d?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值