我有一个48 kHz的PCM流,想要将它流式传输到兼容44.1 kHz的播放器(Apple的AirPlay)。
有人知道这“是否正常,因为某些字节会丢失”,或者我是否必须先进行转换/下采样?
如果它不“正常”,那么在java中有什么提示吗?
编辑:
它不仅会起作用,因为声音会出现口吃(“信息溢出”)。 我必须重新采样/下采样pcm-stream。
因为在这种情况下(48 kHz到44.1 kHz)这不是那么简单,我应该使用一个库来执行此操作:
我想我会试试libresample。 因为我在Android上,我可以使用native implementation或java implementation。
您认为java实现是否具有高性能?
答案 0 :(得分:1)
您的案例中所需的流程称为“按理性因素下采样”。这不是一个小问题,所以我建议你使用一个库来做到这一点 - 自己实现这个需要大量的DSP知识。 您可以使用libresample,一个C库,您必须为此编写JNI绑定。
要进行非常粗略的近似,您可以创建一个新缓冲区,在该缓冲区中复制大多数旧样本,但每10个样本都会丢弃。它不会精确到44.1 kHZ,但比播放它更好。
答案 1 :(得分:1)
好的,最简单的方法是采用每个48/44.1
样本(相当于每12个样本踢出一次)。你最终必须这样做。
问题在于别名。如果你的下采样,你实际上将你的下采样率之外的频谱镜像到你的样本中(参见this wiki page以获得一个很好的解释),这称为别名。你显然不希望这样(你可以尝试一下,看看你的音频会发生什么)。
那么我们如何防止这种情况呢?最常见的方法是以某种方式降低那些镜像频率块的频谱幅度。通过这种方式,它们被镜像,但它不再那么重要,因为它们的振幅非常低。这可以通过使用截止频率接近采样率的低通滤波器来完成。所以步骤将是:
那么过滤器的要求是什么?其中一个重要的要求是不应触及低于截止频率的频率幅度,因此非常低的通带纹波和1的通带增益会很好。然后应尽可能地抑制阻带。这显然取决于您的数据。我不知道特殊的音频处理,但通常在DSP中,使用的低通滤波器是FIR
或IIR
。当然还有很多其他的,但是这些非常容易实现,并且在某种程度上甚至能够处理实时约束。
所以我建议你阅读两个过滤器实现(或者只关注FIR
)。如果你真的对我刚写的内容感到困惑,那么使用具有某种低通滤波能力的给定库可能更好。但是如果你正在使用那些东西,那么我建议你阅读这个问题,这真的有助于理解,发生了什么......;)
答案 2 :(得分:0)
您需要对输入信号应用抽取。 首先,您需要通过低通滤波器传递输入(认为这是一种抗锯齿)。
然后你需要通过理性因子进行下采样。互联网上有很多关于这两个过程的文章。所以,如果你真的能胜任这项任务,那就去做一些研究吧。
E.g。一种简单的低通滤波器方法是使用两个样本的平均值作为输出样本。 即,y(n)=(x(n)+ x(n-1))/ 2;其中y - 是输出,x - 输入,n - 当前样本位置。