【问题标题】:How to resample audio?如何重新采样音频?
【发布时间】:2021-10-28 18:21:57
【问题描述】:

改变 PCM 音频采样率的最佳算法是什么?

输入通常是int16_t,频率为 44.1 kHz,但也可以是 32kHz 或其他频率。我需要的输出是 48 kHz 的 32 位 float。我精通 SIMD 内在函数并保证拥有 NEON 或 AVX,因此基于浮点数学的算法是可以的。

我需要实现FFT + inverse,还是有什么计算成本更低的东西?

例如,三次样条是否适用于此用例,或者它们会引入频率伪影?

【问题讨论】:

  • 你是正确的,你只需要插值。对于 44.1 kHz 到 48 kHz,您可能会使用线性插值,三次样条会产生一些更平滑的结果。不需要傅里叶变换,这可以完全在时域中完成
  • 这取决于信号内容与奈奎斯特的接近程度。您可以运行样本数据并将插值算法的误差与一个大的窗口 sinc 进行比较,这将使所有内容都接近 Nyquist。在可接受的错误中选择最快的。
  • @doug 我无法控制最终用户要播放或录制的音频数据。我可以并且将使用商业音频记录和 YouTube 流进行测试。尽管如此,最终用户可能有完全不同的声音,我希望重采样器即使对于 20kHz 信号也不会太差。
  • 天哪。如果您有任何以 44.1kHz 采样的 20kHz 重要信号,则线性或样条插值是非首发。您将需要一个加窗 DFFT 或相对较长的加窗 sinc FIR 插值器。也就是说,由于许多原因,包括播放期间的重建,您几乎不会在任何录制的 CD 上找到显着的 20kHz。所以你真的需要知道你正在处理的实际频谱,
  • 我会选择一个短正弦序列 FIR 滤波器。 FFT 是多余的。 OTOH,对于大多数用途来说,样条曲线都可以。 CD“红皮书”相当古老,但理论上可以在 20 kHz 处有重要信号。但它很少发生。来自 MP3 的数据应该没问题,只需线性插值即可。我不知道 OSX 使用什么,所以无能为力。我使用 10X 窗口 sinc 和线性插值进行可变速率转换,但它适用于实验室工作,对于您需要的东西有点过分。

标签: c++ math audio


【解决方案1】:

是的,FFT 是高质量的要求。

This web site 有超过 100 款正在做音频重采样的软件的漂亮图表。根据之前的经验,我知道 Steinberg 制作的专业软件通常做正确的事情。该网站上的图表同意,对于 Cubase 10 和 Nuendo 11,这些图表确实非常好。

对我来说幸运的是,ffmpeg 4.2.2 和soxr resampler 产生了几乎相同的质量。那个特定的重采样库附带了足够好的许可证,而且我的目标操作系统甚至可以使用as a package 的 DLL。

我已经集成了那个库。在将运行时重采样的 44.1 kHz 波形文件回放到 48 kHz 时,我的测试程序仅消耗大约 1% 的 CPU 时间(CPU 是四码 Allwinner A64 @ 1 GHz),因此尽管进行了 FFT,但性能还是不错的。

回到我最初的问题,该库中实现的算法来自 Laurent de Soras 2005 年的论文“The Quest For The Perfect Resampler”。

如自述文件中所述,它将 Julius O. Smith 的“Bandlimited Interpolation”technique 与基于 FFT 的过采样相结合。那里的数学相当复杂。我很幸运能找到那个库,因为我自己会浪费太多时间来尝试做类似的事情。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2011-04-29
    • 2021-01-07
    • 1970-01-01
    • 2018-06-22
    • 2014-09-11
    相关资源
    最近更新 更多