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
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];
d) Der wave-Puffer startet jetzt an Stelle 0 mit dem wav-Wortsignal, der Rest bleibt 0.
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?
Lesezeichen