Java - 下采样wav音频文件

时间:2009-10-16 18:46:18

标签: java audio wav downsampling

嗨我需要将wav音频文件的采样率从44.1kHz下采样到8kHz。我必须使用字节数组手动完成所有工作......这是出于学术目的。

我目前正在使用2个类,Sink和Source来弹出和推送字节数组。一切顺利,直到我到达需要使用线性插值对数据块进行下采样的部分。

由于我从44100下采样到8000 Hz,如何插入包含128 000 000字节的字节数组?现在我正在弹出5,6或7个字节,具体取决于i%2 == 0,i%2 == 1和i%80 == 0并将这些5,6或7个字节的平均值推入新文件。

结果确实是一个比原始文件更小的音频文件,但它无法在Windows媒体播放器上播放(表示在阅读文件时出错)并且虽然我能听到正确的音轨,但仍有很多噪音噪声

因此,总而言之,我需要有关线性插值部分的帮助。提前谢谢。

1 个答案:

答案 0 :(得分:7)

我认为您不应该使用这些样本的平均值,因为这将是中值滤波器,而不是完全下采样。只需使用每个第5/6 / 7个样本并将其写入新文件。

这可能会有一些锯齿现象,但可能总体上是可识别的。

另一个更复杂的解决方案,但可能是质量更好的结果,首先是使用FFT或DFT将样本转换为频率分布,然后使用适当的采样率将其转换回来。已经有一段时间了,因为我做了这样的事情,但它绝对可行。不过,您可能需要摆弄一下才能使其正常工作。

同样,当没有采用整个阵列的FT而是分段时你会遇到段边界为0的问题。几年前,当我玩这些东西时,我没有想出一个可行的解决方案(因为它也产生了文物)但如果你读了正确的书,可能还有一个: - )

至于WMP抱怨文件:你做了修改了你写的标题,对吗?