Algoritmo (s) para misturar sinais de áudio sem recorte

49

Eu gostaria de misturar dois ou mais canais de áudio PCM (por exemplo, amostras gravadas) digitalmente de maneira acústica, de preferência em tempo quase real (o que significa pouco ou nenhum peek-ahead).

A maneira fisicamente "correta" de fazer isso é somar as amostras. No entanto, quando você adiciona duas amostras arbitrárias, o valor resultante pode ser até o dobro do valor máximo.

Por exemplo, se suas amostras tiverem valores de 16 bits, o resultado será de até 65536 * 2. Isso resulta em recorte.

A solução ingênua aqui é dividir por N, onde N é o número de canais que estão sendo misturados. No entanto, isso resulta em cada amostra sendo 1/5 de altura, o que é completamente irreal. No mundo real, quando dois instrumentos tocam simultaneamente, cada instrumento não fica com a metade do volume.

Da leitura ao redor, um método comum de mixagem é: resultado = A + B - AB, onde A e B são as duas amostras normalizadas sendo mixadas, e AB é um termo para garantir que sons mais altos sejam cada vez mais "cortados suavemente".

No entanto, isso introduz uma distorção do sinal. Esse nível de distorção é aceitável na síntese de áudio de alta qualidade?

Que outros métodos existem para resolver esse problema? Estou interessado em algoritmos eficientes de menor qualidade e em algoritmos de alta qualidade menos eficientes.

Estou fazendo minha pergunta no contexto da síntese de música digital, com o objetivo de misturar várias faixas de instrumentos. As faixas podem ser áudio sintetizado, amostras pré-gravadas ou entrada de microfone em tempo real.

bryhoyt
fonte
Eu me pergunto quantas vezes é possível evitar o corte apenas mudando um pouco os sinais.
Sebastian Reichelt
Boa ideia, embora eu suspeite que não seja tão simples, especialmente quando você não tem muita atenção (por exemplo, em tempo real). O problema é que você precisa conhecer a amostra com antecedência para saber que tipo de mudança de horário seria apropriado. Dito isto, na maioria das músicas, você tem uma alta probabilidade de correlação; portanto, um pouco de mudança de tempo aleatória pode funcionar muito bem. Alguém tem alguma experiência para usar aqui?
Bryhoyt 14/10/12
2
@ bryhoyt: Misturadores reais somam os sinais. É isso aí. Não são necessários atrasos ou processamento não linear. Clipping não é um problema, porque os sinais originais não eram tão altos assim.
endolith
2
16 + 16 bits = 17bits ;-)
nikwal
11
basta dividir pelo número de entradas, para que o recorte não seja possível. e se o som é muito baixo, aumente o amplificador ...
Sarge Borsch

Respostas:

14

É muito difícil apontar para técnicas relevantes sem conhecer nenhum contexto para o seu problema.

A resposta óbvia seria pedir para você ajustar o ganho de cada amostra para que o corte raramente ocorra. Não é tão irreal assumir que os músicos tocariam mais suave em um conjunto do que quando solicitado a tocar solo.

A distorção introduzida por A + B - AB simplesmente não é aceitável. Ele cria imagens espelhadas de A em cada lado dos harmônicos de B - equivalente à modulação em anel - o que é bastante terrível se A e B tiverem um rico espectro com harmônicos que não estão em proporções inteiras. Experimente em duas ondas quadradas a 220 e 400 Hz, por exemplo.

Uma função de recorte mais "natural", que funciona amostra a amostra, é a função tanh - na verdade, corresponde ao comportamento de limitação suave de alguns elementos analógicos. Além disso, você pode analisar as técnicas clássicas de compactação dinâmica - se o seu sistema puder olhar para frente e ver os picos chegarem com antecedência, isso é ainda melhor.

