Я использую визуализатор Android для получения данных формы волны аудиопотока и вычисления их среднеквадратичного значения.
public int[] getFormattedData(byte[] rawVizData) {
for (int i = 0; i < formattedVizData.length; i++) {
// convert from unsigned 8 bit to signed 16 bit
int tmp = ((int) rawVizData[i] & 0xFF) - 128;
formattedVizData[i] = tmp;
}
return formattedVizData;
}
//...
double rms = 0;
int[] formattedVizData = getFormattedData(buffer);
if (formattedVizData.length > 0) {
for (int i = 0; i < formattedVizData.length; i++) {
int val = formattedVizData[i];
rms += val * val;
}
rms = Math.sqrt(rms / formattedVizData.length);
}
Я установил размер захвата равным 1024 и ожидал, что среднеквадратичное значение сигналарасти, если громкость воспроизведения выше.Я тестирую с синусоидальным тоном 440 Гц и получаю следующие результаты:
VOLUME RMS MIN VALUE MAX VALUE
6.67% 5.5 -8 7
13.33% 13.3 -19 18
20.00% 28.1 -40 39
26.67% 42.6 -60 59
33.33% 68 -96 95
40.00% 54 -77 76
46.67% 81 -115 114
53.33% 64 -91 90
60.00% 51 -91 90
66.67% 68 -97 96
73.33% 48 -69 68
80.00% 68 -97 96
86.67% 45 -65 64
93.33% 64 -91 90
100.00% 90 -128 127
Почему мое предположение больше не выполняется для объемов> 33,33%?Что мне здесь не хватает?Есть ли какая-то очевидная ошибка в моем коде, которую я просто не могу найти?
Я пытался несколько дней, чтобы выяснить, почему это не работает, и до сих пор не смог найти решение.
Любая помощь очень ценится.