-
Hast du den Code schon abgeändert? Wenn nicht machst du das noch?
Ja ich höre mir das natürlich an. Nutzt ja nichts wenn man Kaudawelsch versucht zu vergleichen.
Ich hab damals auf dem Amiga mit C Programmieren angefangen. Ganz am Anfang war es der C64 mit Basic und auch der C128. Danach dann kurz MS-DOS (VHS da hatte ich keine Wahl) und das war mir schon unangenehm. Zum Glück bekam ich kurz darauf einen Amiga und da ging es dann los mit dem Programmieren. Erst in ARexx. Eine Skript-Sprache die mir heute auf eigentlich allen Betriebssystemen fehlt. Auf dem Amiga hat eigentlich jedes Programm eine ARexx Schnittstelle wo man sie dann mit ARexx unter einander verbinden und steuern kann. Da habe ich komplette Mailinglisten drüber programmiert und auch sonst vieles Automatisiert. Dann kam Ansi-C. Da hab ich alles Mögliche mit programmiert. Angefangen von einfachen Programmen zur Fuhrparktüberwachung bis hin zu FTP Clienten und OpenGL. Auch einen AIM Client habe ich geschrieben. Dann wurde aber das Geld knapp und leider ist Hardware für den Amiga super teuer. Dann kam kurz Windows. Dort habe ich auch programmiert aber Spass hatte ich irgendwie nie dabei. Dann bin ich davon weg zu Linux aber durch Frau und Kinder habe ich das Hobby echt lange brach liegen lassen. Bis letztes Jahr. Ich habe letztes Jahr mit einem Freund angefangen einen Kettcar um zu bauen und einen PocketBike Motor dran zu bauen (Daher Projekt-Hirnfrei, die Idee meiner Frau). Wir waren aber sehr unzufrieden mit dem Bowdenzug für das Gas-Pedal und als Alternative kam dann mein erster Arduino ins Haus und der hat mir derart viel Spass gemacht das ich seit her wieder sehr viel programmiere. Bin dann aber von Ansi-C auf C++ umgestiegen. Zwar finde ich es toll, wenn man wirklich über jede Speicherstelle bescheid weiss, die man zum Programmieren benutzt, aber der Aufwand mit dem Anfordern, Erweitern und löschen war mir dann irgendwie zu viel. Das es C++11 gibt weiss ich auch erst seit ein paar Monaten ;).
So jetzt kennst du meine Geschichte ;). So viel wollte ich gar nicht schreiben.
Aber recht hast du definitiv. C/C++ ist wahrscheinlich nach Assembler das wo man nie auslernen wird.
-
ja, ich habe die Grenzen noch optimiert, nach ein paar Serien sehr ausgefallener random-Waves.
zur Zeit ver 0005-0007.
im Raspy Code mus es ntl als array-Größe SHRT_MAX heißen statt arrlen, und int32_t statt int16_t.
wenn nach dem Rausch-ex vorher/hinterher beim Abhören immer noch alles klar ist, dann kann man jetzt die Grenzen des Signals setzen:
int signalstart=0;
int i=0;
while( (wavbuffer[i]<=baseline+bias) && (i<SHORT_MAX-1) ) ++i;
signalstart=i;
int signalend=SHORT_MAX-1;
i=SHORT_MAX-1;
while( (wavbuffer[i]<=baseline+bias) && (i>signalstart) ) --i;
signalend=i;
jetzt müsten die Grenzen feststehen.
Ich teste es auf dem Arduino aus.
ver 0007c
- - - Aktualisiert - - -
jawohl, klappt! :cool:
Code:
// ver 0007c
void arrayinit(int16_t * array, int16_t arrlen) {
char sbuf[128];
int16_t bias, minr, maxr, baseline,
maximum, minimum, maxpos, minpos,
signalstart, signalend;
uint16_t i;
// simulated noisy word-command or signal
for (i=0; i<arrlen; ++i) {
array[i] = 128 + random(11) - 5; // simulated noise +/- 5;
}
for (i=33; i<arrlen-101; ++i) { // simulated word/signal +/- 100
array[i] = 128 + random(201) - 100;
}
curlf();
sprintf(sbuf, "arrayinit[0] vorher %d ", array[0] );
Serial.println(sbuf);
lcdprint(sbuf);
// dynamics: min, max
maximum = array[0];
minimum = array[0];
for(i=0;i<arrlen; ++i)
{
if(array[i] > maximum) {
maximum = array[i];
maxpos = i;
}
if(array[i] < minimum) {
minimum = array[i];
minpos = i;
}
}
// calculate baseline from last 100 array cells:
// init vars
baseline=( array[minpos] + array[maxpos] ) / 2; // init baseline by (min+max)/2
minr=baseline - 1;
maxr=baseline + 1;
// auto-adjust:
for (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.6*(float)array[i] + 0.4*(float)maxr )) +1 ;
// smoothed out min noise
if (array[i] <= baseline) minr = round ( ( 0.6*(float)array[i] + 0.4*(float)minr )) -1 ;
}
bias = max(baseline-minr, maxr-baseline) +1; //
curlf();
sprintf(sbuf, "baseline %d ", baseline );
Serial.println(sbuf);
lcdprint(sbuf);
curlf();
sprintf(sbuf, "bias %d ", bias );
Serial.println(sbuf);
lcdprint(sbuf);
// noise reduction start/end
// drop small noise
for (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
}
// signalstart, signalend: threshold = bias + (bias/2)
signalstart=0;
i=0;
while( (array[i]<=baseline + 4*bias/3) && (i<arrlen-1) ) ++i;
signalstart = i;
if (i>0) signalstart -=1;
signalend=arrlen-1;
i=arrlen-1;
while( (array[i]<=baseline + + 4*bias/3) && (i>signalstart) ) --i;
signalend = i;
if (i<arrlen-1) signalstart +=1;
curlf();
sprintf(sbuf, "arrayinit[0] nachher %d", array[0] );
lcdprint(sbuf);
Serial.println(sbuf);
curlf(); _curx_=80;
sprintf(sbuf, "signalstart %d", signalstart );
lcdprint(sbuf);
Serial.println(sbuf);
curlf(); _curx_=80;
sprintf(sbuf, "signalend %d", signalend );
lcdprint(sbuf);
Serial.println(sbuf);
}
jetzt bei 7c: Grenzenerkennung funktioniert sogar bei 20% Rauschen sehr gut.
neuestes Bild ganz unten hier im Post:
http://www.mindstormsforum.de/viewto...p=69409#p69409
-
@hirnfrei:
lässt sich jetzt wieder playCaptured verwenden?
wenn du meine Array-Veränderungen (analog Arduino-Code) auf wavbuffer anwendest: lässt sich der Sound dann damit abspielen?
Wie klingt es, verglichen mit dem Original (input) ?
Wenn alles ok ist (und auch dein "Wort" sogar schärfer abgegrenzt zu hören ist, wie es ja sein soll):
sollen wir dann die FFT in Angriff nehmen?
-
Ich hoffe das ich dir da heute noch eine Antwort drauf geben kann. Habe ja am Sonntag mein Gentoo auf systemd umgestellt und da müssen viele fette Programme neu compiliert werden. Firefox, Thunderbird, LibreOffice usw. Bin leider immer noch nicht fertig damit.
Spätestens morgen geht es weiter!
-
So. System erfolgreich umgestellt. Morgen gehts wieder ans Projekt!
-
-
Später vielleicht. Bislang ist es den Aufwand nicht wert.
Aber nein ich habe mein Desktop mal auf systemd um gestellt und aktualisiert. Das dauert leider ewig und da ich ja ausschliesslich mit ssh auf dem Raspi arbeite ging das eben nicht, solange der updated, sonst hätte es noch viel länger gedauert.
-
willst du nicht langsam mal direkt auf dem Pi programmieren und compilieren?
Einfach einen großen HDMI-Screen + Maus + Tastatur dran, fertig,
Full-HD-HDMI Monitore (oder DVI mit HDMI-Adapter) gibts gebraucht bei Ebay für unter 50 EUR, und kleine HDMIs dann zum einfach-umstecken für den mobilen Einsatz im 7-10".
-
Nö wieso? Läuft doch alles prima. Ich werde in naher Zukunft das System nicht wieder umstellen ^^
-
naja, warum ... wegen des PCs, den du dann nicht mehr brauchst, nur deswegen.