Я анализирую аудиосигналы на 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)