如何计算android中的声音频率?

时间:2012-10-04 06:09:05

标签: android audio frequency-analysis

我想开发app来计算Android中的声音频率。 Android设备将采取 来自麦克风的声音(即外侧声音),我在应用程序中有一个彩色背景屏幕。 在声音频率变化时,我必须改变屏幕的背景颜色。

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

有没有可用的Android API?

请帮我解决这个问题。

4 个答案:

答案 0 :(得分:6)

您的问题已解决here编辑:archived here。您也可以使用FFT分析频率。

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

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

不可否认,代码是在C中,但我认为你会发现它很容易移植。

简而言之,你必须:

  1. 低通输入信号,以便更高频率的泛音不会被误认为基频(这可能不是您应用中的问题,因为您只是在寻找音高变化,但我无论如何都建议这样做是因为太复杂而无法进入这里。

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

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

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

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

    2. 使用基于自相关的时域方法。尹是一个很好的选择。 (google为“yin pitch tracking”)

答案 3 :(得分:-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/