Algorithme De Réverbération

je suis à la recherche d'un algorithme de réverbération simple ou commenté, même en pseudocode pourrait aider beaucoup.

j'ai trouvé un couple, mais le code a tendance à être plutôt ésotérique et difficile à suivre.

27
demandé sur Sam 2011-03-16 01:45:38

4 réponses

Voici une implémentation très simple d'une "ligne de retard" qui produira un effet de réverbération dans un tableau existant (C#,buffershort[]):

int delayMilliseconds = 500; // half a second
int delaySamples = 
    (int)((float)delayMilliseconds * 44.1f); // assumes 44100 Hz sample rate
float decay = 0.5f;
for (int i = 0; i < buffer.length - delaySamples; i++)
{
    // WARNING: overflow potential
    buffer[i + delaySamples] += (short)((float)buffer[i] * decay);
}

en gros, vous prenez la valeur de chaque échantillon, vous la multipliez par le paramètre de désintégration et vous ajoutez le résultat à la valeur dans le tampon delaySamples loin.

cela produira un véritable effet de "réverbération", car chaque son sera entendu plusieurs fois avec une amplitude Décroissante. Pour obtenir un simple effet d'écho (où chaque son est répété qu'une seule fois) vous utilisez essentiellement le même code, uniquement exécuter l' for boucle à l'envers.

mise à Jour: le mot "reverb" dans ce contexte a deux usages communs. Mon exemple de code ci-dessus produit un effet de réverbération classique courant dans les dessins animés, alors que dans une application musicale, le terme est utilisé pour signifier la réverbération, ou plus généralement la création d'effets spatiaux artificiels.

une grande raison la littérature sur la réverbération est si difficile à comprendre est que la création d'un bon effet spatial nécessite des algorithmes beaucoup plus compliqués que ma méthode d'échantillonnage ici. Cependant, la plupart des effets spatiaux électroniques sont construits à l'aide de plusieurs lignes de retard, de sorte que cet échantillon illustre, espérons-le, les bases de ce qui se passe. Pour produire un très bon effet, vous pouvez (ou devriez) brouiller la sortie de la réverbération en utilisant FFT ou même un simple flou.

mise à Jour 2: voici quelques conseils pour la reverb multi-delay-line design:

  • choisissez des valeurs de retard qui n'interfèrent pas positivement entre elles (au sens d'onde). Par exemple, si vous avez un retard à 500m et une seconde à 250m, il y aura de nombreux points qui ont des échos des deux lignes, produisant un effet irréaliste. Il est courant de multiplier un retard de base par différents nombres premiers afin de s'assurer que ce chevauchement n'arrive pas.

  • Dans une grande salle (dans le monde réel), lorsque vous faites un bruit vous aurez tendance à entendre quelques échos aigus immédiats (quelques millisecondes) qui sont relativement non déformés, suivis d'un plus grand, plus faible "nuage" d'échos. Vous pouvez obtenir cet effet à moindre coût en utilisant quelques lignes de retard à l'envers pour créer les échos initiaux et quelques lignes de réverbération complètes plus un peu de flou pour créer le "nuage".

  • absolu et j'ai presque l'impression que je ne veux pas abandonner celui-ci, mais qu'est-ce que la l'enfer) ne fonctionne que si votre son est en stéréo. Si vous modifiez légèrement les paramètres de vos lignes de retard entre les canaux de gauche et de droite (par exemple 490ms pour le canal de gauche et 513ms pour le canal de droite, ou .273 décroissance pour la gauche et .2631 pour la droite), vous produirez une réverbération beaucoup plus réaliste.

38
répondu MusiGenesis 2011-03-15 23:26:05

