【发布时间】: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 和线性插值进行可变速率转换,但它适用于实验室工作,对于您需要的东西有点过分。