convolve
Précédent | Opcodes et opérateurs de l'orchestre | Suivant

## convolve

convolve — Convolution d'un signal par une réponse impulsionnelle.

## Description

La sortie est le produit de convolution du signal ain par la réponse impulsionnelle contenue dans ifilcod. S'il y a plus d'un signal de sortie, chacun sera obtenu par convolution avec la même réponse impulsionnelle. Noter qu'il est considérablement plus efficace d'utiliser une instance de l'opérateur lorsque l'on traite une entrée mono pour créer des sorties stéréo ou quadraphoniques.

Note : cet opcode peut aussi s'écrire convle.

## Syntaxe

    ar1 [, ar2] [, ar3] [, ar4] convolve ain, ifilcod [, ichannel]

## Initialisation

ifilcod -- entier ou chaîne de caractères définissant un fichier de données contenant une réponse impulsionnelle. Un entier définit le suffixe d'un fichier convolve.m ; une chaîne de caractères (entre guillemets) donne un nom de fichier, éventuellement un nom de chemin complet. Si ce n'est pas un nom de chemin complet, le fichier est d'abord cherché dans le répertoire courant, puis dans celui qui est donné par la variable d'environnement SADIR (si elle est définie). Le fichier de données contient la transformée de Fourier d'une réponse impulsionnelle. L'occupation mémoire dépend de la taille du fichier de données qui est lu en entier et gardé en mémoire durant le calcul, mais qui est partagé par des appels multiples.

ichannel (facultatif) -- quel canal du fichier de données de la réponse impulsionnelle utiliser.

## Exécution

ain -- signal audio en entrée.

convolve implémente la convolution rapide. Le sortie de cet opérateur est retardée en fonction de l'entrée. On peut calculer le délai avec les formules suivantes :

      Pour (1/kr) <= IRdur:
              Delay = ceil(IRdur * kr) / kr
      Pour (1/kr) > IRdur:
              Delay = IRdur * ceil(1/(kr*IRdur))
      Où :
              kr  = taux de contrôle de Csound
              IRdur = durée, en secondes, de la réponse impulsionnelle
              ceil(n) = le plus petit entier qui n'est pas inférieur à n

Il faut également faire attention à prendre en compte le délai initial, s'il y en a un, de la réponse impulsionnelle. Par exemple, si une réponse impulsionnelle est créée à partir d'un enregistrement, le fichier son peut ne pas avoir de délai initial. Il faut ainsi soit s'assurer que le fichier son a la quantité correcte de zéro de remplissage au début, soit, de préférence compenser ce retard dans l'orchestre (cette dernière méthode étant plus efficace). Pour compenser le délai dans l'orchestre, il faut soustraire le délai initial du résultat calculé au moyen des formules ci-dessus, lorsque l'on calcule le délai requis à introduire dans la passe audio non "réverbérée".

Pour des applications typiques telles que la réverbération, le délai sera de l'ordre de 0.5 à 1.5 secondes, ou même plus long. Cela rend cette implémentation impropre aux applications en temps réel. Il est cependant concevable de l'utiliser pour du filtrage en temps réel, si le nombre de points de lecture est suffisamment petit.

L'auteur a l'intention de créer un opérateur de plus haut niveau qui mélangera le signal original et le signal réverbéré, en utilisant automatiquement la bonne quantité de délai.

## Exemples

Créer le fichier de réponse impulsionnelle dans le domaine fréquentiel au moyen de l'utilitaire cvanal utility :

    csound -Ucvanal l1_44.wav l1_44.cv

Déterminer la durée de la réponse impulsionnelle. Pour une grande précision, déterminer le nombre de trames d'échantillon dans le fichier de la réponse impulsionnelle, puis calculer la durée avec :

durée = (trames d'échantillons)/(taux d'échantillonnage du fichier son)

Cela est du au fait que l'utilitaire sndinfo ne fournit la durée arrondie qu'au 10 ms les plus proches. Si l'on dispose d'un utilitaire qui fournit la durée avec la précision requise, alors il suffit d'utiliser directement la valeur retournée.

    sndinfo l1_44.wav

