fórmula de limitação de pico / compactação de áudio necessária

9

Estou procurando uma fórmula para compactar efetivamente uma forma de onda de áudio para limitar picos. Este não é um aplicativo de "controle automático de volume", em que se controlaria o ganho do amplificador para manter um nível de volume, mas, em vez disso, quero limitar os picos individuais ("suaves" truncados). (Eu sei que isso introduz harmônicos, mas estou tentando analisar os dados, não ouvi-los.)

Minha fórmula (muito crua) até agora é:

factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))

Onde nível é o nível sonoro instantâneo, média é o nível sonoro médio histórico e fator é um multiplicador usado para produzir o nível "ajustado" ( fator vezes nível ).

Além disso, esse multiplicador é aplicado apenas se computar para um valor menor que 1. Caso contrário, o nível não será ajustado.

A intenção é limitar o nível ajustado a alguns múltiplos (cerca de 15x com esta fórmula) da média histórica. Essa fórmula é o que eu preciso, mas exibe um "mergulho" à medida que os números aumentam. Ou seja, o nível ajustado (isto é, fator vezes nível ) aumenta até um ponto com o aumento do nível não ajustado, mas, em vez de ficar assintótico, começa a ficar realmente menor. (De fato, o primeiro fator foi adicionado principalmente para impedir que a fórmula fosse zero com valores extremamente altos.)

(A razão para querer limitar os valores dessa maneira é principalmente para que o ruído transitório não perturbe seriamente a média de execução do nível de som. Mas quando você está analisando roncos, o "ruído transitório" é bastante significativo, então eu posso simplesmente reprimi-lo. .)

Então, alguém pode sugerir algo melhor? (Parece que o comportamento assintótico é fácil de produzir quando você não o quer, mas difícil quando o faz.)

Daniel R Hicks
fonte

Respostas:

9

Dois problemas aqui: como obter uma estimativa confiável do nível e como compactar os dados.

  • Use estatísticas robustas sobre os dados originais (sem limite de pico), como mediana ou quantis, em vez de uma média corrente, para tornar sua detecção de "nível típico" robusta para valores extremos.
  • k×tanh(xk)C

exemplo

  • Azul: sinal original
  • Verde: 2 x mediana do valor absoluto em uma janela deslizante como detecção de "nível típico"
  • Vermelho: compressão tanh (fórmula dada acima com k igual ao nível plotado em verde)
pichenettes
fonte
Obrigado, isso parece promissor. Vou ligá-lo e ver como ele funciona.
Daniel R Hicks
11
Eu tentei e parece que está funcionando bem (depois de limpar algumas verificações). Meu único problema é que não parece haver maneira de ajustar a nitidez do "joelho" sem diminuir o nível do clipe ou o que seja.
Daniel R Hicks
Por que "mediana móvel" é melhor que "média móvel"? Li em muitos lugares que é menos sensível aos valores extremos. Mas não consigo ver isso com dados reais . Alguma idéia sobre esta questão?
Basj 27/11/2015