Создание VU-метра из аудио буфера - PullRequest
1 голос
/ 02 февраля 2012

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

РЕДАКТИРОВАТЬ: мне нужно выяснить, как получить громкость аудио буфера в любой заданной точке

1 Ответ

1 голос
/ 02 февраля 2012

То, что делает мой ответ, очень грубо вычисляет негерметичный интеграл от абсолютных значений буфера. Как правило, значение 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".

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...