代码之家  ›  专栏  ›  技术社区  ›  JTing

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

  •  1
  • JTing  · 技术社区  · 8 年前

    我试图找到FFT的输入,以便获得每个音频输入的时频数据。我浏览了一些网站,我知道应该从 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算法感到困惑。或者,我们应该从其他地方获得输入,而不是 目标数据线 ?

    任何想法的帮助都是感激的:)谢谢!

    1 回复  |  直到 8 年前
        1
  •  1
  •   Phil Freihofner    8 年前

    read()方法用于从TargetDataLine获取数据。这将音频数据放入一个缓冲区,您可以直接发送到fft分析。由于不知道fft需要什么,您可能必须先进行一些文件/格式转换。例如,您可能必须将音频字节转换为标准化浮点。 Using Files and Format Converters 是Oracle教程,对该过程有一些介绍。第一个代码示例的注释中有一节说“//这里,对audioBytes数组中的音频数据做一些有用的事情……”这是音频流的各个字节(无论是来自AudioInputLine还是TargetDataLine)的公开位置,可以在发送到FFT分析之前对其进行操作。