Algorithme (s) pour mélanger les signaux audio sans écrêtage

49

J'aimerais mélanger au moins deux canaux audio PCM (par exemple, des échantillons enregistrés) numériquement de manière acoustiquement fidèle, de préférence en temps quasi réel (ce qui signifie peu ou pas de coup d'œil).

La façon physiquement "correcte" de procéder consiste à additionner les échantillons. Toutefois, lorsque vous ajoutez deux échantillons arbitraires, la valeur obtenue peut atteindre le double de la valeur maximale.

Par exemple, si vos échantillons ont une valeur de 16 bits, le résultat sera au maximum de 65 536 * 2. Cela entraîne une coupure.

La solution naïve consiste ici à diviser par N, N étant le nombre de canaux mélangés. Cependant, cela signifie que chaque échantillon est 1 / Nth aussi fort, ce qui est complètement irréaliste. Dans le monde réel, lorsque deux instruments jouent simultanément, chaque instrument ne devient pas moitié plus fort.

En lecture, une méthode de mixage courante est la suivante: resultat = A + B - AB, où A et B sont les deux échantillons normalisés mélangés, et AB est un terme permettant de garantir que les sons plus forts sont de plus en plus "atténués".

Cependant, cela introduit une distorsion du signal. Ce niveau de distorsion est-il acceptable dans une synthèse audio de haute qualité?

Quelles autres méthodes existe-t-il pour résoudre ce problème? Je m'intéresse aux algorithmes efficaces de moindre qualité ainsi qu'aux algorithmes de haute qualité moins efficaces.

Je pose ma question dans le contexte de la synthèse musicale numérique, dans le but de mélanger plusieurs pistes d’instrument. Les pistes peuvent être de l'audio synthétisé, des échantillons pré-enregistrés ou une entrée de microphone en temps réel.

Bryhoyt
la source
Je me demande combien de fois il est possible d'éviter l'écrêtage en décalant un peu les signaux.
Sebastian Reichelt
Bonne idée, même si je soupçonne que ce n'est pas si simple, surtout quand on n'a pas grand chose à regarder (par exemple en temps réel). Le problème, c’est que vous devez connaître l’échantillon à l’avance pour savoir quel type de décalage temporel conviendrait. Cela dit, dans la plupart des musiques, la probabilité de corrélation est élevée. Un décalage aléatoire peut donc très bien fonctionner. Quelqu'un a-t-il une expérience sur laquelle s'appuyer?
Bryhoyt
2
@ bryhoyt: Les vrais mélangeurs additionnent les signaux. C'est ça. Aucun délai ni traitement non linéaire requis. L'écrêtage n'est pas un problème car les signaux d'origine n'étaient pas si forts.
endolith
2
16 + 16bit = 17bits ;-)
nikwal
1
divisez simplement par le nombre d'entrées, le découpage ne sera pas possible. et si le son est trop faible, montez l'amplificateur…
Sarge Borsch

Réponses:

14

Il est très difficile de vous diriger vers des techniques pertinentes sans connaître le contexte de votre problème.

La réponse évidente serait de vous demander d'ajuster le gain de chaque échantillon de sorte que l'écrêtage se produise rarement. Il n’est pas si irréaliste de supposer que les musiciens joueraient moins fort dans un ensemble que lorsqu’on leur demande de jouer en solo.

La distorsion introduite par A + B - AB n’est tout simplement pas acceptable. Il crée des images miroir de A de chaque côté des harmoniques de B - l'équivalent de la modulation en anneau - ce qui est plutôt affreux si A et B ont un spectre riche avec des harmoniques qui ne sont pas à des rapports entiers. Essayez-le sur deux ondes carrées à 220 et 400 Hz par exemple.

Une fonction de découpage plus "naturelle" qui fonctionne échantillon par échantillon est la fonction tanh - elle correspond en fait au comportement de limitation douce de certains éléments analogiques. Au-delà de cela, vous pouvez vous pencher sur les techniques classiques de compression dynamique - si votre système peut anticiper et voir les pics venir, c'est encore mieux.

