nein, mach mal folgendes:
for(int i=0; i<SHRT_MAX, ++i) input[i]=input[i] & 0x00ff;
und dann guck, ob du es immer noch abspielen kannst!
(ps, dein letzter Link ist kaputt)
nein, mach mal folgendes:
for(int i=0; i<SHRT_MAX, ++i) input[i]=input[i] & 0x00ff;
und dann guck, ob du es immer noch abspielen kannst!
(ps, dein letzter Link ist kaputt)
Habe ich gemacht, ja kann ich noch problemlos abspielen!
und der Link geht jetzt auch. Hatte mich vertippt.
- - - Aktualisiert - - -
Nachdem was ich bis jetzt so gelesen habe kommen bei Stereo die Daten immer abwechselnd. Erst Links dann Rechts.
- - - Aktualisiert - - -
Hast du das schon gesehen? http://www.fftw.org/
ja, das mit Stereo weiß ich, die Frage ist: alle in derselben int32 Zelle oder in 2 aufeinanderfolgenden?
aber das ist jetzt nicht mehr wichtig.
Wir wissen jetzt:
die Sound-Daten im Input-Array entsprechen ganz exakt den Micro-sound(wav)-Schwingungsdaten, die wir weiterverarbeiten können.
also speichern wir jetzt am besten input in einem wavbuffer (um input zu schonen):
int32_t wavbuffer[SHRT_MAX];
memcpy(wavbuffer, input, sizeof(input) );
for(int i=0; i<SHRT_MAX, ++i) wavbuffer[i] &= 0x00ff;
wav buffer müssen wir jetzt analysieren:
Bandbreite der Werte/Dynamik:
min-Wert=?
max-Wert=?
bis wo geht der Vorspann,Code:
d.h. wo fängt das eigentliche Wort an,
und wo beginnt der Nachspann, d.h. wo hört das Wort auf.
dann:
wie groß ist die Schwingungsbreite (Dynamik) im Vor/Nachspann?
126-130? oder größer?
Geändert von HaWe (04.06.2016 um 20:23 Uhr)
Warum ein neues Array anlegen? Können wir nicht das nutzen was wir schon haben?
min-Wert ist 0
max-Wert ist 255
Ja die Schwinungsbreite von vor und nach müsste so zwischen 120 und 132 liegen.
Wo nun vor und nachspann anfangen, wie ich das kläre weiss ich nicht.
Mist, der blöde Editor hat mich rausgeschmissen...
nein, ich will das Original behalten, zur Sicherheit, deshalb zusätzlicher wavbuffer.
max-Wert und Minwert htte ich grade gepostet, wurde aber von dem blöden editor gelöscht weil mich das Forum ausgeloggt hat. Abrer das kannst du selber....
- - - Aktualisiert - - -
hierfür eine Funktion mit Rückgabewert anlegen:
Minimum analogCode:maximum = wavbuffer[0]; int32_t maxpos; for (i = 1; i < size; i++) { if (wavbuffer[i] > maximum) { maximum = wavbuffer[i]; maxpos= i+1; } }
- - - Aktualisiert - - -
wir müssten für Vorspann und Nachspann wissen, ob wirklich immer einer existiert, oder ob alles der komplette aufgenommene Sound ist.
Nur wenn künftig überall Vor-oder Nachspann vorkommen, kann man das also analysieren und verwenden
- - - Aktualisiert - - -
wenn wir aufpassen, dass unsere Kommandos immer kürzer sind als die etwa 3 sec., kann man die Dynamik der letzten 100 Zellen verwenden (~10 ms):
minr = minimum der letzten 100 zellen (optimiert: ebenfalls zu heftige Spikes nach unten rausschneiden)
maxr = maximum der letzten 100 zellen (optimiert: ebenfalls zu heftige Spikes nach oben rausschneiden)
baseline = arithmet. Mittel der letzten 100 zellen (baseline)
bias = min(baseline-minr, maxr-baseline); // <=== Bandbreite um Mittelwert
- - - Aktualisiert - - -
wenn wir dann die Ober- und Untergrenzen des Grundrauschens kennen, können wir das bias abschneiden:
oh mann, wenn wir doch nur IMMER codetags im Editor hätten....!Code:for(int i=0; i<SHRT_MAX; ++i) { if( (wavbuffer[i]>baseline ) && (wavbuffer[i]< baseline + bias)) wavbuffer[i] = baseline ; // kleine Schwankung => auf Baseline else if( (wavbuffer[i]<baseline ) && (wavbuffer[i]> baseline - bias)) wavbuffer[i] = baseline ; // kleine Schwankung => auf Baseline
(ich hoffe, ich habe mich jetzt nicht verkalkuliert mit dem "Entrauschen"...)
Geändert von HaWe (05.06.2016 um 12:11 Uhr)
Schneiden wir dann nicht auch diese Teile aus dem Wort raus?
Hier mal ein Update von der main
Code:#include <iostream> #include <vector> #include <fstream> #include <stdio.h> #include <limits.h> #include "diaSound.hpp" bool debug = false; void analyse(int32_t *waveBuffer) { int32_t maximum = waveBuffer[0]; int32_t minimum = waveBuffer[0]; int32_t maxpos, minpos; int i; for(i=0;i<SHRT_MAX;i++) { if(waveBuffer[i] > maximum) { maximum = waveBuffer[i]; maxpos = i + 1; } if(waveBuffer[i] < minimum) { minimum = waveBuffer[i]; minpos = i + 1; } } } int main() { fstream datei; int32_t input[SHRT_MAX], waveBuffer[SHRT_MAX]; int i; uint8_t *wave; audioCapture(input, SHRT_MAX, "plughw:1,0", 1, 12000, 8); wave = (uint8_t *) malloc(SHRT_MAX+1); if(debug) datei.open("test.csv", ios::out); for(i=0;i<SHRT_MAX;i++) { wave[i] = input[i] & 0x00ff;; waveBuffer[SHRT_MAX] = input[i] & 0x00ff; if(debug) cout << i << " -> " << input[i] << endl; if(debug) datei << input[i] << endl; } analyse(waveBuffer); if(debug) datei.close(); playCaptured(wave, SHRT_MAX, "plughw:1,0", 1, 12000, 8); free(wave); return 1; }
wenn wir soweit sind, können wir probeweise dieses Veränderte Array einmal abspielen und horchen, wie es klingt...
dann gehts weiter...
(ich habe schon eine Idee)
kleine Optimierung für analyse():
heute abend kann ich selber nicht am Raspi programmieren, du könntest mir aber mal deinen input als zipfile hochladen, dann kann ich morgen mal dran arbeiten.Code:void analyse(int32_t *waveBuffer) { int32_t maximum = waveBuffer[0]; int32_t minimum = waveBuffer[0]; int32_t maxpos, minpos; uint32_t i; // falls man mal aus Versehen 1 zu weit zählt... for(i=0; i<SHRT_MAX; ++i) { if(waveBuffer[i] > maximum) { maximum = waveBuffer[i]; maxpos = i ; // genaue Zellen-Nummer } if(waveBuffer[i] < minimum) { minimum = waveBuffer[i]; minpos = i ; } } }
- - - Aktualisiert - - -
was sind das für Teile, die du meinst ?Schneiden wir dann nicht auch diese Teile aus dem Wort raus?
und wofür braucht du noch wave und diese Zeilen...?
wave = (uint8_t *) malloc(SHRT_MAX+1);
wave[i] = input[i] & 0x00ff;;
wave ist für die Ausgabe. Hat eigentlich nur Kontrollfunktion ob im Gerät auch das ankommt was man rein geredet hat. Das kann im letztendlichen Code raus.
Was ist der Unterschied zwischen i++ und ++i?????
Und was genau soll ich hoch laden? Die Daten vom Mikro? Falls ja, dass ist das was in test.cvs drin steht.
- - - Aktualisiert - - -
Und mit Teile raus schneiden, wenn wir alles raus schneiden was die Werte von Vor- und Abspann hat dann schneiden wir das ja auch aus dem Wort heraus. Da kommen doch auch solche Werte drin vor.
- - - Aktualisiert - - -
Ah noch etwas. Was genau macht & 0x00ff?
Lesezeichen