如何重新采样音频?

How to resample audio?

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

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

我是否需要实施 FFT + 逆,或者是否有一些计算成本较低的东西?

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

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

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

幸运的是,对于我的目标 OS.

,ffmpeg 4.2.2 和 soxr resampler. That particular resampling library comes with a good enough license, and the DLL is even available as a package 产生的质量几乎相同

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

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

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