pichenettes
la source
4
Ajouts et découpage dur. Il suffit de regarder n'importe quel lecteur de code source ouvert. Utiliser une addition pour le mixage, avec des entrées dimensionnées de manière appropriée pour minimiser l'écrêtage, puis un limiteur dur (éventuellement soft) est la norme, pas l'exception ...
pichenettes
4
Dans la plupart des situations, ce n'est pas au développeur de résoudre le problème. Vous donnez à l'utilisateur / au compositeur la possibilité de régler le volume de chaque canal et il appartient à l'utilisateur de faire le mixage de manière à ce que l'écrêtage soit acceptable pour eux. Par exemple, dans Renoise, par défaut, le gain de chaque instrument / note est égal à 1 et les choses commencent à mal se couper lors de l’ajout de pistes - il appartient à l’utilisateur de régler le volume des notes ou des instruments du module pour éviter tout coupure du son. piste master (sauf si vous le souhaitez). Voici une capture d'écran montrant que: i.imgur.com/KVxDt.png .
Pichenettes
2
IIRC, FastTracker était plus conservateur, en ce sens qu’il appliquait une atténuation sur chaque piste, puis qu’il disposait d’un «gain de maquillage» global dans la boîte de dialogue des préférences de x1 à x32. Je me souviens que lorsque je devais rendre tous mes modules au format .WAV pour un CD, je devais essayer les valeurs du gain jusqu'à ce que je trouve le plus bas qui ne provoque pas l'écrêtage ...
pichenettes
2
En ce qui concerne le niveau d'atténuation, au cas où vous ne pouvez pas avoir un utilisateur dans la boucle; 1/32 est un niveau absolument sûr (pas d'écrêtage). En supposant que les canaux ne soient pas corrélés (ce qui n'est pas très vrai pour la musique - plus correct lorsque l'on mélange des ambiances d'arrière-plan), une valeur de 1 / sqrt (32) constituerait un bon compromis entre le volume et la probabilité d'écrêtage. La meilleure solution serait toujours d’utiliser 1/32, puis de post-traiter vos échantillons avec un compresseur dynamique.
Pichenettes
3
Ajouts. C'est ce que les mélangeurs matériels font de toute façon et c'est la façon dont les gens s'attendent à ce que les choses se comportent. Les mélangeurs au niveau du système clipsent simplement. Ce serait un gros problème si les pilotes système implémentaient tout type de traitement non linéaire - j'imagine qu'il est très pénible pour les ingénieurs en mastering d'essayer de déterminer s'ils entendent leur réglage de plug-in de compresseur ou un traitement dynamique au niveau du système. Le logiciel de production musicale offre une large palette de plug-ins de compression dynamique. Il appartient aux utilisateurs de s’assurer que leur mixage n’est pas compressé.
Pichenettes
16

La façon physiquement "correcte" de procéder consiste à additionner les échantillons. Toutefois, lorsque vous ajoutez deux échantillons arbitraires, la valeur obtenue peut atteindre le double de la valeur maximale. ... La solution naïve consiste à diviser par N, N étant le nombre de canaux mélangés.

Ce n'est pas la solution "naïve", c'est la seule solution. C'est ce que font tous les mélangeurs analogiques et numériques, parce que c'est ce que l'air fait et ce que fait votre cerveau.

Malheureusement, cela semble être une idée fausse commune, comme le montrent ces autres algorithmes de "mélange" (distorsion) non linéaires non linéaires:

La "division par N" s'appelle une marge ; la marge supplémentaire pour les pics alloués au-dessus du niveau RMS de la forme d'onde. La quantité de marge requise pour un signal est déterminée par le facteur de crête du signal . (La méconnaissance des niveaux des signaux numériques et de la marge de sécurité est probablement en partie responsable de la guerre de Loudness et d’ Elephunk .)

Dans le matériel analogique, la marge est peut-être de 20 dB. Dans un DSP matériel, le point fixe est souvent utilisé, avec une hauteur libre fixe; Le SigmaDSP d'AD , par exemple, a une marge de sécurité de 24 dB. Dans les logiciels informatiques, le traitement audio est généralement effectué en virgule flottante 32 bits, de sorte que la marge de sécurité est énorme.

Idéalement, vous n’auriez pas besoin de diviser par N du tout, mais simplement de faire la somme des signaux, car vos signaux ne seraient pas générés à 0 dBFS.

Notez que la plupart des signaux ne sont de toute façon pas corrélés, il est donc rare que tous les canaux d’un mélangeur interfèrent de manière constructive au même moment. Oui, le mélange de 10 ondes sinusoïdales identiques en phase augmenterait le niveau de crête de 10 fois (20 dB), mais le fait de mélanger 10 sources de bruit non cohérentes ne ferait qu'augmenter le niveau de crête de 3,2 fois (10 dB). Pour les signaux réels, la valeur sera comprise entre ces extrêmes.

Pour obtenir le signal mixé d'un DAC sans écrêtage, vous réduisez simplement le gain du mixage. Si vous souhaitez maintenir le niveau RMS du mixage élevé sans écrêter durement, vous devez appliquer un type de compression pour limiter les pics du signal, mais cela ne fait pas partie du mixage, il s'agit d'une étape distincte. Vous mélangez d'abord, avec suffisamment de marge, puis vous le soumettez ensuite à la compression de la plage dynamique ultérieurement, si vous le souhaitez.

endolithe
la source
1
Je comprends ces concepts, mais je ne suis pas sûr que ce soit tout à fait correct. Bien sûr, si j’ajoute une série d’échantillons de 16 bits, 32 bits me donnent une grande marge de manœuvre numérique. Mais je dois encore reproduire le mixage résultant à un volume normalisé sur un système de son réel. Je veux que deux canaux sonnent plus fort que chaque canal joué séparément, mais je ne veux pas d'écrêtage. Faire mes sommes en 32 ou même 64 bits ne m'aide pas. Je commence peut-être à répondre à ma propre question: les échantillons originaux devraient être normalisés à un niveau plus bas que l'amplitude maximale. Comme vous le suggérez, laissez un peu de marge de mixage.
Bryhoyt
3
@bryhoyt: Oui, mais vous devez également vous rappeler que les ondes sont rarement corrélées les unes aux autres. Par conséquent, la somme de 5 sons ne permet pas d'obtenir des pics cinq fois plus élevés.
endolith
1
Merci, @endolith, je suppose que cela est vraiment au cœur de tout cela et m’explique pourquoi ce problème n’est pas aussi grave que je le pensais au départ.
bryhoyt
Donc, si 10 sources non cohérentes donnent 10 dB, diviser par sqrt (nombre de sources) serait-il une heuristique raisonnable? Autrement dit, si vous avez 3 sources, additionnez-les et divisez-les par sqrt (3)? (désolé pour avoir commenté un ancien fil)
nerdfever.com
@ nerdfever.com C'est ainsi que les niveaux RMS se combinent, alors ... probablement?
endolith
6

la formule

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]ABgresult

