如何在安卓设备中计算声音频率?

20

我想要开发一款在Android上计算声音频率的应用程序。Android设备将通过麦克风(即外部声音)获取声音,并且我在应用中有一个带有颜色背景屏幕。当声音频率改变时,我必须更改屏幕的背景颜色。

所以我的问题是“如何获取声音频率”?

是否有任何可用的Android API?

请帮我解决这个问题。


1
请参考android.media.audiofx中的public int getFft (byte[] fft)方法,希望能为您指明正确的方向。 - Zia
4个回答

6

谢谢回复。我已经使用链接上的示例完成了这个任务。 - Ashish Wadatkar
5
这个回答中的链接已经失效,请考虑编辑它。 - armadadrive

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;
}

3
你正在分析零交叉;我相信这可以用于识别主频或谐波。这不是傅里叶变换。 - Daniel Papasian
如果信号是由两个信号相加而成的,第一个信号具有频率_F_和振幅_A_,第二个信号具有频率_NF_和振幅_a_<_A_,则零交叉点的数量将在_F_和_NF_之间(绘制两个正弦波的总和以了解原因)。 - 18446744073709551615

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

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

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

简而言之,你需要:

  1. 低通滤波输入信号,以便高频泛音不会被误认为是基频(在你的应用中可能看起来不是问题,因为你只是想寻找音高变化,但出于复杂的原因,我建议你仍然这样做)。

  2. 使用适当的窗函数对信号进行窗口处理。为了获得最敏感的输出,你应该重叠窗口,但我在示例代码中没有这样做。

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

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

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

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


-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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接