20

我想开发应用程序来计算 Android 中的声音频率。Android 设备将从麦克风获取声音(即外部声音),并且我在应用程序中有一个彩色背景屏幕。关于声音频率的变化,我必须改变屏幕的背景颜色。

所以我的问题是“我怎样才能获得声音频率”?

有没有可用的android API?

请帮我解决这个问题。

4

4 回答 4

6

你的问题在这里解决了编辑:在这里存档。您也可以使用FFT分析频率。

编辑:FFTBasedSpectrumAnalyzer(示例代码,来自评论的链接)

于 2012-10-04T06:18:27.723 回答
4

感谢您的回复我已经通过在
http://som-itsolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html上使用示例

只需修改您的代码以使用以下方法计算声音频率

 // sampleRate = 44100 

public static int calculate(int sampleRate, short [] audioData){

    int numSamples = audioData.length;
    int numCrossing = 0;
    for (int p = 0; p < numSamples-1; p++)
    {
        if ((audioData[p] > 0 && audioData[p + 1] <= 0) || 
            (audioData[p] < 0 && audioData[p + 1] >= 0))
        {
            numCrossing++;
        }
    }

    float numSecondsRecorded = (float)numSamples/(float)sampleRate;
    float numCycles = numCrossing/2;
    float frequency = numCycles/numSecondsRecorded;

    return (int)frequency;
}
于 2012-10-04T09:37:12.117 回答
0

其他答案显示了如何显示频谱图。我认为问题是如何检测基频的变化。在 Stack Exchange 上经常有人问这个问题,我写了一篇关于它的博客文章(带有代码!):

http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html

诚然,代码是用 C 语言编写的,但我认为您会发现它很容易移植。

简而言之,您必须:

  1. 低通输入信号,这样高频泛音就不会被误认为是基频(这在您的应用程序中似乎不是问题,因为您只是在寻找音高的变化,但我建议还是这样做是有原因的这太复杂了,无法进入这里)。

  2. 窗口信号,使用适当的窗口函数。要获得最响应的输出,您应该重叠窗口,我在示例代码中没有这样做。

  3. 对每个窗口中的数据进行 FFT,并使用最大绝对峰值的指数计算频率。

请记住,对于您可能希望准确快速地检测音高变化的应用,我描述的 FFT 方法可能还不够。你有两个选择:

  1. 有一些技术可以使用相位信息来增加音高跟踪的特异性,而不仅仅是绝对峰值。

  2. 使用基于自相关的时域方法。尹是个不错的选择。(谷歌“阴音高跟踪”)

于 2012-10-05T15:22:19.363 回答
-1

这是提到的代码的链接。那里还有一些其他有用的代码。

https://github.com/gast-lib/gast-lib/blob/master/library/src/root/gast/audio/processing/ZeroCrossing.java

这是与 ZeroCrossings 的交易:

根据 Android 上录制的音频精确确定频率是不准确的。也就是说,它仍然有助于让您的应用程序总体感觉它所听到的声音是一种恒定的歌声,而不仅仅是噪音。

这里的代码似乎可以很好地确定频率,(如果你可以将它从 C# 翻译成 java) http://code.google.com/p/yaalp/

于 2012-10-05T08:32:17.523 回答