Hi Zusammen, Ich arbeite gerade an einem Studienprojekt für FFT auf einem stm32f4 mit DSP und ADC wandlung. Die FFT habe ich mit Beispieldaten erfolgreich programmiert. Auch die 12 BIT ADC Wandlung funktioniert. Ich Sample dabei mit 20kHz meine Daten haben nicht mehr wie 10kHz. Die Werte die nun vom 12Bit ADC kommen haben ja einen Wert von 0 bis 4096, damit kann ich ja nicht in die Funktion arm_cfft_f32 gehen, die Peak Werte werden dann viel zu groß. Wie wird hier in der praxis vorgegangen? Kann doch nicht jeden Wert durch 1024 teilen damit sie kleiner werden ;-) danke für eure Hilfe lg
Lisa schrieb: > Wie wird hier in der praxis vorgegangen? Kann doch nicht jeden Wert > durch 1024 teilen damit sie kleiner werden ;-) Kommt drauf an, was deine FFT-Funktion für Eingangsdaten erwartet. Bei Festkomma-Rechnung legt man üblicherweise eine Normierung fest. Das bedeutet, dass definiert wird, wie viele Bit als Nachkommastellen interpretiert werden sollen. Da könnte man in deinem Beispiel 11 Nachkommastellen definieren, der Zahlenbereich von 0..4095 entspricht dann dem Bereich 0,0 .. 2,0 oder -1,0 .. +1,0; je nachdem ob mit oder ohne Vorzeichen. Wenn die FFT-Funktion mit Fließkomma-Zahlen rechnet, dann musst du die Messwerte in Fließkomma-Zahlen umrechen, das bedeutet eine Division durch z.B. 4096, allerdings als Fließkomma-Division. Bei der FFT gibt es außerdem noch unterschiedliche Normierungen für das Ergebnis. Man kann das Spektrum durch die Anzahl der Samples dividieren und erhält dann im Spektrum Linien, die der Amplitude im Zeitbereich entsprechen. Bei Division durch die Wurzel der Anzahl der Samples ist der Effektivwert im Zeitbereich und der Effektivwert im Frequenzbereich gleich groß. Wie groß die Peak-Werte werden, hängt also nicht nur von der Skalierung der Eingangssignale ab, sondern auch davon, wie das Ergebnis der FFT normiert wird.
Okay das macht schon Sinn. Wobei es mich irgendwie wurmt 8096 Daten erstmal durch 4096 teilen zu müssen :-o Darum wollte ich erst einmal nachfragen ob das wirklich so gemacht wird in der Praxis. Ich verwende diese Funktion: http://www.keil.com/pack/doc/cmsis/dsp/html/group___complex_f_f_t.html#gade0f9c4ff157b6b9c72a1eafd86ebf80 Der erste Pointer zeigt dann auf mein Array mit dem Daten, wobei immer zwei werte zusammen gehören (Real- und Imaginär-Teil). Datentyp ist hier float32_t.. lg
Na aber wenn der Datentyp sowieso float ist, kannst du doch auch munter rumskalieren. Wenn du das mit Festkommaarithmetik machen müsstest, könnte ich deine Zweifel ja verstehen, aber bei float sollte das meines Wissens nach kein Problem darstellen. Wieso werden deine Peakwerte denn eigentlich zu groß? Zu groß für was? Überschreiten die irgendwelche Grenzen? Gibts Überläufe oder sowas?
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.