优秀的DSP甜点:重采样、FFT卷积。全部使用PyTorch,可微分且支持CUDA。
项目描述
Julius,基于PyTorch的快速音频和1D信号DSP
Julius包含使用PyTorch实现的不同的数字信号处理算法,因此它们是可微分的,并支持CUDA。请注意,这里实现的全部模块都可以与TorchScript一起使用。
目前,我已经实现了
- julius.resample:快速sinc重采样。
- julius.fftconv:基于FFT的卷积。
- julius.lowpass:FIR低通滤波器组。
- julius.filters:FIR高通和带通滤波器。
- julius.bands:在梅尔频率带上的波形信号分解。
此外,您可能在以下位置找到有用的实用工具
- julius.core:DSP相关函数。
- julius.utils:通用实用工具。
新闻
- 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.Conv1d
和torch.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。我们还比较了我们实现的正确性,与如resampy
或torch.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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3c0f5f5306d7d6016fcc95196b274cae6f07e2c9596eed314e4e7641554fbb08 |
|
MD5 | b9430b7ffdca5b601854f835755a420c |
|
BLAKE2b-256 | a119c9e1596b5572c786b93428d0904280e964c930fae7e6c9368ed9e1b63922 |