【问题标题】:How to calculate sound frequency in android?如何在android中计算声音频率?
【发布时间】:2012-10-04 06:09:04
【问题描述】:

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

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

有没有可用的android API?

请帮我解决这个问题。

【问题讨论】:

  • 查看 android.media.audiofx public int getFft (byte[] fft) 方法,希望它能引导你正确的方向

标签: android audio frequency-analysis


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复我已经通过使用link上的示例完成此操作
  • 此答案中的链接现已失效。请考虑编辑它。
【解决方案2】:

感谢您的回复我已经通过使用示例完成此操作
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;
}

【讨论】:

  • 您正在分析零交叉;我相信这可以用来识别主频率或谐波。这不是傅立叶变换。
  • 如果信号是两个信号的和,第一个是频率F和幅度A,第二个是频率N*F 和幅度 a A,过零的数量将介于 FN*F i>(绘制两个正弦波的总和以了解原因)。
【解决方案3】:

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

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

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

简而言之,您必须:

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

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

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

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

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

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

【讨论】:

    【解决方案4】:

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

    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-02-21
      • 2013-04-10
      • 2012-02-01
      • 2015-02-06
      • 2012-06-03
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多