跳转到主要内容

优秀的DSP甜点:重采样、FFT卷积。全部使用PyTorch,可微分且支持CUDA。

项目描述

Julius,基于PyTorch的快速音频和1D信号DSP

linter badge tests badge cov badge

Julius包含使用PyTorch实现的不同的数字信号处理算法,因此它们是可微分的,并支持CUDA。请注意,这里实现的全部模块都可以与TorchScript一起使用。

目前,我已经实现了

此外,您可能在以下位置找到有用的实用工具

Representation of the convolutions filters used for the efficient resampling.

新闻

  • 2022年9月19日: julius 0.2.7发布:修复了ONNX兼容性(感谢@iver56)。我知道我错过了0.2.6版本...
  • 2021年7月28日: julius 0.2.5发布:支持在重采样时设置自定义输出长度。
  • 2021年6月22日: julius 0.2.4发布:添加了高通和带通滤波器。代码的额外linting和类型检查。新的unfold实现,FFT卷积速度提高至x6,内存使用更高效。
  • 2021年1月26日: julius 0.2.2发布:修复了低通和重采样中滤波器的归一化问题,以避免非常低频率的泄露。从零填充切换到复制填充(使用第一个/最后一个值而不是0)以避免与强烈伪影的不连续性。
  • 2021年1月20日:现在,《julius》重采样的实现已正式成为Torchaudio的一部分。

安装

julius需要Python 3.6。要安装

pip3 install -U julius

使用方法

有关Julius的使用方法,请参阅Julius文档。以下是一些示例,帮助您快速入门

import julius
import torch

signal = torch.randn(6, 4, 1024)
# Resample from a sample rate of 100 to 70. The old and new sample rate must be integers,
# and resampling will be fast if they form an irreductible fraction with small numerator
# and denominator (here 10 and 7). Any shape is supported, last dim is time.
resampled_signal = julius.resample_frac(signal, 100, 70)

# Low pass filter with a `0.1 * sample_rate` cutoff frequency.
low_freqs = julius.lowpass_filter(signal, 0.1)

# Fast convolutions with FFT, useful for large kernels
conv = julius.FFTConv1d(4, 10, 512)
convolved = conv(signal)

# Decomposition over frequency bands in the Waveform domain
bands = julius.split_bands(signal, n_bands=10, sample_rate=100)
# Decomposition with n_bands frequency bands evenly spaced in mel space.
# Input shape can be `[*, T]`, output will be `[n_bands, *, T]`.
random_eq = (torch.rand(10, 1, 1, 1) * bands).sum(0)

算法

重采样

这是Julius O. Smith实现的sinc重采样算法。它与resampy中使用的相同算法,但为了在GPU上高效运行,它被限制为分数采样率的变化。如果将旧采样率和新采样率除以它们的最大公约数后很小,则它将非常快。例如,从2000Hz采样率变为3000Hz(除以GCD后为2,3)将非常快,而从20001Hz变为30001Hz则不会。Julius重采样在CPU上比resampy更快,当在GPU上运行时,它使重采样成为您管道中可以忽略不计的部分(当然,除了像从20001Hz采样率变为30001Hz这样的奇怪情况)。

FFTConv1d

使用非常大的内核(>=128)和步长为1进行卷积计算可以更快地使用FFT。这实现了与torch.nn.Conv1dtorch.nn.functional.conv1d相同的API,但使用FFT后端。不支持膨胀和组。FFTConv在CPU上甚至对于相对较小的张量(几十个通道,内核大小为128)也会更快。在CUDA上,由于更高的并行性,在许多情况下,常规卷积可能更快,但对于内核大小大于128、通道数较多或批量大小较大的情况,FFTConv1d最终会更快(基本上当您不再有可以隐藏操作真实复杂性的空闲核心)。

低通

经典的有限脉冲响应窗函数sinc低通滤波器。如果滤波器大小足够大,它将自动使用FFT卷积。这是构建高通和带通滤波器(参见julius.filters)的基本模块。

频段

在波形域中将信号分解到频段。例如,这可以用于执行参数化均衡(参见上面的使用方法)。

基准测试

您可以在基准测试中找到速度测试(以及与参考实现的比较)。CPU基准测试在2020年MacBook Pro上运行,搭载2.4 GHz 8核心英特尔CPU i9。GPU基准测试在Nvidia V100上运行,内存16GB。我们还比较了我们实现的正确性,与如resampytorch.nn.Conv1d这样的参考实现。

运行测试

克隆此存储库,然后

pip3 install .[dev]'
python3 tests.py

要运行基准测试

pip3 install .[dev]'
python3 -m bench.gen

许可证

julius采用MIT许可证发布。

感谢

此包以Julius O. Smith的名字命名,他的书籍和网站是我学习DSP的信息宝库。如果您想了解更多关于DSP的信息,请访问他的网站。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

julius-0.2.7.tar.gz (59.6 kB 查看哈希值)

上传时间 源代码

支持