您好,我需要将 wav 音频文件的采样率从 44.1kHz 降低到 8kHz。我必须使用字节数组手动完成所有工作……这是出于学术目的。
我目前正在使用 2 个类,Sink 和 Source,来弹出和压入字节数组。一切顺利,直到我到达需要使用线性插值对数据 block 进行下采样的部分。
由于我正在从 44100 赫兹下采样到 8000 赫兹,我该如何插入一个包含大约 128 000 000 字节的字节数组?现在我根据 i%2 == 0、i%2 == 1 和 i%80 == 0 弹出 5、6 或 7 个字节,并将这 5、6 或 7 个字节的平均值推送到新文件中.
结果确实是一个比原来小的音频文件,但它不能在windows media player上播放(说是读取文件时出错),而且有很多噪音,虽然我能听到后面正确的轨道噪音。
因此,总而言之,我需要有关线性插值部分的帮助。提前致谢。
最佳答案
我认为您不应该使用这些样本的平均值,因为那将是一个中值滤波器,而不是精确的下采样。只需使用第 5/6/7 个样本并将其写入新文件即可。
这可能会有一些混叠伪像,但总体上可能是可识别的。
另一种更复杂但可能在质量方面具有更好结果的解决方案是首先使用 FFT 或 DFT 将样本转换为频率分布,然后以适当的采样率将其转换回。我已经有一段时间没有做过这样的事情了,但这绝对是可行的。不过,您可能需要稍作调整才能使其正常工作。
此外,如果不是对整个数组进行 FT,而是分段进行,您会遇到段边界为 0 的问题。几年前,当我玩这些东西时,我没有想出一个可行的解决方案(因为它也会生成工件)但如果您阅读正确的书籍,可能会有一个工件:-)
至于 WMP 提示文件:您确实相应地修改了您编写的 header ,对吗?
关于Java - 下采样wav音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579728/