【问题标题】:FFT Sound analysis [closed]FFT 声音分析
【发布时间】:2016-05-21 20:48:40
【问题描述】:

我正在尝试编写一些代码。从我的电脑的麦克风和 b. 接收声音。输出声音的频率(即音高)。它不必非常精确,但必须有效。我花了很多时间浏览关于这个主题的各种论坛,发现它们都应该非常有用,除非我对这个主题有更多的了解,而且也会很有用。但是,我不是一个特别有经验的编码员,而且我看到的大多数答案都超出了我的想象。考虑到我的新手,我知道我可能咬得比我能咀嚼的更多,但如果有人能给出一个真正脚踏实地、易于理解的演练,说明我应该如何实现这一点,我将不胜感激。请原谅我的基本问题:)。

我希望用 Java 编写它,但也有使用 python 和 swift 的经验。

【问题讨论】:

  • 查看 JTransforms 以获取 Java 解决方案 - 还可以搜索 jtransforms 标记以查找类似问题(有很多)。
  • 请查看之前关于 SO 的问题 - 常见问题的变体。

标签: java audio fft tuner


【解决方案1】:

您的问题有很多解决方案。如果您擅长数学,则可以查看 FFT 的定义并实现公式。

但是,其他程序员已经完成了这项工作,并且有许多不同的库实现了 FFT 功能。

在 python 中,你可以使用 numpy.或者,如果你更喜欢 java,你可以使用那个 sn-p: http://introcs.cs.princeton.edu/java/97data/FFT.java.html

要从麦克风读取,您可以使用: https://docs.oracle.com/javase/tutorial/sound/capturing.html

(这里有一个从麦克风获取音频的示例: Java Sound API - capturing microphone)

因此,您只需要使用第二个代码,将数据读取为 16 位 PCM 大端,然后将其转发给 FFT 函数。

【讨论】:

  • 如果作者能够自己编写 FFT,它会以另一种方式提出问题。这就是为什么我提供了一个参考 FFT 实现的链接。普林斯顿代码始终经过检查并正常工作。第二个链接是对来自 oracle 的声音捕获 api 的引用。他可以很容易地结合两个代码sn-ps来解决它的问题。我认为这个论坛的目的不是通过解决自己的问题来提供功能代码。这些只是很好的提示..
【解决方案2】:

我已经使用Processing 有一段时间了,它有几个不错的支持 FFT 的音频库。默认情况下,Processing 是一个 java 库,所以你可能想试一试(如果默认的最小 IDE 不合适,你可以在 eclipse/netbeans/etc 中使用它)。

不过,您不必将 Processing 与这些库一起使用,它们毕竟是 java 库。

Minim 有一个带有forward()logAverages() 的FFT 类

Beads还有一个FFT class,还有一个book available可以更详细地分析。

这两个库还提供对声音输入的支持。

【讨论】: