Понимание формата байтового массива onWaveFormDataCapture - PullRequest
0 голосов
/ 02 сентября 2018

Я анализирую аудиосигналы на Android. Сначала попробовал с микрофоном и все получилось. Сейчас я пытаюсь применить БПФ к данным MP3, полученным из Visualizer.OnDataCaptureListener * onWaveFormDataCapture метода, который связан с MediaPlayer. Существует байтовый массив с именем byte[] waveform, который вызывает спектральную утечку или перекрытие при применении FFT к этим данным.

public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate)

Я попытался преобразовать данные в диапазон -1..1 с помощью приведенного ниже кода в цикле for;

        // waveform varies in range of -128..+127
        raw[i] = (double) waveform[i];
        // change it to range -1..1
        raw[i] /= 128.0;

Затем я копирую raw в буфер FFT;

        fftre[i] = raw[i];
        fftim[i] = 0;

Тогда я вызываю функцию fft;

        fft.fft(fftre, fftim); // in: audio signal, out: fft data

В качестве финального процесса я конвертирую их в величины в дБ, а затем рисую частоты на экране

        // Ignore the first fft data which is DC component
        for (i = 1, j = 0; i < waveform.length / 2; i++, j++)
        {
            magnitude = (fftre[i] * fftre[i] + fftim[i] * fftim[i]);
            magnitudes[j] = 20.0 * Math.log10(Math.sqrt(magnitude) + 1e-5); // [dB]
        }

При воспроизведении сигнала развертки от 20 Гц до 20 кГц я не вижу того, что вижу на микрофоне. Он не рисует ни одной линии ходьбы, а несколько симметричных линий, идущих далеко или близко. Каким-то образом на другом конце визуализатора появляется более слабый симметричный сигнал. Тот же код, который использует 32768 вместо 128 на делении, очень хорошо работает на входе MIC с AudioRecord.

Где я делаю не так? (и да, я знаю, что есть прямой выход FFT)

1 Ответ

0 голосов
/ 02 сентября 2018

Входное аудио является 8-битным беззнаковым моно Линия raw[i] = (double) waveform[i] вызывает непреднамеренное преобразование без знака в подпись, и, поскольку raw смещено приблизительно до уровня 128 DC, небольшая синусоида заканчивается тем, что преобразуется в измененную прямоугольную волну с большой амплитудой, когда сигнал пересекается граница 127 / -128. Это вызывает кучу забавных гармоник (из-за которых «симметричные линии приходят и уходят», о которых вы говорили).

Решение

Измените на (double) (waveform[i] & 0xFF), чтобы преобразованное значение находилось в диапазоне 0..255 вместо -128..127.

...