so, ich habe mal auf nem Arduino die Rauschglättung simuliert (geht dort einfacher mit Grafik etc):
Simulations-Code (automatische Erkennung der Rauschbandbreite) :
Code:
// ver 0005
void arrayinit(int16_t * array, int16_t arrlen) {
char sbuf[128];
int16_t bias, minr, maxr, baseline;
// simulated noisy word-command or signal
for (int i=0; i<arrlen; ++i) {
array[i] = 128 + random(10)- 5; // simulated noise +/- 5;
}
for (int i=33; i<arrlen-101; ++i) { // simulated word/signal +/- 100
array[i] = 128 + random(200) - 100;
}
curlf();
sprintf(sbuf, "arrayinit[0] vorher %d ", array[0] );
Serial.println(sbuf);
lcdprint(sbuf);
// calculate baseline from last 100 array cells:
//init
baseline=array[arrlen-90];
minr=array[arrlen-90]-1;
maxr=array[arrlen-90]+1;
// auto-adjust:
for (int i=arrlen-100; i<arrlen; ++i) {
// mean baseline
baseline = round ( ( 0.5*(float)array[i] + 0.5*(float)baseline )) ;
// smoothed out max noise
if (array[i] >= baseline) maxr = round ( ( 0.8*(float)array[i] + 0.2*(float)maxr )) ;
// smoothed out min noise
if (array[i] <= baseline) minr = round ( ( 0.8*(float)array[i] + 0.2*(float)minr )) ;
}
bias = max(baseline-minr-2, maxr+2-baseline) ; //
curlf();
sprintf(sbuf, "baseline %d ", baseline );
Serial.println(sbuf);
lcdprint(sbuf);
curlf();
sprintf(sbuf, "bias %d ", bias );
Serial.println(sbuf);
lcdprint(sbuf);
// mit /ohne Rauschglättung (auskommentieren)
for (int i=0; i<arrlen; ++i) {
if( (array[i]>baseline ) && (array[i] <= baseline + bias)) array[i] = baseline ; // little higher value => drop to baseline
else
if( (array[i]<baseline ) && (array[i] >= baseline - bias)) array[i] = baseline ; // little lower value => rise to baseline
}
curlf();
sprintf(sbuf, "arrayinit[0] nachher %d ", array[0] );
lcdprint(sbuf);
Serial.println(sbuf);
}
klappt!
leider ist das Bildhochladen hier im Forum extremst kompliziert und vom Speicherplatz zu eingeschränkt,
ich habe es daher hier zum direkten Vergleich hochgeladen:
http://www.mindstormsforum.de/viewto...p=69409#p69409
- - - Aktualisiert - - -
deine lib habe ich jetzt noch etwas in ifndef eingekapselt, um doppeltes Linken zu vermeiden:
Code:
#ifndef __DIASOUND_HPP__
#define __DIASOUND_HPP__
/// dein diaSound-lib Code
#endif
Lesezeichen