super, dann kann man jetzt den Code vereinfachen und beschleunigen....
Road-Map:
Dazu brauchen wir eine andere Programm-Struktur, und dazu muss alles mit "debug" raus.
Das macht den Code auch überschaubarer.
1.) Muster-Erstellung
a) du nimmst eine Reihe von Wort-Samples auf:
JA.wav
NEIN.wav
STOPP.wav
b) der Micro- bzw. file- input[] array wird als Plot angezeigt
und dann direkt nach analyse geschickt und noise und Wort-Grenzen ermittelt.
c) jetzt wird NUR das Wort innerhalb der Wort-Grenzen nach wavbuffer kopiert
d) Der wave-Puffer startet jetzt an Stelle 0 mit dem wav-Wortsignal, der Rest bleibt 0.Code:memset(wavebuffer, 0, sizeof(wavebuffer) ); memcpy(wavebuffer, input+(signalstart*sizeof(char)), (signalend-signalstart)*sizeof(int32_t) ); // ich hoffe, ich habe mich jetzt mit memcpy nicht verhauen // ansonsten soll das rauskommen: // for (i=0; i<(signalend-signalstart); ++i) wavebuffer[i]=input[i+signalstart];
Der neue wav-Puffer wird ebenfalls als Plot angezeigt.
e) dann wird das "neue" wavebuffer-Muster als .wav Datei gespeichert.
JA_opt.wav
NEIN_opt.wav
STOPP_opt.wav
Das Plot-Programm könnte so aussehen:
Code:int main() { // Request a window size of 640*480 with top-left at 20,20 initWindowSize(20, 20, 640, 480); init(&width, &height); // Graphics initialization Start(width, height); // Start the picture Background(0, 0, 0); // Black background WindowOpacity(220); // Make the window little opaque // ... Finish(); // clean up graph window } void plotArray(int32_t * array, int32_t arrlength ) { Fill(255, 255, 255, 1); // White text StrokeWidth(1.0); // brush width WindowClear(); Stroke(255, 255, 255, 1.0); // white lines Line(10, 10, 10+255, 10); // ordinate Line(10, 10, 10, 512); // abszisse Stroke(0, 255, 0, 1.0); // green lines: wave pattern for(uint32_t i=0; i<arrlength; ++i) { Line(10+(i/64), 10, 10+(i/64), 10+(array[i]) ); // i=len=32768/64=512, array[i]_hi=255 } End(); // End = paint the the picture }
Wenn du das hast, lade doch bitte die 6 wav files mal hoch, dass ich sie kontrollieren kann (evtl. zum nachbessern).
wenn alles OK ist, kommt:
2.) Experimente mit der FFT und der cross correlation
- - - Aktualisiert - - -
3.) späteres Anwendungs-Programm:
a) später bekommen die wav-Muster-Files nur durchgehende Nummern plus einen Namenseintrag in einer Extra-Datei, in der Nummer und Namen miteinander verbunden werden, sodass man danach suchen kann, z.B.
0 (reserviert)
1 ja
2 nein
3 stopp
4 vorwärts
5 rückwärts
6 seitwarts
7 ran
...
b) Das abschließende lauffähige Wort-Erkennungs-Programm kann sich von seinem Aufbau her im Prinzip an diesem NXC-Programm orientieren:
http://www.mindstormsforum.de/viewto...p=53924#p53924
aber vorher müssen noch etliche FFT-Tests laufen....
1.1 Für die Bearbeitung von wave-arrays und wave-files brauchen wir dann 5 Funktionen:
Code:a) record_wave(int32_t * array, int32_t length); // Aufnahme von Tönen über Soundkarte => input-array ähnlich wie audioCapture(input, SHRT_MAX, "plughw:1,0", 1, 12000, 8 ); b) save_wave2file(int32_t * array, char * filename); // speichern eines arrays als .wav File mit header => fehlt noch ? c) wavefile2Array(int32_t * array, char * filename); // lesen von einem .wav File => in input-array (extrahiert ohne header, nur data, ohne audio-Wiedergabe über Soundkarte) d) play_waveArray(int32_t * array, int32_t length); // abspielen eines arrays mit festen Parametern ähnlich wie playCaptured(wave, SHRT_MAX, "plughw:1,0", 1, 12000, 8 ); e) play_waveFile(char * filename); // abspielen eines wav-files mit Parametern laut Header-Daten, ohne kopieren in einen temporären Array, ähnlich wie playwave(string waveDatei, string name) Soundkarten-Daten getrennt konfigurieren In die Sound-Lib sollte man dann noch zusätzlich aufnehmen diese 2 globalen #defines für Soundkarten: #define SoundCard_Intern "plughw:0,0" #define SoundCard_Extern "plughw:1,0"
diese Funktionen müssten dann genau so in deine wav-lib mit rein.
einverstanden?







Zitieren

Lesezeichen