我正在做一个java个人项目,你可以录下自己唱的歌,程序将加载一首最符合旋律的歌(从预选的小部分中)。到目前为止,我已经实现了使用javasoundapi将音频文件录制为wave文件的功能。我已经看到,对于音频相似性,可以在音频文件之间执行相关,并且通过测量相关图中是否存在高幅值峰值,可以确定音频文件是否相似。
我在信号处理堆栈交换中读了下面的帖子https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar 其中谈到了使用快速傅立叶变换来实现卷积(适用于延时音频的相关)。我已经在github上导入了jtransforms项目来使用fft,但是我不确定如何将wave文件转换成一个数字表示(类似于一个大的值数组)来执行相关或卷积。任何关于如何进行这方面的建议都是非常感谢的!
1条答案
按热度按时间kse8i1jr1#
要阅读.wav,您将使用
AudioInputStream
. 教程“使用文件和格式转换器”中提供了一个示例这是本文的第一个代码示例,位于“读取声音文件”部分。下一个障碍是将字节转换成有意义的pcm。在上面的代码示例中,有一行注解,内容如下:
这就是你可以把字节转换成pcm的地方。确切的算法取决于您可以通过
AudioInputStream
的getFormat
方法,该方法返回AudioFormat
.该格式将告诉您每个pcm值有多少字节(例如,16位编码是每个pcm值两个字节)和字节顺序,可以是小端或大端。如果音频为立体声,则pcm值在左和右之间交替。
从字节建立pcm值涉及位移位。我猜你知道怎么处理。假设数据是有符号pcm格式,创建16位值的自然结果将是有符号短整数。因此,最后一步通常是除以short.max\u值,将short转换为-1到1之间的有符号浮点。