<< Menu Principal >>
Session 4 : Récursion, filtres IIR, écho et modélisation physique
Récursion en Faust
- La récursions en Faust peut être exprimée avec la composition recursive
~
.
- L’équation y(n) = x(n) + y(n − 1) peut être implémentée en Faust de la manière suivante :
process = +~_;
- L’expression à gauche de l’opérateur correspond au signal allant de gauche à droite dans le block diagramme et l’expression à droite au signal allant de droite à gauche.
- Ce type de construction peut permettre d’implémenter des compteurs :
process = _~+(1) : -(1);
produira un signal : y(n) = 0, 1, 2, 3, 4, ...
~
introduit automatiquement un retard d’un échantillon dans le signal de récursion. En effet, cela est nécessaire car il est impossible de résoudre l’équation : y(n) = x(n) + y(n) dans la mesure où la valeur de y(n) ne peut pas être connue à l’avance.
Filtre à un pole (one pole)
- Le filtre à un pole est le type de filtre récursif (IIR: Infinite Impulse Response) le plus simple. Son équation différentielle est : y(n) = x(n) − a1y(n − 1).
- a1 correspond au pole du filtre et peut avoir une valeur entre -1 (passe-bas) et 1 (passe-haut). En pratique, la valeur de a1 ne peut jamais atteindre -1 ou 1 car cela rendrait le filtre instable.
- Ce filtre peut être implémenté de manière simple en Faust :
import("stdfaust.lib");
onePole(a1) = +~*(a1);
pole = hslider("pole",0,-1,1,0.01);
process = no.noise : onePole(pole);
- Notez que la fonction
si.smooth
de Faust est basée sur une version normalisée de ce filtre :
smooth(s) = *(1.0 - s) : + ~ *(s);
Filtre en peigne récursif
import("stdfaust.lib");
fdbComb(del,a1) = +~de.delay(1024,del)*(a1);
d = hslider("delay",0,0,1023,1);
pole = hslider("pole",0,-1,1,0.01);
process = no.noise : fdbComb(d,pole);
- Ce type de filtre a un comportement similaire au filtre en peigne non-récursif étudié dans la session 3 à la différence que ces “lobes” ont un effet beaucoup plus agressif.
- A noter que le flanger de la session 3 peut être ré-implémenté en utilisant ce filtre en peigne récursif.
Echo
- Augmenter la durée du retard du filtre en peigne récursif de la section précédente a pour effet de le transformer en écho :
import("stdfaust.lib");
echo(duration,feedback) = +~de.delay(50000,del)*(feedback)
with{
del = duration*ma.SR;
};
instrument(repeat) = ba.pulsen(1,n) <: pm.djembe(50+rand*50,0.5,0.5,1)
with{
n = repeat*ma.SR;
rand(trig) = no.noise : ba.sAndH(trig : ba.impulsify);
};
d = hslider("duration",0.25,0,1,0.01);
f = hslider("feedback",0.5,0,1,0.01);
process = instrument(0.25) : echo(d,f);
- Notez qu’une durée en secondes (ds) peut être convertie en une durée en échantillons (dn) en utilisant le taux d’échantillonnage (fs) avec la formule suivante : dn = dsfs.
Un modèle physique simple : le Karplus-Strong
- Le Karplus-Strong est une forme primitive et simplifiée de modèle physique de corde par guide d’onde.
- La corde est implémentée avec un retard (plus le retard est long, plus la corde est longue).
- Les réflexions à ses extrémités sont produites grâce à la boucle (feedback).
- La dispersion aux extrémités est implémentée grâce à un filtre passe-bas permettant de simuler la disparition des fréquences hautes avant les fréquences basses.
- Une implémentation possible du Karplus-Strong en Faust peut prendre cette forme :
import("stdfaust.lib");
ks(freq,damp) = +~(de.fdelay4(1024,del) : dispersion)
with{
del = ma.SR/freq;
dispersion = _ <: _,_' :> /(2) : *(1-damp) ;
};
f = hslider("freq",300,50,2000,0.01);
d = hslider("damping",0.01,0,1,0.01);
gate = button("gate");
process = gate : ba.impulsify : ks(f,d);
- Notez l’utilisation d’un retard fractionnel permettant d’assurer la justesse de la corde.