java - 在 Android 上查找音高

标签 java android audio fft

如何从我的语音记录中找到最小、最大、平均、标准偏差音调? 我使用 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.

使用这个公式我可以找到最小、最大、平均和标准偏差间距。

都对吗?

最佳答案

FFT 返回一组选定音频频谱频率仓的复数幅度数组。它不直接估计音高频率,因为音乐音高不仅仅是一个频谱频率仓。

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

关于java - 在 Android 上查找音高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9979196/

相关文章:

Java 将 List 的值映射到 Hashmap

android - Gradle 插件 'com.android.library' 不在自定义 Maven 存储库中搜索

java - 如何解决Android中的静态 fragment 需求?

android - 在 Android 应用程序中存储用户名和密码

flash - Flash As3静音按钮问题

networking - 获取总延迟-UDP音频通信

java - 我可以对 JList 进行分页吗

java - logback 中的totalSizeCap 似乎没有按预期工作

java - DBCP 连接池

sockets - 通过TCP/IP进行音频和视频