Algorithme pour mixer le son
J'ai deux premières des flux audio que j'ai besoin d'ajouter de l'ensemble. Pour les fins de cette question, on peut supposer qu'ils sont le même débit et la profondeur de bits (disons 16 bits de l'échantillon, taux d'échantillonnage 44,1 khz).
Évidemment, si je viens de les ajouter ensemble, je débordement et underflow mes 16 bits espace. Si je les additionner et de les diviser par deux, puis le volume de chacun est réduite de moitié, ce qui n'est pas correct sur le plan sonore - si deux personnes s'exprimant dans une salle de, leurs voix ne deviennent pas plus de la moitié, et d'un microphone peut les ramasser à la fois de haut sans toucher le limiteur.
- Quelle est donc la bonne méthode pour ajouter ces sons dans mon logiciel de mixage?
- Je me trompe et que la bonne méthode est de réduire le volume de chacun par moitié?
- J'ai besoin d'ajouter un compresseur/limiteur ou une autre étape de traitement pour obtenir le volume et effet de mélange je suis en train de?
-Adam
- Même question, mais de la meilleure des réponses: dsp.stackexchange.com/questions/3581/...
- J'ai été vraiment déçu par cette. Dans la vraie vie, j'entends à la fois les signaux de n'importe quelle phase ils sont. Mais simplement en ajoutant les échantillons de deux phase inversée les ondes de résultat dans le silence le plus complet. Pas une mention de celui-ci...
- L'annulation de Phase est réel. Mettre deux haut-parleurs à côté de l'autre, et d'inverser la phase d'un (permuter les fils). Votre contrebasse devient saccagé. La raison pour laquelle vous n'obtenez pas l'annulation complète est que vos haut-parleurs ne sont pas les sources ponctuelles et que vous avez deux oreilles.
- Je sais, je sais... encore, lorsque les gens entendent "mixage audio" ils n'attendent pas de deux sons à cancelate les uns des autres en fonction de la phase, ce qui entraîne en silence.
- Et je ne veux pas deux instruments ont des fréquences annulée selon une "chance" pour eux d'être en phase inversée.
Vous devez vous connecter pour publier un commentaire.
Vous devez les ajouter ensemble, mais le clip le résultat de la plage autorisée pour empêcher plus de/underflow.
Dans le cas de l'écrêtage produit, vous sera introduire de distorsion dans l'audio, mais qui est inévitable. Vous pouvez utiliser votre écrêtage de code de "détecter" de cette condition et de signaler à l'utilisateur/opérateur (l'équivalent de rouge 'clip' la lumière sur une table de mixage...)
Vous pourriez mettre en œuvre un "bon" d'un compresseur/limiteur, mais sans en connaître les dates exactes de votre application, il est difficile de dire si il vaudrait la peine.
Si vous êtes en train de faire beaucoup de traitement audio, vous pouvez représenter vos niveaux audio comme des valeurs à virgule flottante, et seulement revenir à la 16-bits de l'espace à la fin du processus. Audio numérique souvent, les systèmes fonctionnent de cette manière.
Je préfère le commentaire sur l'un des deux hautement classé les réponses, mais en raison de ma maigre réputation (je suppose) je ne peux pas.
La "coché l'option" réponse: ajouter ensemble, et le clip est correct, mais pas si vous voulez éviter l'écrêtage.
La réponse avec le lien commence par une pratique vaudou algorithme pour deux signaux positifs dans [0,1] mais alors, s'applique à certains très défectueux de l'algèbre de dériver complètement incorrect algorithme pour la signature de valeurs et de 8-bits. L'algorithme n'a pas aussi échelle à trois ou plus de facteurs de production (le produit des signaux vont baisser alors que la somme augmente).
Afin de convertir les signaux d'entrée à flotteur, la mise à l'échelle de [0,1] (par exemple, Un signé de 16 bits valeur deviendrait
float v = ( s + 32767.0 ) /65536.0 (close enough...))
puis additionner entre eux.
À l'échelle de l'signaux d'entrée que vous devriez faire un travail plutôt que de multiplier par ou de soustraire un vaudou valeur. Je vous suggère de garder un moyen en volume et puis si on commence à dériver de haut (au-dessus de 0,25 dire) ou faible (en dessous de 0.01 dire) démarrez l'application d'une échelle de valeur en fonction du volume. Essentiellement, cela devient automatiquement un niveau de mise en œuvre, et s'adapte avec n'importe quel nombre d'entrées. Le meilleur de tous, dans la plupart des cas, il ne jouez pas avec votre signal.
Il y a un article sur le mélange ici. Je serais intéressé de savoir ce que les autres pensent à ce sujet.
La plupart des applications de mixage audio se font de leur mélange avec des nombres à virgule flottante (32 bits est beaucoup assez bon pour le mélange d'un petit nombre de cours d'eau). Traduire les 16 bits d'échantillons dans les nombres à virgule flottante avec la gamme de -1.0 1.0 représentant la pleine échelle dans les 16 bits du monde. Ensuite, la somme des échantillons - vous avez maintenant beaucoup de marge. Enfin, si vous vous retrouvez avec des échantillons dont la valeur va au-dessus de la pleine échelle, vous pouvez atténuer la totalité du signal ou de l'utilisation de la limitation (écrêtage des valeurs à 1.0).
Cela va donner beaucoup de meilleurs résultats sonores que l'ajout de 16 bits des échantillons et de les laisser déborder. Voici un simple exemple de code montrant comment vous pourriez somme de deux 16 bits des échantillons:
"Plus de la moitié" n'est pas tout à fait correct. En raison de l'oreille de la réponse logarithmique, en divisant les échantillons dans la moitié va faire 6 db plus silencieux - certainement sensible, mais pas catastrophique.
Vous pourriez vouloir faire des compromis en multipliant par 0,75. Qui va le faire à 3 db plus silencieux, mais va diminuer les chances de débordement et aussi de diminuer la distorsion quand ça arrive.
20 * log(1/sqrt(2)) = -3.0103
.Je ne peux pas croire que personne ne sait la réponse correcte. Tout le monde est assez proche, mais encore, une pure philosophie.
Le plus proche, c'est à dire le meilleur était:
(s1 + s2) -(s1 * s2).
C'est excellent, surtout pour les Mcu.
Donc, l'algorithme va:
Il peut être le moyen ou maxima de l'un des signaux.
factor = average(s1)
Vous supposez que les deux signaux sont déjà OK, ne déborde pas le 32767.0
s1 = (s1/max(s1))*factor
s2 = (s2/max(s2))*factor
output = ((s1+s2)/max(s1+s2))*factor
Noter que, après l'étape 1. vous n'avez pas vraiment besoin de tourner le dos à des entiers, vous pouvez travailler avec de flotteurs en -1.0 1.0 intervalle et d'appliquer le retour à des entiers, à la fin, avec la déjà choisi le facteur de puissance.
J'espère que je n'ai pas d'erreur maintenant, parce que je suis pressé.
Vous pouvez aussi vous acheter une hauteur avec un algorithme de type y= 1.1 x 0,2 x^3 pour la courbe, et avec un chapeau sur le haut et le bas. J'ai utilisé ce dans Hexaphone lorsque le joueur est de jouer plusieurs notes en même ensemble (jusqu'à 6).
Ce n'est pas à l'épreuve des balles - mais vous permettra d'obtenir jusqu'à 1,25 niveau, et adoucit le clip d'un jolie courbe. Produit de la distorsion harmonique, qui sonne mieux que le découpage et peut être souhaitable dans certaines circonstances.
convertir les échantillons de valeurs à virgule flottante allant de -1.0 à +1.0, puis:
Si vous avez besoin pour faire de ce droit, je suggère de regarder à l'open source logiciel de mixage implémentations, au moins pour la théorie.
Quelques liens:
Audacity
GStreamer
En fait, vous devriez probablement utiliser une bibliothèque.
Vous avez raison au sujet de l'ajout d'ensemble. Vous pouvez numériser la somme des deux fichiers pour le maximum de points, et l'échelle de l'ensemble du fichier si ils ont frappé une sorte de seuil (ou si la moyenne d'elle et de ses environs spots atteint un seuil)
Je pense que, tant que les volets ne sont pas corrélés, vous ne devriez pas avoir trop à s'inquiéter, vous devriez être en mesure de s'en sortir avec l'écrêtage. Si vous êtes vraiment préoccupé par la distorsion dans le clip de points, un soft limiteur serait probablement OK.
Va introduire une distorsion lourde lorsque |s1 + s2| approche 1.0 (au moins quand je l'ai essayé lors du mélange de simples ondes sinusoïdales).
J'ai lu cette recommandation à plusieurs endroits, mais à mon humble avis, il est inutile d'approche.
Ce qui se passe physiquement, quand les ondes "mix", c'est que leur amplitutes ajouter, comme beaucoup d'affiches ici déjà suggéré.
Soit
J'ai fait de cette façon une fois: j'ai utilisé de la flotte (échantillons entre -1 et 1), et j'ai initialisé un "autoGain" variable avec une valeur de 1. Ensuite, je voudrais ajouter tous les échantillons (peut également être plus que 2). Alors je voudrais multiplier le signal sortant avec autoGain. Si la valeur absolue de la somme des signaux avant la multiplication serait supérieur à 1, je voudrais faire attribuer 1/cette somme de la valeur. Cela permettrait effectivement de faire autogain inférieure à 1 disons 0,7 et serait l'équivalent de certains opérateur tourne rapidement vers le bas le volume principal dès qu'il voit que l'ensemble du son est trop fort. Alors je voudrais sur une période réglable de temps, ajouter de l'autogain jusqu'à ce que finalement il serait de retour à "1" (notre opérateur a récupéré d'un choc, et est lentement démarrage le volume :-)).
Depuis votre profil indique que vous travaillez dans les systèmes embarqués, je vais supposer que les opérations à virgule flottante ne sont pas toujours une option.
Comme vous l'avez deviné, de l'ajout et de l'écrêtage est la bonne voie à suivre si vous ne voulez pas perdre de volume sur les sources. Avec des échantillons qui sont
int16_t
, vous avez besoin de la somme àint32_t
, puis de les limiter et de les convertir en arrière pourint16_t
.Oui. La réduction de moitié du volume est un peu subjectif, mais ce que vous pouvez voir ici et là, c'est que la réduction de moitié du volume (volume) est une diminution d'environ 10 dB (division de la puissance par 10, ou les valeurs de l'échantillon par 3.16). Mais tu veux dire, évidemment, à la baisse de la valeurs de l'échantillon de moitié. C'est une diminution de 6 dB, une réduction notable, mais pas autant que la réduction de moitié du volume (le volume de la table de il y est très utile).
Avec cette réduction de 6 dB vous permettra d'éviter tout écrêtage. Mais ce qui arrive quand vous voulez plus de canaux d'entrée? Pour quatre canaux, vous devez diviser les valeurs d'entrée par 4, c'est l'abaissement de 12 dB, ce qui va à moins que la moitié de l'intensité sonore de chaque canal.
Vous voulez mélanger, pas de clip, et ne pas perdre de l'intensité sonore sur les signaux d'entrée. Ce n'est pas possible, non sans une sorte de distorsion.
Comme suggéré par la Marque de Rançon, une solution pour éviter l'écrêtage tout en ne perdant pas autant de 6 dB par canal est de frapper quelque part entre les deux "ajout et clipping" et "moyenne".
Qui est de deux sources: l'ajout, en divisant par quelque part entre 1 et 2 (réduction de la gamme de [-65536, 65534] à quelque chose de plus petit), puis de les limiter.
Si vous souvent de la pince, avec cette solution, et il semble trop sévère, alors vous voudrez peut adoucir la limite du genou avec un compresseur. C'est un peu plus complexe, car vous avez besoin de faire le facteur de division dépend de la puissance d'entrée. Essayez le limiteur seule tout d'abord, et de considérer le compresseur uniquement si vous n'êtes pas heureux avec le résultat.
J'ai fait la chose suivante:
Multiplier la gauche, une marge de src par le MAX_VAL normalisé valeur de la destination et l'ajouter. Il ne sera jamais clip, jamais moins de bruit et le son tout à fait naturel.
Exemple:
Et ça a l'air bien 🙂
J'ai trouvé une nouvelle façon d'ajouter des échantillons de manière à ce qu'ils ne peuvent jamais dépasser un intervalle donné. L'Idée de base est de convertir des valeurs dans une plage allant de -1 à 1 à une plage comprise entre environ -l'Infini à +l'Infini, ajouter le tout et l'inverse de la première transformation. Je suis venu avec les formules suivantes pour ce:
Je l'ai essayé et il fonctionne, mais pour de multiples sons forts l'audio semble pire que simplement en ajoutant l'ensemble des échantillons, et le découpage de chaque valeur qui est trop grand. J'ai utilisé le code suivant pour tester ceci:
Merci à vous tous pour le partage de vos idées, récemment, j'ai aussi un travail lié à son mélange. Je suis aussi avoir fait l'expérimentation chose sur cette question, peut-il vous aider les gars :).
Noter que je suis en utilisant le taux d'échantillonnage 8 khz & 16 bits de l'échantillon (SInt16) son dans ios RemoteIO AudioUnit.
Le long de mes expériences, le meilleur résultat que j'ai trouvé était quelque chose de différent de tous cette réponse, mais la base est la même (Roddy suggérer)
"Vous devez les ajouter ensemble, mais le clip le résultat de la plage autorisée pour empêcher plus de/underflow".
Mais ce qui devrait être la meilleure façon d'ajouter sans débordement/dépassement de capacité ?
Idée clé: Vous avez deux ondes sonores dire A & B, et la résultante de la vague C, la superposition de deux de la vague A & B. l'Échantillon dans un nombre limité de bits de large peut provoquer un débordement. Ainsi, nous pouvons maintenant calculer la limite maximale de la croix à l'envers & de la limite minimale de la croix à la baisse de la superposition de l'onde. Maintenant, nous allons soustraire maximale envers la limite de la croix à la partie supérieure de la superposition de l'onde et l'ajouter minimum à la baisse de la limite de la croix à la partie inférieure de la superposition de l'onde. VOILA ... vous avez terminé.
Suit:
le code suivant va montrer la mise en œuvre.
il fonctionne très bien pour moi, j'ai l'intention progressivement modifier la valeur de upSideDownValue & downSideUpValue pour obtenir une puissance de sortie plus régulière.
Cette question est ancienne mais ici, c'est la validité de la méthode de l'OMI.
Vous pouvez faire les 2 premières étapes, mais avec le maximum et le minimum de normaliser dans une deuxième passe pour l'étape 3 et 4.
J'espère que cela aide quelqu'un.
Je dirais simplement les ajouter ensemble. Si vous êtes débordant votre PCM 16 bits espace, puis les sons que vous utilisez sont déjà incroyablement fort pour commencer avec, et vous devrait atténuer ces inconvénients. Si cela peut les amener à être trop mou par eux-mêmes, trouver une autre façon d'augmenter le volume général de sortie, comme un OS de réglage ou en tournant la molette sur vos haut-parleurs.