【问题标题】:Play 48 kHz PCM on 44.1 kHz receiver在 44.1 kHz 接收器上播放 48 kHz PCM
【发布时间】:2012-06-19 13:23:45
【问题描述】:

我有一个 48 kHz 的 PCM 流,想将它流式传输到一个 44.1 kHz 兼容的播放器(Apple 的 AirPlay)。

有人知道这是否“只是因为某些字节会丢失而起作用”,还是我必须先进行转换/下采样?

如果它不能“正常工作”,有什么技巧可以在 java 中做到这一点吗?

编辑:

它不仅会起作用,因为声音会结结巴巴(“信息溢出”)。 我必须对 pcm-stream 重新采样/下采样。

因为在这种情况下(48 kHz 到 44.1 kHz)这不是那么简单,我应该使用一个库来执行此操作:

我想我会尝试 libresample。 因为我使用的是 Android,所以我可以使用 native implementationjava implementation

您认为 java 实现的性能是否足够?

【问题讨论】:

    标签: java pcm airplay sample-rate downsampling


    【解决方案1】:

    您的情况所需的过程称为“按合理因素进行下采样”。这不是一个微不足道的问题,所以我建议你使用一个库来做到这一点 - 自己实现这个需要大量的 DSP 知识。 您可以改为使用 libresample,这是一个 C 库,您必须为其编写 JNI 绑定。

    要进行非常粗略的近似,您可以创建一个新缓冲区,在其中复制大部分旧样本,但每 10 个样本删除一次。它不会完全是 44.1 kHZ,但比按原样播放要好。

    【讨论】:

      【解决方案2】:

      好的,最简单的方法是获取每个48/44.1th 样本(这等于每 12 个样本踢出一次)。您最终将不得不这样做。

      问题在于混叠。如果您进行下采样,您实际上是在将下采样率之外的频谱镜像到您的样本中(请参阅this wiki page 以获得很好的解释),这称为混叠。您显然不希望这样(您可以尝试一下,看看您的音频会发生什么)。

      那么我们该如何防止呢?最常见的方法是以某种方式降低那些镜像频率块的频谱幅度。通过这种方式,它们镜像,但不再那么重要了,因为它们的幅度非常低。这可以通过使用截止频率接近采样率的低通滤波器来完成。所以步骤是:

      • 对您的样本进行低通滤波以去除 44.1kHz 以上的高频振幅(注意不要去除低于该频率的东西)
      • 对您的数据进行二次抽样(在您的情况下,每 12 个样本退出一次)

      那么该过滤器的要求是什么?其中一个重要要求是不应触及低于截止频率的频率幅度,因此非常低的通带纹波和 1 的通带增益会很好。然后应尽可能抑制阻带。这显然取决于您的数据。我不知道特殊的音频处理,但通常在DSP中,使用的低通滤波器是FIRIIR。当然还有很多其他的,但是这些都很容易实现,并且在一定程度上甚至能够处理实时约束。

      所以我建议您阅读这两个过滤器实现(或只关注FIR)。如果您真的对我刚刚写的内容感到困惑,那么最好只使用具有某种低通滤波能力的给定库。但是,如果您经常使用这些东西,那么我建议您阅读一下,这真的有助于理解发生了什么……;)

      【讨论】:

        【解决方案3】:

        您需要对输入信号应用抽取。 首先,您需要将输入通过低通滤波器(将其视为抗锯齿)。

        那么你需要通过一个合理的因素进行下采样。互联网上有很多关于这两个过程的文章。所以,如果你真的能胜任这项任务,那就去做一些研究吧。

        例如一种简单的低通滤波器方法是使用两个样本的平均值作为输出样本。 即y(n)=(x(n)+x(n-1))/2;其中 y - 是输出,x - 输入,n - 当前样本位置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-24
          相关资源
          最近更新 更多