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 160. 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

; by Menno Knevel - 2021

ires1 system_i 1,{{ cvanal rv_mono.wav rv_mono.con }}  ; analyze mono spring reverb
ires2 system_i 1,{{ cvanal rv_stereo.wav rv_stereo.con }} ; analyze stereo spring reverb

instr 1 

imix = 0.25	;wet/dry mix. Vary as desired.
ivol = .8 	;Overall volume level of reverb. Adjust to avoid clipping.

idel   filelen p4			;calculate length and number of channels of soundfile
ichnls filenchnls  p4
prints	"\n**this reverb file = %f seconds and has %d channel(s)**\n", idel, ichnls

if (ichnls == 1) then					; if mono
	adry    soundin "fox.wav"               ; input (dry) audio
	awet    convolve adry,"rv_mono.con"	; mono convolved (wet) audio
	awet1   diff    awet                    ; brighten sound
	awet2	=	awet1						; as it is a mono file played stereo
	adrydel delay   (1-imix)*adry, idel	; Delay dry signal to align it with convolved signal
else									; if stereo
	adry    soundin "fox.wav"               ; input (dry) audio
	awet1, awet2 convolve adry,"rv_stereo.con" ; stereo convolved (wet) audio
	awet1   diff    awet1                   ; brighten left sound
	awet2   diff    awet2                   ; and brighten right sound
	adrydel delay   (1-imix)*adry, idel     ; Delay dry signal to align it with convolved signal
endif
outs    ivol*(adrydel+imix*awet1),ivol*(adrydel+imix*awet2) ; Mix wet & dry signals

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