Ajude a implementar a compactação da faixa dinâmica de áudio


8

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.

  1. computando o nível de entrada
  2. computando o ganho a ser aplicado ao sinal
  3. 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?


1
Só para ter certeza: você deseja implementar algo como: waves.com/plugins/c1-compressor , certo?
DEVE

sim :) mas muito, muito mais simples! Os controles que eu preciso seriam limiar, joelho, razão, ataque, liberação. Mas eu posso começar com ainda mais simples
sebpiq

Respostas:


4

Aqui estão algumas sugestões:

  • Existem muitas implementações de código aberto (Sox, Audacity, etc.). Mesmo que você não os entenda, poderá traduzir o código de C para javascript.
  • Não conheço uma boa explicação do processo on-line, mas há muitos livros sobre o assunto:
    • O processamento do sinal de áudio digital aborda esse tópico e está bem escrito. (Assim como o DAFX , mas o DAFX é mal organizado e a cobertura é menos direta)
    • O áudio digital com Java também aborda esse tópico e vem com código Java funcional que deve ser fácil de traduzir para outros idiomas, como javascript. Este livro tem muitas falhas, mas é bom para alguém sem experiência em programação de áudio.

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.


O problema é que eu não conheço C, e sim, esse é um grande obstáculo ao trabalhar com dsp de áudio, porque não consigo verificar as implementações existentes. Caso contrário, obrigado pelos livros, vou verificar pelo menos o primeiro.
sebpiq

O livro DAFX possui código matlab. IDK se tiver código matlab para um compressor.
Bjorn Roche

Para o livro "Processamento de sinal de áudio digital", os comentários na amazon dizem que é melhor para pessoas com formação em engenharia elétrica. Você conhece algum livro que se concentre mais em algoritmos, o melhor seria, por exemplo, em pseudo-código?
sebpiq

1
De uma forma ou de outra, você terá que aprender algumas novas habilidades, eu acho.
Bjorn Roche

Sim eu conheço! E eu estou pronto para isso. Só que eu realmente não quero o código do matlab, por exemplo, pois não quero pagar pelo matlab para poder testá-los. É por isso que perguntei se você conhece outros livros com, por exemplo, pseudo-código, em vez de uma linguagem específica (como Java, que realmente não estou interessada em aprender).
sebpiq

2

Para um começo simples, eu usaria uma característica não linear que comprime seu sinal de entrada:g(x)

y=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.xyg(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 : δ

g(x)={xforxδax+(1a)δforx>δ
a<1x>0
log(g(x))={log(x)forxδ1rlog(x)+(11r)log(δ)forx>δ

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δrr=3x>0

g(x)={xforxδδ11/rx1/rforx>δ
logg(x)x=δxé simples, basta multiplicar pela função signum e pegar o valor absoluto de .x

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


Obrigado! Ótima explicação. Cheguei a uma função de transferência próxima à que você deu, mas a minha não incluiu o limite (simplifiquei com o limite = 0), portanto, tenho que recalcular.
sebpiq

Na verdade, a função de transferência de eu chegar, adicionando o limite é x ^ (1 / r) * 10 ^ (- sigma / (20 * r))
sebpiq

Desculpe, minhas definições de fucntion estavam uma bagunça porque eu esqueci de adicionar o viés constante. Eu corrigi isso. A última expressão, no entanto, está correta na minha opinião. Deve cumprirg(δ)=δ. Não há fator 20 envolvido aqui, porque estamos usando o logaritmo do lado esquerdo e direito para que qualquer fator constante seja cancelado.
DEVE

Parecem distorção, não compactação. Distorção é uma alteração no nível que ocorre amostra a amostra, enquanto a compressão é algo que ocorre ao longo de muitos ciclos da forma de onda (cada um dos quais é composto por muitas amostras). A distorção não linear vai parecer horrível.
Endolith 30/08/2013

@ endolith Você está certo, obrigado pela dica. Atualizei minha resposta de acordo.
DEVE
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.