FFT Auswertungs Probleme

Gast #253175
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
Gast
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.
Gast
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
Gast
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.
Gast
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
Gast
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?
Gast
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
Gast
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.
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.