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

y n a y n 1 1 a x n
è molto efficace come filtro di smoothing. E' importante mantenere la stabilità del filtro,cioè evitare che un segnale di ingresso limitato produca un'uscita illimitata. Nel caso del filtro ricorsivo del primoordine, ciò è garantito se a 1 . Lo smoothing del segnale è giocoforza accompagnato da una certa latenza. Un segnale a gradino presentato iningresso provoca in uscita un segnale che raggiungeasintoticamente il livello del gradino. Nel caso del filtro ricorsivo del primo ordine, la transizione è tanto più lentaquanto più a è prossimo a 1 . Per la precisione, il numero di campioni necessari per raggiungere il 99 per centodel valore finale è pari a n -2 10 logbase --> a . Ad esempio, con a 0.9 la transizione dura circa 44 campioni. Naturalmente, la relazione a 10 -2 n consente di ricavare il valore del coefficiente che consente una transizione in n campioni. Tale formula è stata usata anche per impostare i tempi di apertura e chiusura del noise gate .

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 .

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Programmazione di artefatti interattivi. OpenStax CNX. Dec 09, 2010 Download for free at http://cnx.org/content/col10417/1.9
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?

Ask