从音频缓冲区制作VU表

时间:2012-02-01 23:20:25

标签: java audio

所以我正在处理这个处理音频的应用程序,我有一个包含要发送到声卡的所有数据的缓冲区。我想知道是否有人建议将此作为VU表的最佳方式?如果它有任何区别,我使用的是Java。我见过的大多数例子都是物理VU表。

编辑:我需要弄清楚如何在任何给定点获得音频缓冲区的音量

1 个答案:

答案 0 :(得分:1)

我的回答是非常粗略地计算缓冲区绝对值的漏积分。 通常,50%的值是“关闭的”,因为数字音频需要再现正压和负压。如果你没有得到这个,请参阅有关数字音频的维基百科文章。

Real VU meaters是信号幅度的泄漏积分器。 (如果电流计或电子VU表芯片具有足够高的输入电阻,则可以使用简单的缓冲器和电容器)

因此对于16位样本,代码可能看起来像......(在我的头顶)

//set up
long total=0;
const long half = 32768; //2^(n-1)
const long decayInMilliseconds=30; // 30ms for the needle to fall back to zero.
// leak rate is enough to get the reported signal to decay to zero decayMilliseconds after 
// the actual amplitude goes to zero.
int leakRate = (sample_rate*1000 /decayInMilliseconds) * half; 


// goes in a loop to do the work
// can be executed on buffer-loads of data at less than the sampling rate, but the net number of calls to it persecond needs to equal the sampling rate.

int amplitude = buffer[i]-half;
total = total + abs(amplitude);
total = total - leakRate;
if( total > half) {
    total = half;
}
//total is the current "vu level".

总值通常以对数刻度显示。