我想开发app来计算Android中的声音频率。 Android设备将采取 来自麦克风的声音(即外侧声音),我在应用程序中有一个彩色背景屏幕。 在声音频率变化时,我必须改变屏幕的背景颜色。
所以我的问题是“我怎样才能获得声音频率”?
有没有可用的Android API?
请帮我解决这个问题。
答案 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中,但我认为你会发现它很容易移植。
简而言之,你必须:
低通输入信号,以便更高频率的泛音不会被误认为基频(这可能不是您应用中的问题,因为您只是在寻找音高变化,但我无论如何都建议这样做是因为太复杂而无法进入这里。
使用适当的窗口函数窗口信号。要获得响应最快的输出,您应该重叠窗口,我在示例代码中没有这样做。
对每个窗口中的数据执行FFT,并使用最大绝对峰值的索引计算频率。
请记住,您可能希望准确,快速地检测音高变化的应用,我所描述的FFT方法可能还不够。您有两种选择:
有些技术可以使用相位信息来提高音高跟踪的特异性,而不仅仅是绝对峰值。
使用基于自相关的时域方法。尹是一个很好的选择。 (google为“yin pitch tracking”)
答案 3 :(得分:-1)
这是指向所提及代码的链接。那里还有其他一些有用的代码。
以下是ZeroCrossings的交易:
根据Android上录制的音频精确确定频率是不准确的。也就是说,它给你的应用程序一般意义上讲是有用的,它听到的声音是一个恒定的歌声,而不仅仅是噪音。
这里的代码似乎可以很好地确定频率,(如果你可以将它从C#翻译成java) http://code.google.com/p/yaalp/