在安卓系统中找到声音音调

5
我如何从我的声音记录中找到最小值、最大值、平均数和标准偏差? 我使用AudioRecord来记录我的声音。
frequency = 8000;
channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency, channelConfiguration, audioEncoding, bufferSize);

我使用FFT算法处理语音原始数据并获取float[]数组

然后我使用这个函数:

private float[] spectrumAnalyz(float[] spectr) {
float Re;
float Im;
float[] spectruData = spectr;
float[] mySpectrum = new float[(spectruData.length / 2) - 1];
for (int i = 1, j = 0; i < spectruData.length / 2; i++, j++) {
Re = spectruData[2 * i];
Im = spectruData[2 * i + 1];
mySpectrum[j] = (float) Math.sqrt(Re * Re + Im * Im);
}
return mySpectrum;
}

这个函数返回频率数组。在谷歌上搜索后,我找到了这个公式http://en.wikipedia.org/wiki/Pitch_(music)

pitch = 69+12*log2(F/440Hz), where F is frequency in Hz.

使用这个公式可以找到音高的最小值、最大值、平均值和标准差。

全部正确吗?

1个回答

0

FFT(快速傅里叶变换)返回一组复数幅度,用于一堆选定的音频频谱频率区间。它并不直接估算音高频率,因为音乐音高不仅仅是一个频谱频率区间。

如果您使用音高检测或估算方法(加权自相关、倒谱、RAPT等),您引用的公式将为该音高频率给出MIDI编号。


1
我如何获得带有人声信息的频率数据?也许我应该使用一些库或框架吗? - Illia

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