Forum: Digitale Signalverarbeitung / DSP / Machine Learning Kurze Frage zur FFT und Werte aus dem ADC


von Lisa (Gast)


Lesenswert?

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

von Johannes E. (cpt_nemo)


Lesenswert?

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.

von Lisa (Gast)


Lesenswert?

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

von Wannabe_Ing (Gast)


Lesenswert?

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