<< Chapter < Page | Chapter >> Page > |
Si modifichi il codice di [link] pre-filtrando il segnale di livello con un filtro del secondo ordine simmetrico.
Nel codice qui proposto si possono sperimentare diversi
livelli di smoothing, variando i valori di
a0
e
a1
. Più questi valori
sono vicini, maggiore è l'entità dello smoothing. Pernon alterare con il filtraggio l'ampiezza generale del
segnale è opportuno che il doppio di
a0
,
sommato ad
a1
, dia come risultato
.
import ddf.minim.*;AudioInput in;
int WIDTH=400, HEIGHT=200;int x;
int level, prevLevel;color colorLine=color(0,255,0);
boolean acceso=false;int basso=80;
int alto=120;Minim minim;
float GAIN = 10;int BUFLEN = 5;
float[]buffer = new float[BUFLEN];int bufPoint=2, bufPoint1=1, bufPoint2=0;
float a0 = 0.3, a1 = 0.4; //smoothing//float a0 = 0, a1 = 1; // no smoothing
void setup(){
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 16
in = 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);
buffer[bufPoint]= in.left.level();
level = int((a0*buffer[bufPoint]+ a1*buffer[bufPoint1] + a0*buffer[bufPoint2])*GAIN*HEIGHT);
bufPoint = (bufPoint+1)%BUFLEN; bufPoint1 = (bufPoint1+1)%BUFLEN; bufPoint2 = (bufPoint2+1)%BUFLEN;line(x, HEIGHT - prevLevel, (x+1)%WIDTH, HEIGHT - level);
x = (x+1)%WIDTH;prevLevel = level;
if (acceso) {if (level<basso) {
colorLine = color(0, 255, 0);acceso = false;
}}
else //spento{
if (level>alto) {
colorLine = color(255, 0, 0);acceso = true;
}}
}void stop(){
// always stop Minimminim.stop();
super.stop();}
Come si può dedurre dalla sperimentazione proposta in [link] , prendendo medie pesate di pochi campioni di segnale l'effetto di smoothing non èmacroscopico. Per avere un filtraggio più radicale bisogna usare filtri di ordine elevato (elaborazione di molticampioni di segnale) ovvero ricorrere a filtri ricorsivi.
Un filtro è un oggetto che, preso un segnale di ingresso, produce un segnale di uscita. Quando la produzione di uncampione del segnale di uscita si ottiene elaborando campioni precedenti del segnale di uscita stesso (oltre che del segnaledi ingresso) si dice che il filtro è ricorsivo . La ricorsività consente filtraggi radicali a complessità modeste. Ad esempio,il filtro del primo ordine rappresentato dall'equazione alle differenze
Si modifichi il codice di [link] pre-filtrando il segnale di livello con un filtro ricorsivo del primo ordine.
Si provino diversi valori di
a
nel codice qui proposto, mantenendo il vincolo di stabilità.
import ddf.minim.*;AudioInput in;
int WIDTH=400, HEIGHT=200;int x;
int level, prevLevel;color colorLine=color(0,255,0);
boolean acceso=false;int basso=80;
int alto=120;Minim minim;
float GAIN = 10;float currentLev;
float prevLev = 0;float a = 0.95; // the closer to 1, the smoother the signal
void setup(){
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 16
in = 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);
currentLev = a*prevLev + (1 - a)*in.left.level();prevLev = currentLev;
level = int(currentLev*GAIN*HEIGHT);line(x, HEIGHT - prevLevel, (x+1)%WIDTH, HEIGHT - level);
x = (x+1)%WIDTH;prevLevel = level;
if (acceso) {if (level<basso) {
colorLine = color(0, 255, 0);acceso = false;
}}
else //spento{
if (level>alto) {
colorLine = color(255, 0, 0);acceso = true;
}}
}void stop(){
// always stop Minimminim.stop();
super.stop();}
Particolare importanza rivestono i filtri ricorsivi del secondo ordine , i quali fungono da modello per la realizzazioni dirisonanze. Una risonanza elementare si manifesta come oscillazione smorzata. Se i coefficienti del filtro delsecondo ordine sono opportunamente scelti in modo da produrre una risposta ai limiti della stabilità, quello che si ottieneè una realizzazione dell'oscillatore, alternativa a quelle proposte in oscillazioni, ritardi, e fluttuazioni del tempo .
Notification Switch
Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?