Получить частоты из аудио
Получаю массив байт с микрофона:
void createAudioRecorder() {
final AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
8192, //частота сэмплинга
AudioFormat.CHANNEL_IN_MONO, //количество каналов
AudioFormat.ENCODING_PCM_16BIT, //формат PCM
2048);
final byte[] buffer = new byte[myBufferSize];
recorder.startRecording();
final boolean isRecording = true;
Thread recordingThread = new Thread(new Runnable() {
public void run() {
while (isRecording) {
// читаем байты с микрофона в буфер
recorder.read(buffer, 0, 1024); //читаем кусками по 1024
//дальше что-то с этим делаем (видимо раскладываем на частоты)
for (int i = 0; i < buffer.length; i++) {
System.out.println(buffer[i]);
}
}
}
});
recordingThread.start();
}
В данном случае buffer - это массив байт.
Не могу разобраться, как из массива "цифр" можно получить частоты аудио?
Массив имеет примерно следующий вид:
...
2020-07-20 21:16:27.699 19289-19330/? I/System.out: -23
2020-07-20 21:16:27.699 19289-19330/? I/System.out: -1
2020-07-20 21:16:27.699 19289-19330/? I/System.out: 4
2020-07-20 21:16:27.699 19289-19330/? I/System.out: 0
2020-07-20 21:16:27.699 19289-19330/? I/System.out: 7
2020-07-20 21:16:27.699 19289-19330/? I/System.out: 0
...
2020-07-20 21:16:27.699 19289-19330/? I/System.out: 20
2020-07-20 21:16:27.699 19289-19330/? I/System.out: 0
2020-07-20 21:16:27.699 19289-19330/? I/System.out: 33
...
Ответы (1 шт):
Автор решения: Barmaley Red Star
→ Ссылка
Вы запрашиваете поток данных в виде AudioFormat.ENCODING_PCM_16BIT - что означает в переводе на нормальный язык PCM - Pulse Code Modulation - грубо говоря оцифрованная амплитудная модуляция сигнала. Простая синусоида (то есть 1 частотный сигнал) в PCM выглядит примерно так:
Для того, чтобы получить частоты вам надо сделать Фурье преобразование, точнее FFT (Fast Fourier Transformation)
Например так
