如何重新采样音频?

Posted

技术标签:

【中文标题】如何重新采样音频?【英文标题】: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 和线性插值进行可变速率转换,但它适用于实验室工作,对于您需要的东西有点过分。 【参考方案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 的过采样相结合。那里的数学相当复杂。我很幸运能找到那个库,因为我自己会浪费太多时间来尝试做类似的事情。

【讨论】:

以上是关于如何重新采样音频?的主要内容,如果未能解决你的问题,请参考以下文章

使用 offlineAudioContext 重新采样捕获的音频流

如何使用 NAudio 将原始音频从 WasapiCapture 重新采样到 g711 mulaw?

您如何对重新采样的音频数据进行双三次(或其他非线性)插值?

使用 NAudio 重新采样原始音频

如何使用音频重采样器对 IF 信号进行重采样

您如何获得 Windows 音频播放的当前采样率?