Peut-être ceci:

g[je]=F(UNE[je]+B[je],g[je-1])

UPDATE: Comme suggéré par hotpaw2, vous pouvez retarder le signal d'entrée mais pas la suppression du gain. C'est ce qu'on appelle un "limiteur d'anticipation".

Bjorn Roche
la source
Par "AB" je veux dire "A * B". Je comprends que l’amplitude peut être positive ou négative. Vous avez raison, mon équation n'a pas beaucoup de sens pour une combinaison impliquant des amplitudes négatives.
Bryhoyt
Je dois mélanger 8 à 10 (N) ondes sinusales différentes. De manière empirique, je savais que la bonne valeur se situait autour de 0,3 ... 1 / √N me semble juste ... aucun lien avec pourquoi cette formule est-elle correcte?
Zibri le
5

L'une des façons de procéder consiste à utiliser un CAG d'anticipation dans le cas d'un mixage en temps non réel, dans lequel le gain d'un canal ou des deux canaux est réduit à un taux difficile à percevoir avant que l'amplitude de la somme ne dépasse la limite de saturation. Moins il y a d'anticipation disponible, soit le réglage du gain de l'AGC devient plus audible, soit le gain maximal pour une rampe de réglage de gain plus faible se rapproche de plus en plus de 0,5 par canal à la limite. Pour les sources sonores avec une certaine prévisibilité, on pourrait également utiliser des statistiques concernant le comportement de l'enveloppe dans le temps pour deviner de manière adaptative une limite de gain, mais avec une certaine probabilité d'échec (ce qui constituerait un ajustement brutal du gain de la CAG).

hotpaw2
la source
Il s'agit d'un limiteur d'anticipation et non d'un AGC d'anticipation.
Bjorn Roche
2
@BjornRoche: Un limiteur ne peut-il pas être considéré comme un type de CAG?
endolith
Certains limiteurs sont des AGC, mais un limiteur d'anticipation n'est pas un AGC.
Bjorn Roche
1
@BjornRoche et bien c'est automatique et contrôle le gain ...
Olli Niemitalo
2

J'avais parlé à un concepteur de table de mixage de la fin des années 1990 et des premières années 2000 qui passait sur la vague numérique (après la pointe des pieds). Je pense que le gars était un designer pour SPL, mais peut-être pas si gros, je ne me souviens absolument pas du nom ni de la marque, je me souviens juste à quel point la machine était vraiment grosse et chère.

Nous avons longuement discuté et enfin parlé des techniques permettant de garantir que leurs canaux 64/128 @ 24bits mélangés restent un canal de sortie mélangé précis 24 bits sans écrêtage.

La technique qu'il a expliquée était plutôt simple. Les 64 pistes (sur 24 bits) ont été ajoutées dans un canal de 48 bits, où l'écrêtage ne peut pas se produire. Tout droit.

Je ne peux pas dire comment ce signal a ensuite été dithered 48 à 24 bits. Peut-être que c'est là que les recettes de cuisine délicates sont appliquées.

Et il existe peut-être de nombreuses techniques pour y parvenir, surtout si elles sont effectuées en temps réel ou avec tous les signaux déjà enregistrés avec des pics élevés simples à déterminer ... toutes sortes de normalisations à imaginer, je pense.

