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

标签 java fft javasound

我正在尝试找到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/

相关文章:

java - 用Java读取和处理大文本文件?

java - MIDI 乐器列表?

java - 需要帮助来控制我的电脑的主输出扬声器

java - 错误: IllegalComponentStateException when pressing JMenuItem in java swing (OSX)

java - Eclipse 内存分析器中的 OQL - 如何显示数组/ArrayList 内容

java - 比较 wav 文件

c# - 在C#中从和弦中提取音符

c++ - 如何实现重叠添加方法?

java - 音频文件的语音转换器

java - Spring MVC 在调用 SpringStoredProcedure.execute() 后是否发出提交