length = 60822 samples, sample rate = 44100
Duration = 60822/44100 = 1.379s.

Déterminer le délai initial, s'il existe, de la réponse impulsionnelle. Si le délai initial de la réponse impulsionnelle n'a pas été enlevé, alors on peut ignorer cette étape. S'il a été enlevé, la seule manière de connaître le délai initial est de se procurer l'information séparément. Pour cet exemple, on suppose que le délai initial est de 60 ms (0.06 s).

Déterminer le délai qu'il faut nécessairement appliqué au signal original pour l'aligner sur le signal convolué :

Si kr = 441:
1/kr = 0.0023, qui est <= IRdur (1.379s), ainsi :
Delay1 = ceil(IRdur * kr) / kr
= ceil(608.14) / 441
= 609/441
= 1.38s

En prenant comme délai initial :
Delay2 = 0.06s
Total delay = delay1 - delay2
= 1.38 - 0.06
= 1.32s

Voici un exemple similaire de l'opcode convolve. Il utilise le fichier convolve.csd.

Exemple 156. Exemple de l'opcode convolve.

Voir les sections Audio en Temps Réel et Options de la Ligne de Commande pour plus d'information sur l'utilisation des options de la ligne de commande.

    <CsoundSynthesizer>
    <CsOptions>
    ; Select audio/midi flags here according to platform
    ;-odac     ;;;RT audio out
    -iadc    ;;;uncomment -iadc if RT audio input is needed too
    ; For Non-realtime ouput leave only the line below:
    ;-o convolve.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>
    ; NB: 'Small' reverbs often require a much higher
    ; percentage of wet signal to sound interesting. 'Large'
    ; reverbs seem require less. Experiment! The wet/dry mix is
    ; very important - a small change can make a large difference.

    sr = 44100
    ksmps = 32
    nchnls = 2
    0dbfs = 1
    ;The analysis file is not system independent!
    ; create "rv_mono.wav" and "rv_stereo.wav" with cvanal first!

    instr 1

    imix = 0.25	;wet/dry mix. Vary as desired.
    ivol = 1 	;Overall volume level of reverb. May need to adjust
    ;when wet/dry mix is changed, to avoid clipping.

    idel   filelen p4			;calculate length and number of channels of soundfile
    print  idel
    ichnls filenchnls  p4
    print  ichnls

    if (ichnls == 1) then

    adry    soundin "fox.wav"               ; input (dry) audio
    awet    convolve adry,"rv_mono.cva"	; mono convolved (wet) audio
    awet    diff    awet                    ; brighten
    adrydel delay   (1-imix)*adry, idel	; Delay dry signal to align it with convolved signal
    					; Apply level adjustment here too.
    outs    ivol*(adrydel+imix*awet),ivol*(adrydel+imix*awet) ; Mix wet & dry

    else

    adry    soundin "fox.wav"               ; input (dry) audio
    awet1, awet2 convolve adry,"rv_stereo.cva" ; stereo convolved (wet) audio
    awet1   diff    awet1                   ; brighten left
    awet2   diff    awet2                   ; and brighten right
    adrydel delay   (1-imix)*adry, idel     ; Delay dry signal to align it with convolved signal
    					; Apply level adjustment here too.
    outs    ivol*(adrydel+imix*awet1),ivol*(adrydel+imix*awet2) ; Mix wet & dry signals

    endif

    endin

    </CsInstruments>
    <CsScore>

    i 1 0 4 "rv_mono.wav"
    i 1 5 4 "rv_stereo.wav"

    e
    </CsScore>
    </CsoundSynthesizer>

## Voir aussi

pconvolve, dconv, cvanal.

## Crédits

Auteur : Greg Sullivan

1996

Nouveau dans la version 3.28

Précédent | Niveau supérieur | Suivant
convle | Sommaire | copya2ftab