实时采样率转换

信息处理 声音的 音频处理
2022-02-17 02:48:54

是否可以进行实时采样率转换,即具有 44.1 KHz 音频流的对等点 A 通过网络将其信号发送到另一个在 48 KHz 采样率的音频流上的对等点。

如果可能,应该如何实现?我们如何解决这样一个事实,即一个对等点以不同的速率消耗数据而不是一个正在产生的数据?

谢谢!

2个回答

消耗时间和传输时间是相同的:不管采样时间如何,一秒的数据仍然是一秒的数据。但是,如果发送器和接收器不同步,则最终将需要缓冲(如本文末尾的进一步详细说明)。

两个速率之间的最大公约数是 300,因此要从 44.1KHz 重新采样到 48KHz,您需要使用比率(反之亦然):160/147

147分解为3,72

160被分解为25,5

下面演示了一种从 44.1KHz 重新采样到 48KHz 的方法,其中注意不要将采样率降低到 44.1KHz 以下(如果这对保真度有影响),并且多级简化了所需的滤波:

按 4 插入,按 3 抽取,按 8 插入,按 7 抽取,按 5 插入,按 7 抽取。

这将通过以下结构实现,其中插值器块表示在每个样本之间IDth 样本并丢弃其余的(下采样)。中间块可以以任意更高的采样率运行以跟上吞吐量,并且输入/输出块是速率匹配的(以 44.1KSps 的速率消耗样本并以 48KSps 的速率提供输出样本)。为此,我使用 20 KHz 音频带宽和 80 dB 重采样镜像抑制的要求,我估计 FIR1 需要 171 个抽头,FIR2 需要 95 个抽头,FIR3 需要 25 个抽头(作为线性相位滤波器,所以一个乘法器每 2 次轻击)。对于实时应用,通过重采样器的预期延迟为 7.9 ms。

重采样过滤器

滤波器当然可以用加窗 Sinc 函数设计(这被称为 FIR 滤波器设计的加窗方法,它是次优的 - 请参阅我们在此处的进一步讨论FIR 滤波器设计:窗口 vs Parks McClellan 和最小二乘法)。最小二乘算法(firls在 MATLAB/Octave 和 Python 中)为重采样应用程序提供了最佳解决方案,从而在给定数量的抽头下产生更高的镜像抑制。此外,在许多重采样器中(不是这个,因为比例很接近),要拒绝的图像可以被隔离到不同的频带;导致使用最小二乘算法支持的多频带滤波器,并在最需要的地方进一步最大化抑制。

插值和抽取重采样也可以通过将与上面所示的重采样器设计的相同滤波器系数映射到多相结构中来完成,如下图所示。这在性能上与上面的重采样器相同,但可以通过低至 67.2 KSps 的内部采样率和显着减少的总体计算来完成。抽取是通过为每个抽取器输出速率选择与计算周期相关的适当滤波器输出来完成的(对于前两个阶段,这最终只是换向器在每次输出更新后向后移动一个样本,最后一级向前移动一个每隔一次更新后采样)。这可能是一种非常有效的方法,因为实际上只需要为每个输出计算每个阶段中的一个过滤器(请注意,组内的每个过滤器将包含完全相同的数据,但乘法和求和只需要在一个上完成)他们每次)。由于在任何给定周期实际上只需要计算每个阶段中的一个滤波器,因此只需三个 FIR 滤波器(44 抽头、12 抽头和 5 抽头)即可完成实现,每个抽取器的系数从 ROM 表更新输出计算周期(这种高效方法需要一个紧密同步的状态机,而计算所有内部滤波器将允许内部时序高于最小限制的大量倾斜)。如果不需要 80 dB 的镜像抑制或 20 KHz 的音频带宽,

多相重采样器

这篇文章进一步详细介绍了使用多相滤波器进行重采样:

如何实现多相滤波器?

正如罗伯特在评论中指出的那样,如果输入和输出处于给定的确切频率,上述将持续工作;或者如果输入频率稍低,因为处理可以确保下一个样本在输出时钟之前准备好。问题是如果输入频率误差稍高(或输出频率稍低),就会发生丢失样本。可以提供一些缓冲来维持适度的频率变化,但总是会溢出。对于不受操作时间限制的实时应用来说,唯一可靠的解决方案是通过某种机制确保输入和输出时钟同步。鉴于 OP 提到通过网络发送数据,我相信根据两个位置之间预测的最坏情况时钟不准确性和音频传输的最长持续时间,将需要缓冲。如果输入和输出时钟位于同一位置,那么它们可以被 PLL 锁定到彼此以最小化任何缓冲要求。请注意,创造性的解决方案可以基于最小化缓冲区来驱动本地时钟同步:缓冲区半满标志可以用作频率误差鉴别器来驱动本地时钟循环!

通常的答案是您必须按整数比率进行转换,因此 44.1 kHz 到 48 kHz 需要整数上下转换。由于 DSP 教科书至少在过去 50 年中重复了这一点,因此几乎总是使用m / n的比率得到答案,其中mn是整数。典型的方法是使用加窗的 sinc 函数——sinc 是理想低通滤波器的脉冲响应,加窗是因为该函数是无限的,我们需要使其实用。

但是,不要求转换为整数倍。相同的 sinc 函数方法可用于找到下一个输出样本的任意步长。这似乎排除了使用预先计算的窗口 sinc 表进行快速查找,但幸运的是,sinc 函数相对平滑,类似于正弦波。对于充分过采样的加窗 sinc 表,表点之间的曲线非常接近直线,我们可以使用简单的线性插值。

Julius O. Smith 在这里详细介绍了该方法,页面底部附近提供了 pdf 版本:

数字音频重采样主页

对于给定的滤波器长度(sinc表窗口中的裂片)。

您可以在此处计算窗口 sinc 表而对于整数速率转换,加窗的 sinc 表可能相对稀疏,因为您事先知道所需的每个点,但这种非整数转换需要更大的表,以便在表点之间实现准确的线性插值。例如,整数覆盖可能需要相对较少的表点,导致这样的结果,每个表点都连接:

稀疏采样的窗口 sinc

但是对于这种方法,我们需要一个更平滑、更过采样的表。这是同一张表,但长度是原来的四倍,因子是原来的四分之一——我们可以说这张表和以前一样,但是过采样了四倍:

在此处输入图像描述

您可以看到,简单地过采样四倍就可以使表格点之间的线性连接更加准确。重采样文章详细介绍了过采样因子与准确性的关系。