Hallo Leute, bin doch noch nicht so ganz dahinter gestiegen ;) Dank dem Buch von dspguide.com habe ich den Ablauf des Algorithmus zwar verstanden, aber nun habe ich das Problem dass ich nicht viel mit den beiden erhaltenen Feldern anfangen kann. Ich würde gerne die Amplitude und die Frequenz der Signale darstellen, bzw. weiterverarbeiten. Aber wie lese ich diese Daten aus dem Imaginärteil und dem Realteil heraus? Ich finde den Ansatz nicht... Alle möglichen Dokumente die ich gefunden haben überspringen diesen Schritt. Kann mir jemand weiterhelfen, bzw. nen Tipp geben wo ich die Info finde? Grüße Andreas
Magnitude = SQRT (Re^2 + Im^2) Phase = ATAN (Im/Re) Beide Formeln lässt du über die Wertepaare laufen und erhältst zwei neue Felder. Das erstere kannst du dir mal zeichnen lassen und es sollte etwas spiegelsymmetrisches (um fs) herauskommen. Wie du die Frequenzachse zu beschriften hast sollte klar sein.
Bin ich da richtig.... ------------------snap------------- The FFT frequency axis must be rescaled by noting that the spacing between frequency points is equal to the reciprocal of the total time range, Delta. For this case, transform the FFT x-axis point spacing to df =1/D=1/0.5 s = 2 Hz per point. -----------------snap-------------- und zwar würde ich dass jetzt so auffassen dass ich im Moment 256 ms aufnehme, d.h. jeder punkt im meinem Feld ist 1/0,256 s= 3,9 Hz pro Feldeintrag. Grüße und Danke. Andreas
Du nimmst meinetwegen 1024 Werte bei einer Frequenz fx auf. Im Zeitbereich hast du eine Auflösung zwischen den Schritten von 1/fx Sekunden. Im Frequenzbereich hast du eine Auflösung von fx/1024 Hz zwischen den Schritten. Da die FFT spiegelsymmetrisch um fx/2 ist (vgl. Abtasttheorem), genügt es die Werte von Null bis 512 zu zeichnen. Du siehst dann die entsprechenden Peaks für alle Frequenzen zwischen Null Hz und fx/2 Hz.
Ok, dann nehm ich 1024 Werte bei einer Frequenz von 7 kHz auf und erhalte so im Frequenzbereich eine Auflösung zwischen den Schritten von 7000/1024 Hz. Wegen der spiegelsymmetrie sehe ich dann von 0 Hz - 3,5 kHz. Um dann 1 sek. Signal verarbeiten zu können muss ich bei 7 kHz (alle 142 µs) 7042 Werte Aufnehmen. 7000/7042 Hz. Sind wir in der nähe von 2^13.... Das schreit nach aufteilen ;) Wenn ich die Sekunde drittle dann könnte ich nur 2048 bei 7 kHz aufnehmen.... komm halt dann insgesamt nur auf 0,87 sec. aber das wären dann 2048 Werte bei einer Frequenz von 7 kHz auf eine Auflösung zwischen den schritten von 7000/2048 Hz. Sehe aber den Kompletten Frequenzbereich von 0 Hz - 3,5 kHz bei allen 3 aufgeteilten Teilen. Thx und Grüße Andreas
Warum musst du genau eine Sekunde des Signales betrachten? Bei 7kHz müsstest du 7000 Werte aufnehmen. Mittels zero-padding kannst du ja 8192 (Zweierpotenz) draus machen und davon die FFT berechnen. Du kannst für den Fall, dass die Frequenzanteile in deinem Signal quasistationäres Verhalten zeigen, auch einfach 7 FFTs mit je 1024 Punkten (sind gesamt ca. 7000) ausrechnen und diese mitteln. Wenn du zusätzlich noch eine geeignete Fensterfunktion wählst sollten gut Ergebnisse abhängig von der verwendeten Hard- und Software möglich sein. Was sind nun die genauen Forderungen?
Die Vorgabe für ~1 sec kommt von mir, da ich den Wortschatz den ich erkennen will in der Zeit "unterbringe". Kein Wort ist länger beim sprechen. z.B. "StArt", "StOp". Ich will die Vokale erkennen aus den Wörtern. Somit erhalte ich ja eine Auflösung von 6,83 Hz (7 FFTs mit je 1024 Punkten bei 7kHz - nur mitteln wird wohl nicht funktionieren, da das Sprachsignal nicht so lang quaisistationär ist). Eigentlich denke ich würde mir eine Auflösung von ~50 Hz genügen... Wenn ich 128 Werte aufnehme bei 7 kHz dann kommt man auf 54 Hz Auflösung. Um dann ~1 sec zu kommen müsste ich dann ca. 54 x die 128 point FFT durchführen. Das hätte auch noch einen weiteren Vorteil das mir ein wenig der Zeitliche Faktor erhalten bleibt. Ich könnte ungefähr sagen ob in der Mitte oder am Anfang ein Vokal lag. Eine unterteilung in drei Teile der 54 x 128 point FFTs vorrausgesetzt. Als Fensterfunktion habe ich mir das Hanningfenster gedacht. Dies wird oft in der Spracherkennung eingesetzt. Grüße Andreas
Sprachsignale sind nur über ca. 20ms quasistationär, das sagen zumindest die meisten Bücher über DSP. In der Praxis wird dann eher ein solcher Zeitraum abgetastet, und aus dessen FFT herausgefiltert (vielmehr klassifiziert), ob es sich um einen bestimmten Vokal/Silbe/Laut handelt. Die Aneinanderreihung der Ergebnisse ergibt dann verknüpft mit bestimmten wahrscheinlichkeitstheoretischen Überlegungen (welche Konsonanten/Vokale/Silben folgen häufig aufeinander) das fertige Wort/den fertigen Satz.
Sprachsignale sind nur über ca. 20ms quasistationär, das sagen zumindest die meisten Bücher über DSP. Jo das stimmt. Liegt daran dass wir Menschen natürlich auch nur in einem gewissen Zeitlichen Maße die Lauterzeugung verändern können. Wir sind einfach so "langsam". ;) Stimmt eigentlich, warum nehm ich nicht 20ms für eine FFT? ~142 Werte bei 20 ms. Nehm ich 18 ms bin ich bei 128 Werte. Das passt. :) Als nächster Schritt steht dann die Herausarbeitung der Vokale an. Vokale treten gehäuft in einem gewissen Frequenzbereich auf. Kleiner überblick bei: http://de.wikipedia.org/wiki/Formant Ich möchte dann eine Klassifizierung anhand der Häufigkeit und vorher gespeicherten Trainierten Werten erhalten. Das Reicht mir mal für den Anfang. Ist eh schon ne ganz schöne Aufgabe. ;) Die wahrscheinlichkeitsüberlegungen gehen in den Bereich der Hidden Markov Modelle (http://de.wikipedia.org/wiki/HMM) und Neuronale Netze. Diese Verfahren sind mal richtig aufwendig. Es gibt spezielle DSP Controllerboards die solche Verfahren beherrschen. Aber im Low Cost µC Bereich wo ich mich befinde ist dies aussichtslos. Meist werden solche Verfahren in der PC basierten Spracherkennung verwendet (Diktierprogramme). So dann hock ich mich mal wieder hin und mach weiter... danke und Grüße Andreas
ach ps. Hab grad den anderen Thread von dir gesehen über den Monitor vom M16C Benutz grad genau die gleiche MCU. :) M30626FHPFP Grüße Andreas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.