2012-02-01 4 views
1

Итак, я работаю над этим приложением, которое касается звука, и у меня есть буфер, содержащий все данные, которые нужно отправить на звуковую карту. Мне было интересно, есть ли у кого-нибудь какие-либо предложения относительно наилучшего способа построить это как измеритель VU? Если это имеет значение, я использую Java. Большинство примеров, которые я видел, были для физических счетчиков VU.Создание счетчика VU из звукового буфера

EDIT: Мне нужно, чтобы выяснить, как получить объем звукового буфера в любой заданной точке

ответ

1

Что мой ответ делает очень грубо рассчитать вытекающей интеграл от абсолютных значений буфера. Как правило, 50% значение «выключено», поскольку цифровой звук должен воспроизводить как положительное, так и отрицательное звуковое давление. См. Статью в википедии о цифровом аудио, если вы этого не сделаете.

Настоящие мясорубки VU являются протекающим интегратором амплитуды сигнала. (достаточно простого буфера и конденсатора, если гальванометр или электрическая микросхема счетчика 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". 

Значение общей величины обычно отображается в логарифмической шкале.