Summary: Nell'elaborazione di segnali catturati da sensori c'è necessità di effettuare alcune operazioni ricorrenti, quali il filtraggio o la sogliatura.
boolean acceso e due
soglie basso e alto:
if (acceso) {
if (signal < basso) {
// operazioni di spegnimento
acceso = false;
}
}
else //spento
if (signal > alto) {
// operazioni di accensione
acceso = true;
}
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;
void setup()
{
size(WIDTH, HEIGHT);
Minim.start(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);
level = int(in.left.level()*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 Minim
Minim.stop();
super.stop();
}
gDown, il cui valore (sempre minore di uno)
viene impostato in base al tempo desiderato di
smorzamento ed al frame rate. Lo smorzamento si
considera esaurito quando il segnale di ingresso viene
ad essere moltiplicato per 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;
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.start(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);
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();
}
OUT, queste letture saranno pesate per i
coefficienti del filtro, e il puntatore IN
coinciderà con il puntatore OUT.
a0 e a1. Più questi valori
sono vicini, maggiore è l'entità dello smoothing. Per
non 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;
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.start(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 Minim
Minim.stop();
super.stop();
}
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;
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.start(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 Minim
Minim.stop();
super.stop();
}
Comments, questions, feedback, criticisms?