pichenettes
fonte
4
Adições e recorte rígido. Basta olhar para qualquer mod player de código aberto. Usando uma adição para a mistura, com entradas dimensionado de forma adequada para minimizar o corte, e em seguida um disco limitador (opcionalmente mole) é a norma, não a excepção ...
pichenettes
4
Na maioria das situações, isso não é de responsabilidade do desenvolvedor resolver o problema. Você oferece ao usuário / compositor a possibilidade de ajustar o volume de cada canal, e cabe ao usuário fazer a mixagem para que o recorte seja aceitável para ele. Por exemplo, em Renoise, por padrão, o ganho de cada instrumento / nota é 1 e as coisas começam a recortar mal ao adicionar faixas - cabe ao usuário ajustar o volume das notas ou instrumentos no módulo para evitar recortes no instrumento. faixa principal (a menos que seja desejado). Aqui está uma captura de tela mostrando o seguinte: i.imgur.com/KVxDt.png .
Pichenettes #
2
No IIRC, o FastTracker foi mais conservador, pois aplicou uma atenuação em cada faixa e, em seguida, obteve um "ganho de maquiagem" global na caixa de diálogo de preferências de x1 a x32. Lembro-me que quando eu tinha para tornar todos os meus módulos para .WAV para um CD, eu tinha que tentar valores do ganho até que encontrei o menor que não causou recorte ...
pichenettes
2
Em relação ao nível de atenuação, caso você não possa ter um usuário no loop; 1/32 é um nível absolutamente seguro (sem recorte). Supondo que os canais não estejam correlacionados (o que não é muito verdadeiro para a música - mais correto ao misturar ambientes de fundo), um valor de 1 / sqrt (32) seria um bom compromisso entre volume e probabilidade de recorte. A melhor solução ainda seria usar 1/32 e depois processar suas amostras com um compressor dinâmico.
Pichenettes #
3
Aditivos. É o que os mixers de hardware fazem de qualquer maneira e é assim que as pessoas esperam que as coisas se comportem. Os misturadores no nível do sistema simplesmente cortam. Seria um grande problema se os drivers do sistema implementassem qualquer tipo de processamento não linear - eu imaginaria a dor de engenheiros de masterização tentando descobrir se o que eles ouvem é a configuração do plug-in do compressor ou algum processamento dinâmico no nível do sistema. O software de produção musical oferece uma ampla paleta de plug-ins de compactação dinâmica; cabe aos usuários garantir que a mixagem não seja cortada.
Pichenettes #
16

A maneira fisicamente "correta" de fazer isso é somar as amostras. No entanto, quando você adiciona duas amostras arbitrárias, o valor resultante pode ser até o dobro do valor máximo. ... A solução ingênua aqui é dividir por N, onde N é o número de canais que estão sendo misturados.

Essa não é a solução "ingênua", é a única solução. É o que todo mixer analógico e digital faz, porque é o que o ar faz e o que seu cérebro faz.

Infelizmente, isso parece ser um equívoco comum, como demonstrado por esses outros algoritmos não lineares de "mistura" (distorção) não lineares incorretos:

A "divisão por N" é chamada de altura livre ; o espaço extra para picos alocados acima do nível RMS da forma de onda. A quantidade de margem necessária para um sinal é determinada pelo fator de crista do sinal . (O mal-entendido dos níveis de sinal digital e da margem de lucro provavelmente é parcialmente responsável pela guerra do Loudness e pela Elephunk .)

No hardware analógico, o espaço livre é talvez 20 dB. Em um DSP de hardware, o ponto fixo é frequentemente usado, com um headroom fixo; O SigmaDSP da AD , por exemplo, possui 24 dB de altura livre. No software de computador, o processamento de áudio geralmente é realizado em ponto flutuante de 32 bits, portanto, o espaço livre é enorme.

Idealmente, você não precisaria dividir por N, basta somar os sinais, porque seus sinais não seriam gerados a 0 dBFS em primeiro lugar.

Observe que a maioria dos sinais não está correlacionada entre si, portanto, é incomum que todos os canais de um mixer interfiram construtivamente no mesmo momento. Sim, misturar 10 ondas senoidais idênticas em fase aumentaria o nível de pico em 10 vezes (20 dB), mas misturar 10 fontes de ruído não coerentes aumentará o nível de pico em 3,2 vezes (10 dB). Para sinais reais, o valor estará entre esses extremos.

Para obter o sinal misto de um DAC sem cortar, você simplesmente reduz o ganho do mix. Se você deseja manter alto o nível RMS da mixagem sem cortes, precisará aplicar algum tipo de compactação para limitar os picos da forma de onda, mas isso não faz parte da mixagem, é uma etapa separada. Você mistura primeiro, com bastante espaço livre e, em seguida, coloca-o na compressão da faixa dinâmica mais tarde, se desejado.

