Estou tentando implementar a compactação do intervalo dinâmico de áudio em JavaScript (não usando a API de áudio da web).
Existem muitos artigos para técnicos de som e alguma documentação de alto nível, mas não encontrei nenhuma referência útil para realmente implementar a compactação da faixa dinâmica digital.
Pelo que entendi, há pelo menos três etapas no cálculo do sinal retificado.
- computando o nível de entrada
- computando o ganho a ser aplicado ao sinal
- aplicando o ganho
Eu processo o áudio em blocos, então para 1) eu estava pensando em calcular o RMS de um bloco
Alguma dica para uma boa referência? Ou alguém disposto a me explicar um pouco as etapas necessárias para implementar isso?
audio
dynamic-range-compression
sebpiq
fonte
fonte
Respostas:
Aqui estão algumas sugestões:
O princípio é criar um envelope do sinal (controlado por ataque e liberação), modelar esse envelope usando alguma função de transferência (controlada por razão, limiar e joelho) e depois aplicar esse resultado de volta ao sinal original. Um estágio de ganho de maquiagem geralmente segue.
A resposta de @ Deve sugere algumas funções de transferência possíveis.
fonte
Para um começo simples, eu usaria uma característica não linear que comprime seu sinal de entrada:g(x)
onde (conforme indicado pelo endólito nos comentários) é o envelope do sinal de áudio de entrada é o envelope de saída aplicado ao sinal de áudio real. pode ser qualquer função que atenua valores de entrada grandes mais fortes que valores de entrada pequenos. As funções A-Law e -Law foram desenvolvidas para comprimir sinais de fala para telefonia, por exemplo. Eu não sei o quão bom isso soa para a música, no entanto.x y g(x) μ
Outra função de compressão muito simples seria atenuar todas as amplitudes acima de um certo limite : que é a atenuação. Mas isso não funcionará muito bem, pois nosso senso auditivo é logarítmico, de modo que a atenuação pode ser muito forte. É por isso que os compressores de áudio funcionam em uma escala logarítmica e levam à mesma função que acima, mas todos os valores tomados logarítmicos e com relação ao valor máximo possível. Para :δ
Para compressores de áudio, é geralmente dado em dB e é expresso em alguma proporção, por exemplo, 3: 1 (isto é, ). Isso gera uma função exponencial, quando expressa linearmente (espero que esteja correta, verifique também ): Essa função possui um "joelho duro", o que significa que a função não é diferenciável em . Para um "joelho mole", você precisaria de uma transição suave nesse ponto. A extensão das funções acima para negativoδ r r=3 x>0
O ataque e o lançamento afetam diferentes sons, como chutes, armadilhas e vocais. Eles determinam quanto tempo antes que o limite seja alcançado, o compressor deve começar a funcionar e quanto tempo ainda deve estar funcionando após o sinal ter caído abaixo do limite. Para implementar isso, você precisará usar algum tipo de previsão.
Como todas as amplitudes abaixo de são atenuadas, a faixa dinâmica disponível não é totalmente explorada. Isso é corrigido pelo chamado "ganho de compensação", que é apenas uma multiplicação simples do sinal compactado com um fator de ganho . Reduzindo primeiro a faixa dinâmica e amplificando os compressores de sinal, a música pode parecer "mais alta".δ G>1
fonte