android录制VU表

时间:2013-12-02 12:32:03

标签: android audio wav

我想在我的录制应用中实现VU meter。我的应用程序正在WAV format中录制,我希望VU表每秒更新一次。

请指导我如何做到这一点:

  1. 假设采样率 44100 。 我发现audioData的最大绝对值是1秒。我应该这样做:

    int average = maxSampleValue / nrOfSamplesInOneSec;

  2. 我会像这样转换 maxAmpl powerDb = 20 * log10(getAmplitude());

  3. 我的VU计量表将是一个填充color(green - yellow - red)的矩形。这个矩形的最大高度是多少(以dB为单位)?最低限度?哪个(以dB为单位)绿色应以黄色变化?

  4. 请帮我解决这个问题。另外,(短)教程对我来说非常方便。

1 个答案:

答案 0 :(得分:1)

模拟VU表以dB刻度显示近似平均功率,其中在特定时间窗口内取平均值。因此,您需要决定什么是您的时间窗口,以获得信息丰富且具有视觉吸引力的结果。我建议你从300毫秒开始,然后稍微玩一下这个范围。为了找到以dB为单位的幅度,您需要在时间窗口内平均信号的绝对值,取结果的10基数对数,然后乘以20.注意除非您想要另外显示实际值对于绿 - 黄 - 红米,基数10的选择和乘以20是任意的。另外需要注意的是,用于平均的窗口长度应该与音频缓冲区的大小分离 - 只要有足够的样本来填充窗口(或更多),就会累积样本并找到平均值,而不管您从硬件获得的传入样本数。

为了将dB级别转换为可视化仪表,您需要确定最小和最大可能值。从理论上讲,最小值是-infinity(log(0)),但是噪声会使它成为一个有限值,您可以通过记录几秒钟的静音来测量。最大值由位数和表示(float或int)设置。如果使用float,则最大幅度为1.0,因此最大dB级别为0.如果使用16位整数,则最大值为32768,这大约为90dB。另请注意,您可能希望通过使仪表的最大值小于实际最大值(例如3或6分贝)来向用户提供他/她接近最大允许值的指示。

关于黄色范围,这是一个应用问题,因此您必须考虑用例以及您向用户呈现的级别实际指示的内容。