我正在尝试找到FFT的输入,以便获取每个音频输入的时频数据。我浏览过一些网站,我知道输入应该从 targetDataLine
获取。我编写了一个程序来捕获音频数据并且它可以工作。
这是我打印targetDataLine
的代码(收集音频数据后)
System.out.println
("TargetDataLine buffer size is " + targetDataLine.getBufferSize()
+ "\n" + "TargetDataLine format is "
+ targetDataLine.getFormat().toString() + "\n"
+ "TargetDataLine info is "
+ targetDataLine.getLineInfo().toString());
这是系统输出:
TargetDataLine buffer size is 8000
TargetDataLine format is PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian
TargetDataLine info is interface TargetDataLine supporting 14 audio formats, and buffers of at least 32 bytes
我很困惑这个输出的哪一部分可以用于 FFT 算法。或者,我们应该从其他地方获取输入而不是 targetDataLine
吗?
感谢任何想法的帮助:)谢谢!
最佳答案
read() 方法用于从 TargetDataLine 获取数据。这会将音频数据放入缓冲区,您可以将其直接发送到 fft 分析。不知道 fft 所需的规范,您可能必须先进行一些文件/格式转换。例如,您可能必须将音频字节转换为标准化 float 。 Using Files and Format Converters Oracle 教程对此过程进行了一些介绍。第一个代码示例的注释中有一个部分,内容为“//Here,对现在位于 audioBytes 数组中的音频数据执行一些有用的操作...”这是音频流的各个字节(无论是来自 AudioInputLine 还是来自 AudioInputLine)的位置。 TargetDataLine)已公开,可以在发送到 FFT 分析之前进行操作。
关于java - 为了使用 FFT 算法将音频转录为频率数据,我应该使用 targetDataLine 的哪一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36993873/