Java - 降采样WAV音频文件

6

你好,我需要将一个wav音频文件的采样率从44.1kHz降低到8kHz。我必须手动通过一个字节数组来完成所有的工作...这是为了学术目的。

我目前正在使用Sink和Source两个类来弹出和推送字节数组。一切都很顺利,直到我需要使用线性插值来降低数据块的采样率时。

由于我要将采样率从44100降低到8000赫兹,那么如何对包含128000000个字节的字节数组进行插值呢?现在我根据i%2 == 0、i%2 == 1和i%80 == 0来弹出5、6或7个字节,并将这些5、6或7个字节的平均值推入新文件中。

结果确实比原始文件要小,但不能在Windows Media Player上播放(提示读取文件时发生错误),并且有很多噪音,尽管我能听到正确的声音轨道在噪音背后。

因此,总之,我需要关于线性插值部分的帮助。谢谢。


如果您现在发布您正在使用的代码,我们将更容易地帮助您找到错误。 - Carl Norum
1个回答

7
我认为你不应该使用这些样本的平均值,因为那将是一个中位数滤波器,而不是精确的下采样。只需使用每5/6/7个样本,并将其写入新文件即可。这可能会产生一些混叠伪影,但总体上可能是可识别的。
另一个更复杂的解决方案,但可能具有更好的质量结果,是先使用FFT或DFT将样本转换为频率分布,然后使用适当的采样率将其转换回来。我已经有一段时间没有做过这样的事情了,但它绝对是可行的。但你可能需要稍微调整一下才能使其正常工作。
此外,当不对完整数组进行FT而是分段时,你会遇到段边界为0的问题。几年前,当我尝试这些东西时,我没有找到解决方案(因为它也会生成伪影),但如果你读对的书,可能会有解决方案。
至于WMP抱怨文件:你确实根据自己的需要修改了头吗?

平均化可能不是一个好主意。如果您想获得比仅挑选样本更少的伪影,您可以进行上采样然后下采样。 - Carl Norum
2
哇!非常感谢,“只使用每5个、6个或7个样本,并将其写入新文件”正是解决了我整个问题的关键!真不敢相信我花了几个小时,而你只用了2分钟就写好了!再次感谢! - Jean-Francois Hamelin
1
不客气 :-) 如果你想一想,平均值是一个非常糟糕的主意。波形的完整整体形状会丢失。而这正是对我们来说真正重要的,以便能够听到一些有意义的东西 :) - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接