为了使用 FFT 算法将音频转录为频率数据,我应该使用 targetDataLine 的哪一部分?

Which part of the targetDataLine should I use in order to transcribe audio into frequency data by using FFT algorithm?

我试图找到 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 要求的规格,您可能必须先进行一些 file/format 转换。例如,您可能必须将音频字节转换为规范化的浮点数。 Using Files and Format Converters 是对这个过程有一些介绍的 Oracle 教程。第一个代码示例在注释中有一个部分说“//在这里,对现在位于 audioBytes 数组中的音频数据做一些有用的事情......”这是音频流的各个字节(无论是来自 AudioInputLine 还是TargetDataLine) 被公开并且可以在运送到您的 FFT 分析之前对其进行操作。