<< Chapter < Page | Chapter >> Page > |
Si modifichi il codice di [link] in modo da ottenere la curva di livello di un noise gate . Quando il livello scende al di sotto della soglia verde, si applica uno smorzamento che gradualmenteforza il segnale ad essere inudibile. Quando il livello supera la soglia rossa, si applica una amplificazione cheriporta il segnale al livello originale.
Nella soluzione seguente il segnale viene abbattuto,
quando scende al di sotto della soglia inferiore,mediante moltiplicazioni successive per un coefficiente
gDown
, il cui valore (sempre minore di uno)
viene impostato in base al tempo desiderato dismorzamento ed al frame rate. Lo smorzamento si
considera esaurito quando il segnale di ingresso vienead essere moltiplicato per
. Analogamente, al superamento della soglia
superiore, il moltiplicatore viene riportato a unomediante moltiplicazioni successive per il coefficiente
gUp
, di valore sempre maggiore di uno.
import ddf.minim.*;AudioInput in;
int WIDTH=400, HEIGHT=200;
int x;int level, prevLevel, levelG;
color colorLine=color(0,255,0);boolean acceso=false;
int basso=30;int alto=50;
float damp=1.0;float gain = 1.0;
Minim minim;float decayTime = 10.0; // in seconds
float raiseTime = 2.0;float gDown = pow(10,-2/frameRate/decayTime);
float gUp = pow(10,2/frameRate/raiseTime);void setup(){
println("gDown = " + gDown + "gUp = " + gUp);size(WIDTH, HEIGHT);
minim = new Minim(this);// get a line-in from Minim: mono, 512 sample buffer
// default sampling rate is 44100, default bit-depth is 16in = minim.getLineIn(Minim.MONO, 512);}void draw()
{if (x==0) {
background(0);stroke(255,0,0); line(0,HEIGHT-alto,WIDTH,HEIGHT-alto);
stroke(0,255,0); line(0,HEIGHT-basso,WIDTH,HEIGHT-basso);}
stroke(colorLine);level = int(in.left.level()*HEIGHT);
gain = gain*damp;//println(gain);
if (gain>1.0) gain = 1.0;
if (gain<0.01) gain = 0.01;
levelG = int(level*gain);line(x, HEIGHT - prevLevel, (x+1)%WIDTH, HEIGHT - levelG);
x = (x+1)%WIDTH;prevLevel = levelG;
if (acceso) {if (level<basso) {
colorLine = color(0, 255, 0);damp = gDown;
acceso = false;}
}else //spento
{if (level>alto) {
colorLine = color(255, 0, 0);damp = gUp;
acceso = true;}
}}void stop()
{// always stop Minim
minim.stop();super.stop();
}
Gli esempi di sogliatura, isteresi, e gating visti nel caso dell'elaborazione del segnale audio sono di utilità generale per qualsiasiflusso di segnale proveniente da un sensore e, in particolare, anche nell'elaborazione di segnale video.
Nella maggior parte delle applicazioni che trattano flussi di
segnale provenienti da sensori, c'è la necessità di addolcire(
smoothing ) il profilo dei segnali
stessi, in modo da evitare picchi improvvisi e rumore a rapidavariabilità. Ciò si può fare con i
filtri .
Il più semplice filtro di smoothing è il
filtro di media , il quale
restituisce ad ogni istante il valor medio tra due campionitemporalmente contigui del segnale di ingresso. Interpretando
i segnali nel dominio delle frequenze, l'operazione dismoothing corrisponde ad un filtraggio passa-basso, cioè ad
una attenuazione delle frequenze elevate. Infatti, levariazioni repentine corrispondono a componenti di frequenza
elevata.Le capacità di smoothing del filtro di media sono limitate, e
per ottenere degli smoothing più decisi (maggiore attenuazionedelle alte frequenze) bisogna fare medie pesate di un numero
maggiore di campioni del segnale di ingresso. Un filtro moltoutile allo scopo è il
filtro del secondo ordine simmetrico .
Qualunque sia l'ordine del filtro, la sua realizzazione comemedia pesata di campioni del segnale di ingresso può essere
effettuata convenientemente appoggiandosi alla realizzazione a
buffer
circolare . In questo caso, la lettura avverrà da un
certo numero di celle contigue a quella puntata da
OUT
, queste letture saranno pesate per i
coefficienti del filtro, e il puntatore
IN
coinciderà con il puntatore
OUT
.
Notification Switch
Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?