endólito
fonte
11
Eu entendo esses conceitos, mas não tenho certeza se está correto. Claro, se eu adicionar um monte de amostras de 16 bits, 32 bits me fornecerão um monte de espaço numérico. Mas ainda tenho que reproduzir a mixagem resultante em um volume normalizado em um sistema de som do mundo real. Quero que dois canais soem mais altos que cada canal reproduzido separadamente, mas não quero recorte. Fazer minhas somas em 32 ou mesmo 64 bits não ajuda nisso. Talvez eu esteja começando a responder minha própria pergunta: as amostras originais devem ser normalizadas em um nível mais silencioso que a amplitude máxima. Como você sugere, deixando algum espaço para mistura.
Bryhoyt 14/10/12
3
@bryhoyt: Sim, mas você também deve se lembrar que as ondas raramente são correlacionadas entre si, portanto, somar 5 sons não produz picos 5 vezes mais altos.
Endolith 15/10/12
11
Obrigado, @ endolith, eu acho que isso é realmente o cerne de tudo isso, e me explica por que não é um problema tão grande quanto eu pensava.
Bryhoyt 15/10/12
Portanto, se 10 fontes não coerentes derem 10 dB, a divisão por sqrt (número de fontes) seria uma heurística razoável? Ou seja, se você possui 3 fontes, some-as e divida-as por sqrt (3)? (sorry para comentar sobre um tópico antigo)
nerdfever.com
@ nerdfever.com É assim que os níveis de RMS se combinam, então ... provavelmente?
Endolith
6

a fórmula

result=A+BAB

AB=AB

result=g(A+B)

g1

g=0.5g=1/2

g

result[i]=g[i](A[i]+B[i])

g[i]ABgresultado

Talvez isto:

g[Eu]=f(UMA[Eu]+B[Eu],g[Eu-1 1])

ATUALIZAÇÃO: Conforme sugerido pelo hotpaw2, você pode atrasar o sinal de entrada, mas não a supressão de ganho. Isso é chamado de "limitador de antecipação".

Bjorn Roche
fonte
Por "AB", quero dizer "A * B". Eu entendo que a amplitude pode ser positiva ou negativa. Você está certo, minha equação não faz muito sentido para combinações envolvendo amplitudes negativas.
Bryhoyt 14/10/12
Eu tenho que misturar 8 a 10 (N) diferentes ondas sinusais. Empiricamente, eu sabia que o valor certo era de 0,3 ... 1 / √N parece certo ... qualquer link para por que essa fórmula está correta?
Zibri 12/09
5

Uma maneira de fazer isso na mixagem em tempo não real é usar um AGC antecipado, em que o ganho de um ou de ambos os canais é reduzido a uma taxa difícil de perceber antes que a amplitude da soma exceda o limite de recorte. Quanto menos previsão disponível, o ajuste de ganho do AGC se tornará mais audível ou o ganho máximo para uma rampa de ajuste de ganho mais suave se aproximará cada vez mais de 0,5 por canal no limite. Para fontes sonoras com alguma previsibilidade, também é possível usar estatísticas sobre o comportamento do envelope ao longo do tempo para adivinhar adaptativamente um limite de ganho, mas com alguma probabilidade de falha (o que seria um ajuste abrupto do ganho do AGC).

hotpaw2
fonte
Este é um limitador antecipado, não um AGC antecipado.
Bjorn Roche
2
@BjornRoche: Um limitador não pode ser considerado um tipo de AGC?
Endolith 12/04
Alguns limitadores são AGCs, mas um limitador de lookahead não é um AGC.
Bjorn Roche
11
@BjornRoche bem ele é automático e controles de ganho ...
Olli Niemitalo
2

Eu tinha conversado com um designer de mixagem do final dos anos 90 e primeiro dos anos 2000 que estava entrando na onda digital (depois de ter andado na ponta dos pés). Eu acho que o cara era um designer da SPL, mas talvez não seja tão grande, eu absolutamente não me lembro nem do nome nem da marca, mas apenas do tamanho e do tamanho da máquina.

Conversamos muito e finalmente falamos sobre as técnicas para realmente garantir que seus canais de 64/128 @ 24bits misturados continuassem sendo um canal de saída misto preciso de 24 bits sem recorte.

A técnica que ele explicou era bastante simples. As 64 faixas (em 24 bits) foram adicionadas em um canal de 48 bits, onde o recorte não pode ocorrer. Direto.

Não sei dizer como esse sinal foi desviado de 48 para 24 bits. Talvez seja aí que as complicadas receitas da cozinha sejam aplicadas.

