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:
por cada segundo?
<!-- 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.Respostas:
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):
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.
fonte