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

如何在android中计算声音频率?,android,audio,frequency-analysis,Android,Audio,Frequency Analysis,我想开发一个应用程序来计算Android中的声音频率。Android设备将需要 来自麦克风的声音(即外侧声音),我在应用程序中有一个彩色背景屏幕。 在声音频率变化时,我必须改变屏幕的背景色 所以我的问题是“如何获得声音频率” 有android API可用吗 请帮我解决此问题。您的问题已解决编辑:。您还可以使用分析频率 编辑:(示例代码,评论中的链接)感谢您的回复,我在 只需修改您的代码,以便使用以下方法计算声音频率 // sampleRate = 44100 public static

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

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

有android API可用吗

请帮我解决此问题。

您的问题已解决编辑:。您还可以使用分析频率


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

感谢您的回复,我在

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

 // 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;
}
//sampleRate=44100
公共静态整数计算(整数采样器,短[]音频数据){
int numSamples=audioData.length;
int numCrossing=0;
对于(int p=0;p0&&audioData[p+1]=0))
{
numCrossing++;
}
}
float numseconds recorded=(float)numSamples/(float)采样器;
浮动numCycles=numCrossing/2;
浮动频率=记录的numCycles/numseconds;
返回(int)频率;
}

这里有一个指向上述代码的链接。还有一些其他有用的代码

以下是零交叉的处理:

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

这里的代码似乎可以很好地确定频率(如果您可以将其从C#翻译成java)
其他答案显示了如何显示光谱图。我认为问题在于如何检测基频的变化。在Stack Exchange上经常会有这样的问题,我为此写了一篇博客(带有代码!):

诚然,代码是用C编写的,但我想你会发现移植起来很容易

简而言之,您必须:

  • 低通输入信号,以便更高频率的泛音不会被误认为基频(这在您的应用程序中似乎不是问题,因为您只是在寻找音高的变化,但我建议无论如何都这样做,因为这里的原因太复杂了

  • 使用适当的窗口功能打开信号。为了获得响应最快的输出,应该重叠窗口,我在示例代码中没有这样做

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

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

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

  • 使用基于自相关的时域方法。尹是一个很好的选择。(谷歌搜索“音音高跟踪”)


  • 看看android.media.audiofx public int getFft(byte[]fft)方法,希望它能指引你正确的方向谢谢你的回复,我已经用这个答案中链接上的示例完成了这项工作,现在已经死了。请考虑编辑它。你正在分析零交叉;我相信这可以用来识别主频或谐波。这不是傅里叶变换。如果信号是两个信号的和,第一个是频率F和振幅a,第二个是频率N*F和振幅a