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