Stéphane Rolland
la source
2

Réduisez le volume global. Le suiveur d’impulsions produit par défaut des canaux à un volume d’environ 33% maximum.

Cela semble être à la fois suffisamment fort pour une musique comportant peu de canaux (MOD Amiga à 4 canaux) et suffisamment souple pour des chansons comportant 50 canaux (étant donné que le contenu des canaux n'est généralement pas corrélé, le volume n'augmente pas aussi rapidement qu'un certain niveau ... plus quelques canaux produiront au volume maximum avec autant de choses à faire). Il laisse également assez de marge pour les canaux panoramiques gauche / droit (qui utilisent 66% de la gamme).

Aussi, vous ne voulez pas ajouter vos canaux ensemble sur 16 bits, vous voulez les ajouter ensemble sur 32 bits, puis coupez le résultat et réduisez-le à 16 bits à la fin. Vous aurez besoin de la plage la plus haute pour qu’elle ne s’emballe pas pendant que vous calculez. Une autre option consiste à utiliser une virgule flottante 32 bits (ce qui est pratique pour faire des filtres, des effets, etc.).

Hubert Lamontagne
la source
0

Je pense que la clé est que, si vous avez des valeurs de 16 bits et que vous ajoutez 2 valeurs ensemble qui pourraient potentiellement être plus que la valeur maximale, vous avez 2 options:

1) convertissez les deux en 32 bits add puis renvoyez la valeur maximale si l'addition dépasse cette valeur. Puis remettez-le en 16 bits. Par exemple, si vos valeurs sont 32768 et 34567, il dépasse 65535 et la clé doit ensuite renvoyer 65535. Vous feriez la même chose si vous utilisiez des valeurs signées à la fin de la valeur minimale.

2) compresser les deux valeurs, puis les additionner.

La première est essentiellement une coupure dure, la seconde est une coupure douce. Les systèmes analogiques sont tous très durs.

Wogster
la source
0

Elles ne feront que doubler l’espace si les fréquences des deux pistes occupent la même fréquence spatiale. Utilisez eq et la compression pour contourner ce problème en découpant des zones du spectre des fréquences pour chaque son et en contrôlant les transitoires et les sons de manière à ce que tout soit à l'endroit où il convient. Peut-être que cela ne répond pas à la question si. Vous pouvez retarder les signaux de fréquence inférieure de 2 ms maximum. Il n'annulera pas phase par phase car les longueurs d'onde sont plus longues que les fréquences plus élevées et cela ajoutera de l'espace car les transitoires ne sont pas complètement synchronisés avec les signaux graves gourmands en énergie. Quelque chose ajoutant linéairement plus de retard au plus bas du signal serait intéressant de tester.

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

En d’autres termes, si A et B partagent un signe, appliquez un décalage limitant. L'amplitude du décalage est le produit de A et B. La direction du décalage est opposée à celle de A et B.

Si A et B ne partagent pas un signe, aucune limite n'est appliquée car il n'y a aucun moyen de déborder.

Rich Remer
la source
Notez que ce n'est pas commutatif. Si vous voulez mixer plus de 2 voix, vous devez les mélanger toutes en même temps. Dans ce cas, vous devriez "tout aplatir" dans une direction (si vous êtes trop haut, aplatissez les valeurs positives avec les valeurs négatives; si vous êtes trop bas, aplatissez les valeurs négatives avec les valeurs positives). Une fois que vous avez pris en compte le décalage (appliqué proportionnellement aux valeurs restantes); utilisez l'approche binaire, mais mettez le limiteur à l'échelle en fonction du nombre de valeurs mélangées.
Rich Remer
-1

Ma suggestion:

  1. Convertissez le format audio de piste de point fixe 16 bits en point flottant 32 bits.
  2. Ajoutez la valeur d'échantillon actuelle de toutes les pistes à mixer.
  3. Ne fais rien d'autre.

L'utilisateur peut souhaiter traiter ce flux mélangé avec compression et / ou limitation avant le dithering et la reconversion au format à virgule fixe 16 bits (en supposant que cette conversion ... le mixage destiné aux ingénieurs en mastering reste généralement dans un format de résolution plus élevé).

Aaron Paon
la source
2
Bonjour et bienvenue sur DSP.se. Nous vous remercions d'avoir essayé de contribuer, mais je ne pense pas que cela réponde à la question du PO. Le PO n'a pas mentionné les "utilisateurs" de son système: il pourrait peut-être jouer seul ou écrire le programme en fonction d'exigences spécifiques. Je m'excuse de faire voter: je serai heureux de réviser mon vote si vous apportez une réponse plus précise. Prenez également soin de votre formatage: consultez la FAQ pour savoir comment écrire de bonnes réponses.
Pénélope