【发布时间】:2014-11-25 01:37:53
【问题描述】:
一段时间以来,我一直在努力寻找最佳解决方案来计算使用 AudioRecord 实时捕获的样本的基频。
我查看了一些关于 SO 的示例: This one, and this one 是对我帮助最大的问题,但我仍然不完全理解它们将如何工作以找到基本频率。所以我正在寻找的是更详细的解释,说明我需要做什么才能找到具有样本的基频。
所以,我创建了一个 AudioRecord:
micData = new AudioRecord(audioSource, sampleRate, channel, encoding, bufferSize);
data = new short[bufferSize];
然后开始听:
micData.startRecording();
sample = micData.read(data,0,bufferSize);
我了解如何创建一个 Complex 数组,但我不知道 FFT.java 中的哪些方法我可以使用 的值来创建这些复数,以及哪个是返回峰值的方法频率。
【问题讨论】:
-
究竟是什么你不明白?音高估计是一个很大的研究课题。你在记录什么,你的准确性要求是什么?
-
对不起,不准确,我仍然不明白你是如何得到基频的正在播放)在 FFT 数组中。
-
谷歌“音高检测或音高估计”。有许多关于各种技术的研究论文(参见:music-ir.org/mirex/wiki/MIREX_HOME)。
-
您应该在您的问题中添加 Java 标签,因为它与 Android 相关。否则代码块不会得到语法高亮...
-
如果你强烈坚持使用 FFT,你需要做的是: 1. 用样本值填充复数数组的实部 2. 调用你的 FFT 计算方法,然后你有虚部也是。 3. 将每个点的大小计算为 Re^2 + Im^2 (如果您想要 DB 中的度量,您需要另外计算 10*log() ) 4. 现在您的结果数组是 SamplingFreq/numOfSamples 给出的频谱你频率点之间的距离。对于结果数组中的索引 i,频率为 (i+1)*SamplingFreq/numOfSamples。
标签: java audio fft frequency analysis