#输入输出 #采样率 #音频处理 #重采样 #插值 #实时 #比例

rubato

专为音频数据设计的异步重采样库

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 音频

Download history 10362/week @ 2024-04-30 8602/week @ 2024-05-07 8220/week @ 2024-05-14 8149/week @ 2024-05-21 7858/week @ 2024-05-28 9778/week @ 2024-06-04 10088/week @ 2024-06-11 10128/week @ 2024-06-18 8862/week @ 2024-06-25 9653/week @ 2024-07-02 8787/week @ 2024-07-09 9158/week @ 2024-07-16 10226/week @ 2024-07-23 10998/week @ 2024-07-30 12212/week @ 2024-08-06 11155/week @ 2024-08-13

45,875 每月下载量
用于 61 个包 (22 个直接使用)

MIT 许可证

250KB
5.5K SLoC

rubato

Rust的音频采样率转换库。

此库提供用于处理音频块的重采样器。

输入和输出采样率之间的比例完全自由。实现可以是接受固定长度输入并返回可变长度输出的,反之亦然。

Rubato可以通过预先分配[Resampler]并使用其input_buffer_allocateoutput_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