www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP DSP library STM32 für FFT


Autor: Miriam S. (miriam)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Community,

Ich bin neu hier und hoffe, dass ihr mir weiterhelfen könnt!
Und zwar versuche ich, anhand der DSP library von STMicroelectronics mit 
dem STM32 eine FFT auszuführen.
Wie in dem user manual beschrieben gebe ich der Funktion ein Array aus 
Eingangsdaten mit (die Messwerte als uint16_t Realteil sind die unteren 
2 Bytes des int32_t Eingangsarrays) und erwarte, dass die Daten im 
Ausgangsdaten-Array nach einer Betragsbildung mein Spektrum ergeben. 
Wenn ich aber als Eingangswert zum Testen einen einfachen Sinus ohne 
Offset übergebe, dann erhalte ich nicht wie erwartet viele Nullen und 
einen einzigen Peak, sondern sehr viele Werte, die deutlich größer als 
Null sind.
Verstehe ich die FFT da falsch? Oder habe ich irgend etwas übersehen?

Ich bin dankbar für jede Hilfe!

LG,
Miriam

: Verschoben durch Admin
Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Also wenn du einen Sinus als unsigned integer übergibst brauchst du 
einen Künstlichen Offset, da der Sinus eine positive und negative 
Halbwelle hat.
Das Problem wäre gleich eine signed integer mit unsigned integer zu 
vergleichen. Dann die maximale Frequenz zur FFT/2 beachten. Es gibt sehr 
viele FFT beispiele im Netz zu finden für ARM9 oder auch teilweise für 
ARM7 Cpus die aber nicht viel schwerer zu versten sind als für den 
Cortex M3.
Ich muss auch noch eine FFT in Assembler auf dem Cortex M3 
implementieren, habe mir dazu mal ganz grob die STM Lösung angesehen, 
finde die aber nicht so toll. Da auch die Eingangsfilter für eine FFT 
eine sehr große rolle spielen.

Gruß Sascha

Autor: manoh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha schrieb:
> Da auch die Eingangsfilter für eine FFT
> eine sehr große rolle spielen.

Es kommt drauf an. Der TP vor dem ADC ist idR. wichtiger.

Autor: Miriam S. (miriam)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, ok, vielen Dank Sacha und manoh. Das mit dem signed hatte ich 
total vergessen schäm
Also kann ich den Sinus als int16_t in die unteren 16 Bit des uint32_t 
Eingangsarrays packen, dann müsste es aber funktionieren, oder? Im 
Idealfall würde dann im Ausgangsspektrum nur ein einziger Wert größer 
Null sein, sehe ich das richtig (nämlich der bei der Frequenz des 
Sinus)?
Und dann hätte ich dazu noch eine kurze Frage:
Ich weis, dass das Ausgangsspektrum dann in der Mitte gespiegelt ist, 
also die untere Hälfte  Realteil + i * Imaginärteil und die obere Hälfte 
davon das konjugiert komplexe.
Aber wie genau hängt die Frequenzauflösung des Ausgangsspektrums mit der 
Abtastrate der Eingangswerte ab?
Wenn ich jetzt z. B. alle 2 us den Wert des ADC-Datenregisters in das 
Eingangs-Array schreibe, in welchen Frequenzschritten werden dann die 
Leistungsanteile des Ausgangsarrays ausgegeben? Der 0. Wert des 
Ausgangsarrays müsste der DC-Anteil (mit der Frequenz Null) sein, stimmt 
das? Und welche Frequenz hat der 1., 2.,...x. Wert dann?
Tut mir leid dass ich hierso viele Fragen stelle aber ich fände es echt 
super wenn mir da jemand etwas "Nachhilfe" geben könnte! :-)

Viele liebe Grüße,
Miriam

Autor: Gebhard Raich (geb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Im Idealfall würde dann im Ausgangsspektrum nur ein einziger Wert größer
>Null sein, sehe ich das richtig (nämlich der bei der Frequenz des
>Sinus)?
Das ist nur dann der Fall, wenn dein Eingangssignal mit einer 
ganzzahligen Periodenzahl in dein FFT Fenster "passt".

Die FFT "würfelt" generell die Ausgangsdaten durcheinander. Stichwort 
ist hier "bit reversed order". Man kann die Eingangsdaten in Bit 
reversed order eingeben und erhält dann ein geordnetes Spektrum, oder 
man sortiert nach der FFT. Beides ist möglich.

Nachdem die FFT Real und Imaginärteil liefert, erhält man das Spektrum 
durch Wurzel aus der Summation der quadratischen Werte.
>in welchen Frequenzschritten werden dann die
>Leistungsanteile des Ausgangsarrays ausgegeben?

Die Frage lässt sich so nicht beantworten, weil du keine Länge der FFT 
angegeben hast.

Generell solltest du dir dieses Kapitel nochmal ganz genau ansehen, es 
ist nicht unbedingt trivial.

Grüße

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.