www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP FFT Auswertungs Probleme


Autor: Andreas Fertl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas Fertl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas Fertl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Andreas Fertl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas Fertl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Viel Erfolg, halte mich ruhig auf dem Laufenden :)

Autor: Andreas Fertl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.