les réverbères numériques ont généralement deux saveurs.

  • Réverbérations À Convolution généralement travailler par convolution réponse d'impulsion et un signal d'entrée. La réponse d'impulsion est normalement un enregistrement d'une pièce réelle ou d'une autre source de réverbération. Le caractère de la réverbération est défini par la réponse d'impulsion. En tant que telle, Les réverbères de convolution fournissent habituellement des moyens limités d'ajuster le caractère de réverbération.

  • Reverbs Algorithmiques imiter la réverbération avec un réseau de délais, de filtres et de rétroaction. Différents systèmes combineront ces éléments de base de différentes manières. Une grande partie de l'art consiste à savoir comment adapter le réseau. Algorithmique réverbérations généralement exposer plusieurs paramètres pour l'utilisateur final, donc, la réverbération peut être ajusté pour s'adapter.

Le "Un Peu De Réverbération" post au EarLevel est un grand introduction sur le sujet. Il explique les différences entre la convolution et les reverbs algorithmiques et montre quelques détails sur la façon dont chacun pourrait être mis en œuvre.

Traitement Du Signal Audio Physique par Julius O. Smith a un chapitre sur les algorithmes de réverbération, y compris une section dédiée à la Freeverb algorithme. Survoler cela pourrait aider à chercher des exemples de code source.

Sean Costello Valhalla blog est plein de intéressant de réverbération de tidbits.

22
répondu Shannon 2016-08-31 10:43:32

ce dont vous avez besoin est la réponse d'impulsion de la pièce ou de la chambre de réverbération que vous voulez modéliser ou simuler. La réponse d'impulsion complète inclura tous les échos multiples et multi-chemins. La longueur de la réponse d'impulsion sera à peu près égale à la longueur de temps (dans les échantillons) qu'il faut pour qu'un son d'impulsion se décompose complètement en dessous du seuil sonore ou d'un niveau sonore donné.

étant donné un vecteur d'impulsion de longueur N, Vous pouvez produire un échantillon de sortie audio par vecteur multiplication du vecteur d'entrée (composé de l'échantillon d'entrée audio en cours concaténé avec les échantillons D'entrée N-1 précédents) par le vecteur d'impulsion, avec mise à l'échelle appropriée.

certaines personnes simplifient cela en supposant que la plupart des taps (sauf 1) dans la réponse d'impulsion sont à zéro, et en utilisant seulement quelques lignes de retard graduées pour les échos restants qui sont ensuite ajoutés dans la sortie.

pour une reverb encore plus réaliste, vous pourriez vouloir utiliser des réponses d'impulsion différentes pour chaque oreille, et avoir la réponse varient un peu avec la position de la tête. Un mouvement de la tête aussi faible qu'un quart de pouce peut faire varier la position des pics dans la réponse d'impulsion de 1 échantillon (à des vitesses de 44,1 k).

5
répondu hotpaw2 2011-03-16 00:28:30

Vous pouvez utiliser GVerb. Obtenez le code de ici.GVerb est un LADSPA plug-in, vous pouvez aller de l' ici si vous voulez en savoir plus sur LADSPA.

Ici est le wiki pour GVerb, y compris l'explication des paramètres et certains paramètres de réverbération instantanée.

nous pouvons aussi l'utiliser directement dans Objc:

ty_gverb        *_verb;
_verb = gverb_new(16000.f, 41.f, 40.0f, 7.0f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f);
AudioSampleType *samples = (AudioSampleType*)dataBuffer.mBuffers[0].mData;//Audio Data from AudioUnit Render or ExtAuidoFileReader
float lval,rval;
for (int i = 0; i< fileLengthFrames; i++) {
     float value = (float)samples[i] / 32768.f;//from SInt16 to float
     gverb_do(_verb, value, &lval, &rval);
     samples[i] =  (SInt16)(lval * 32767.f);//float to SInt16
}

GVerb est un effet mono mais si vous voulez un effet stéréo vous pouvez exécuter chaque canal à travers l'effet séparément et puis la casserole et mélanger les signaux traités avec le sèche signaux requis

1
répondu Joe Qian 2012-12-26 04:35:42