Obtendo a sonoridade de uma faixa com o RMS

15

Estou tentando calcular o volume de uma faixa de áudio armazenada em um buffer. O buffer contém dados PCM do sinal e eu quero saber o quão alto é o ruído usando o Root Mean Squared. Suponho que posso fazer isso no domínio do tempo, em vez de ter que mudar para o domínio da frequência. Qual seria o pseudo-código para fazer isso?

Eu simplesmente amostraria por um segundo (áudio [0] - áudio [44099], áudio [44099] - áudio [88199] etc.) e calcularia o RMS desses valores? Então, por exemplo, eu faria isso:

RMS=audio[0 0]2+audio[1]2+audio[2]2.....audio[44099]244100

por cada segundo?

XSL
fonte
1
Há um suporte faltando na expressão acima - eu adicioná-lo eu mesmo, mas as edições precisam ter pelo menos 6 caracteres aparentemente ...
Paul R
3
@PaulR - Você pode adicionar um <!-- html comment -->para contornar a restrição de caracteres no caso raro de uma postagem perfeita ter um erro pequeno, mas muito importante. Essa necessidade ocorre muito raramente: geralmente há mais de 6 caracteres a serem feitos. Por exemplo, quando há colchetes ausentes, geralmente é melhor usar as construções \sqrt{}e \frac{}{}no TeX.
Kevin Vermeer
1
@ Kevin: obrigado pela dica - vou usar sua sugestão de comentário HTML no futuro.
Paul R
@PaulR - Isso já foi discutido antes: A restrição é intencional, projetada para evitar edições incompletas ou sem sentido (veja uma defesa aqui ), mas tem seus oponentes (veja a discussão aqui ).
Kevin Vermeer
4
Observe que o RMS sozinho não informa o volume. As frequências extremamente baixas ou altas soam com volume menor que 3 kHz do mesmo valor RMS. Um filtro de ponderação A fornecerá uma estimativa mais precisa. gist.github.com/148112
endolith

Respostas:

12

Outra coisa é que o valor do RMS não está muito bem correlacionado com o volume percebido. Você pode considerar chamá-lo de nível ou volume. Há algo chamado contornos de volume igual que quantifica a sensibilidade do ouvido a uma frequência específica em comparação com outra frequência, consulte o artigo da Wikipedia . Essas curvas são dependentes do nível. Por exemplo, o ouvido é muito sensível a um tom de 1kHz em comparação com um tom de 100Hz, conforme mostrado nesta imagem (o eixo horizontal é a frequência em Hz):

contornos de volume igual

Uma das coisas relativamente simples que você pode fazer é filtrar os dados do PCM com uma curva de volume igual invertida. Ou você pode aplicar a ponderação padrão A, consulte o artigo Filtro de ponderação da Wikipedia . Em seguida, você pode calcular o valor RMS da saída do filtro ponderado de intensidade igual.

niaren
fonte
Não sei como passar do código do quesitoner para isso. O exemplo da pergunta é somar os quadrados das amostras de áudio. A resposta está falando sobre a aplicação de filtro a frequências, então parece que "filtrar os dados do PCM com uma curva de volume igual invertida" não é suficiente. Você primeiro tem que ter o valor para cada frequência, então você pode descobrir como aplicar a curva, certo? Mas esse é um grande passo deixado de fora.
Gman #
@ gman A idéia é pré-processar o áudio com um filtro e depois usar o resultado como na pergunta (computação RMS). Não tenho 100% de certeza do que você quer dizer. Você não tem certeza de como fazer a filtragem ou talvez o design do filtro?
Niaren 27/02/19