24个版本 (13个破坏性更新)
0.15.0 | 2024年3月5日 |
---|---|
0.14.1 | 2023年7月2日 |
0.14.0 | 2023年6月10日 |
0.12.0 | 2022年3月28日 |
0.4.3 | 2020年6月25日 |
#6 in 音频
45,875 每月下载量
用于 61 个包 (22 个直接使用)
250KB
5.5K SLoC
rubato
Rust的音频采样率转换库。
此库提供用于处理音频块的重采样器。
输入和输出采样率之间的比例完全自由。实现可以是接受固定长度输入并返回可变长度输出的,反之亦然。
Rubato可以通过预先分配[Resampler]并使用其input_buffer_allocate和output_buffer_allocate方法在处理开始之前分配输入和输出缓冲区,在实时应用中使用而无需在处理过程中进行任何分配。对于实时使用,应禁用日志功能(默认已禁用)。
输入和输出数据格式
输入和输出数据以非交错方式存储。
输入和输出数据存储为引用的切片,&[AsRef<[f32]>]
或 &[AsRef<[f64]>]
。内部向量(AsRef<[f32]>
或 AsRef<[f64]>
)包含一个通道的采样值。
由于法向量实现了 AsRef
特性,因此可以使用 Vec<Vec<f32>>
和 Vec<Vec<f64>>
作为输入和输出。
异步重采样
异步重采样器既包含抗混叠滤波器,也包含不包含的。
带抗混叠的重采样基于带限插值,使用 sinc 插值滤波器。sinc 插值通过可调整的因子上采样,然后通过这些点之间的插值计算新的采样点。重采样率可以在任何时间更新。
不带抗混叠的重采样省略了计算密集型的 sinc 插值。这运行得更快,但产生的结果质量较低。
同步重采样
同步重采样通过 FFT 实现。数据被 FFT,频谱被修改,然后进行逆 FFT 以获得重采样数据。这种类型的重采样器速度相当快,但不支持更改重采样率。
SIMD 加速
异步抗混叠重采样
异步重采样器支持 x86_64 和 aarch64 上的 SIMD。CPU 的 SIMD 能力在运行时确定。如果不可用,将回退到标量实现。
在 x86_64 上,它将尝试使用 AVX。如果 AVX 不可用,它将尝试 SSE3。
在 aarch64(64 位 Arm)上,如果可用,它将使用 Neon。
同步重采样
同步重采样器受益于 RustFFT 库的 SIMD 支持。
Cargo 特性
fft_resampler
:启用基于 FFT 的同步重采样器
此特性默认启用。如果不需要 FFT 重采样器,请禁用它以节省编译时间并减小生成的二进制文件大小。
log
:启用日志记录
此特性通过 log
包启用日志记录。此功能用于调试目的。请注意,输出日志分配了一个 std::string::String,大多数日志实现都涉及各种其他系统调用。这些调用可能需要一些(不可预测的)时间来返回,在此期间应用程序被阻塞。这意味着如果在此库中用于实时应用程序,应避免使用日志。
示例
将模拟音频文件的一个片段从 44100 Hz 重采样到 48000 Hz。还可以查看 "process_f64" 示例,该示例可用于处理磁盘上的文件。
use rubato::{Resampler, SincFixedIn, SincInterpolationType, SincInterpolationParameters, WindowFunction};
let params = SincInterpolationParameters {
sinc_len: 256,
f_cutoff: 0.95,
interpolation: SincInterpolationType::Linear,
oversampling_factor: 256,
window: WindowFunction::BlackmanHarris2,
};
let mut resampler = SincFixedIn::<f64>::new(
48000 as f64 / 44100 as f64,
2.0,
params,
1024,
2,
).unwrap();
let waves_in = vec![vec![0.0f64; 1024];2];
let waves_out = resampler.process(&waves_in, None).unwrap();
包含的示例
examples
目录包含一些用于测试重采样器的示例应用程序。还有用于生成简单测试信号的 Python 脚本,以及用于分析重采样结果的分析脚本。
示例以 64 位浮点格式读取和写入原始音频数据。如果文件首先转换为正确的格式,则可以用于处理 .wav 文件。使用 sox
将 .wav 转换为原始样本
sox some_file.wav -e floating-point -b 64 some_file_f64.raw
处理完毕后,结果可以转换回新的 .wav。此示例将转换为 16 位 44.1 kHz
sox -e floating-point -b 64 -r 44100 -c 2 resampler_output.raw -e signed-integer -b 16 some_file_resampled.wav
许多音频编辑器,例如 Audacity,也能直接导入和导出原始样本。
兼容性
rubato
包需要 rustc 版本 1.61 或更高。
变更日志
- v0.15.0
- 通过
fft_resampler
特性使 FFT 重采样器可选。 - 修复创建 FftFixedInOut 重采样器时输入和输出大小计算的问题。
- 修复使用非常小的块大小(小于 5)时的恐慌。
- 通过
- v0.14.1
- 修复与缓冲区分配和最大输出长度计算相关的更多错误。
- 修复使用
log
功能的建筑物。
- v0.14.0
- 添加参数,允许
input/output_buffer_allocate()
可选地预填充缓冲区为0。 - 添加管理缓冲区的便捷方法。
- 修复缓冲区分配和最大输出长度计算的错误。
- 添加参数,允许
- v0.13.0
- 将输入和输出数据切换为引用切片。
- 添加更快的(质量较低的)异步重采样器。
- 添加宏以帮助实现自定义对象安全重采样器。
- 可选平滑地调整比率变化以避免可听见的步骤。
- 添加处理流中最后一个帧的便捷方法。
- 添加重置重采样器的方法。
- 重构以提高逻辑结构。
- 添加计算截止频率的辅助函数。
- 为 sinc 重采样器添加二次插值。
- 添加获取通过重采样器的延迟作为输出帧数的方法。
- v0.12.0
- 始终启用所有 simd 加速(并删除 simd Cargo 功能)。
- v0.11.0
- 新 api 允许在实时应用中使用。
- 可配置异步重采样器的调整范围。
- v0.10.1
- 修复在最新夜间版本更改后使用 neon 功能的编译问题。
- v0.10.0
- 为 Resampler 添加对象安全包装特质。
- v0.9.0
- 接受任何 AsRef<[T]> 作为输入。
许可证:MIT
依赖关系
~140–680KB
~12K SLoC