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


von Miriam S. (miriam)


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
von Sascha (Gast)


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

von manoh (Gast)


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.

von Miriam S. (miriam)


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

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


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

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
Noch kein Account? Hier anmelden.