E talvez haja muitas técnicas para conseguir isso, acima de tudo diferente, seja em tempo real ou com todos os sinais já gravados com altos picos simples de determinar ... todo tipo de normalização que eu imagino.

Stephane Rolland
fonte
2

Abaixe o volume global. O rastreador de impulso emite canais normalmente em cerca de 33% do volume máximo por padrão.

Isso parece alto o suficiente para música com poucos canais (MODs Amiga de 4 canais) e suave o suficiente para músicas com 50 canais (já que o conteúdo do canal normalmente não está correlacionado, de modo que o volume não aumenta tão rapidamente após um certo nível ... mais alguns canais serão emitidos no volume máximo com tanta coisa acontecendo). Também deixa espaço suficiente para os canais panorâmicos da esquerda ou da direita (que usam 66% da faixa).

Além disso, você não deseja adicionar seus canais em 16 bits, mas em 32 bits, recortar o resultado e reduzir para 16 bits no final. Você precisará da faixa mais alta para que ela não se enrole enquanto faz as contas. Outra opção é usar o ponto flutuante de 32 bits (o que é conveniente para fazer filtros, efeitos etc.).

Hubert Lamontagne
fonte
0

Eu acho que a chave é que, se você tiver valores de 16 bits e adicionar 2 valores que poderiam ser mais do que o valor máximo, então você tem 2 opções:

1) converter ambos em 32 bits add e retornar o valor máximo se a adição exceder esse valor. Em seguida, converta-o para 16 bits. Por exemplo, se seus valores forem 32768 e 34567, excederem 65535 e a chave será retornar 65535. Você faria o mesmo se usasse valores com sinal no final do valor mínimo.

2) comprima ambos os valores e adicione-os juntos.

O primeiro é o recorte essencialmente rígido, o segundo é o recorte suave. Os sistemas analógicos são todos difíceis de cortar.

Wogster
fonte
0

Eles terão apenas o dobro do espaço se as frequências de ambas as faixas ocuparem a mesma frequência espacial. Use eq e compressão para contornar isso, esculpindo áreas do espectro de frequências para cada som e controlando os transientes e sustentações dos sons, para que tudo saia onde deveria. Talvez isso não responda à pergunta. Você pode atrasar os sinais de frequência mais baixa em até 2 ms. Ele não cancela a fase porque os comprimentos de onda são maiores que as frequências mais altas e adiciona espaço porque os transientes não estão completamente em sintonia com os sinais graves de falta de energia. Algo que linearmente adicionasse mais atraso, quanto menor o sinal, seria interessante testar.

Max Cherry
fonte
-1
A + B + {
    (|A| = A) = (|B| = B) = true: -AB;
    (|A| = A) = (|B| = B) = false: AB;
    else: 0
}

Ou seja, se A e B compartilharem um sinal, aplique um deslocamento limitador. A magnitude do deslocamento é o produto de A e B. A direção do deslocamento é oposta à de A e B.

Se A e B não compartilharem um sinal, nenhum limite será aplicado, pois não há como transbordar.

Rich Remer
fonte
Observe que isso não é comutativo. Se você quiser misturar mais de 2 vozes, precisará misturá-las todas de uma vez. Nesse caso, você deve "achatar" tudo em uma direção (se estiver muito alto, achatar os valores positivos com os negativos; se estiver muito baixo, achatar os valores negativos com os positivos). Depois de contabilizar o deslocamento (aplicado proporcionalmente aos valores restantes); use a abordagem binária, mas dimensione o limitador com base no número de valores mistos.
Ricos Remer
-1

Minha sugestão:

  1. Converta o formato de áudio da faixa do ponto fixo de 16 bits para o ponto flutuante de 32 bits.
  2. Adicione o valor atual da amostra de todas as faixas a serem misturadas.
  3. Não faça mais nada.

O usuário pode desejar processar esse fluxo misto com compactação e / ou limitação antes do pontilhamento e reconversão para o formato de ponto fixo de 16 bits (supondo que esta conversão ...

pavão aaron
fonte
2
Olá e bem-vindo ao DSP.se. Agradecemos por tentar contribuir, mas não acho que isso responda à pergunta do OP. O OP não mencionou "usuários" de seu sistema: ele pode estar jogando sozinho ou gravando o programa para requisitos específicos. Sinto muito pelo voto negativo: ficarei feliz em revisar meu voto se você colocar sua resposta mais objetiva. Além disso, cuide da sua formatação: consulte as Perguntas frequentes para ver como escrever boas respostas.
Penelope