了解onWaveFormDataCapture字节数组格式

问题描述 投票:0回答:1

我在Android上分析音频信号。首先尝试使用MIC并成功。现在我正在尝试对来自Visualizer.OnDataCaptureListener* onWaveFormDataCapturemethod的MP3数据应用FFT,这与MediaPlayer有关。有一个名为byte[] waveform的字节数组,当对这些数据应用FFT时,我会得到频谱泄漏或重叠。

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

我试图通过在for循环中使用下面的代码将数据转换为-1..1范围;

        // 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

作为最终过程,我将它们转换为以dB为单位的幅度,然后在屏幕上绘制频率

        // 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]
        }

当我播放20Hz到20kHz的扫频信号时,我看不到我在MIC上看到的情况。它没有绘制一条行走线,而是几条对称的线路远远或靠近。不知何故,可视化器的另一端有一个较弱的对称信号。使用32768而不是128分割的相同代码在使用AudioRecord的MIC输入上非常有效。

我哪里做错了? (是的,我知道有一个直接的fft输出)

android signal-processing mp3 visualizer
1个回答
2
投票

输入音频是8位无符号单声道。线raw[i] = (double) waveform[i]导致无意的无符号到符号转换,并且由于raw被偏置到大约128 DC电平,小的正弦波最终变为高幅度修改的方波,因为信号穿过127 / - 128边界。这导致了一堆有趣的谐波(导致你所说的“对称线路来来往往”)。

更改为(double) (waveform[i] & 0xFF),以便转换后的值位于0..255范围内,而不是-128..127。

© www.soinside.com 2019 - 2024. All rights reserved.