Forum: Mikrocontroller und Digitale Elektronik Frage zu FFT (Verständnisproblem)


von Uwe B. (derexponent)


Lesenswert?

Hallo,

ich versuche gerade am STM32F429 (an meinem Mini-Oszi-Projekt)
eine FFT Anzeige zu integrieren und habe dazu eine Frage

da ich mich mit FFT so gut wie gar nicht auskenne habe ich
als ersten Test einfach das fertige Beispiel von STM als "Vorlage" 
genommen und in meinem Projekt implementiert (arm_fft_bin_example_f32.c)

dort gibt es ein "Input-Array" welches zu beginn mit Daten gefüllt ist,
das ein 10kHz Sinus mit weißem Rauschen entspricht.

Es stehen 2048 Werte in dem Array und jeder Zweite Wert ist eine "0"

Dieses Array wird dann per FFT in ein "Output-Array" mit 1024 Werten 
umgerechnet


hier ein kleiner Ausschnitt von dem "Input-Array" :
1
/* ----------------------------------------------------------------------
2
Test Input signal contains 10KHz signal + Uniformly distributed white noise
3
** ------------------------------------------------------------------- */
4
5
float32_t testInput_f32_10khz[2048] = 
6
{   
7
-0.865129623056441,   0.000000000000000,   -2.655020678073846,   0.000000000000000,   0.600664612949661,   0.000000000000000,   0.080378093886515,   0.000000000000000,   
8
-2.899160484012034,   0.000000000000000,   2.563004262857762,   0.000000000000000,   3.078328403304206,   0.000000000000000,   0.105906778385130,   0.000000000000000,   
9
0.048366940168201,   0.000000000000000,   -0.145696461188734,   0.000000000000000,   -0.023417155362879,   0.000000000000000,   2.127729174988954,   0.000000000000000,   
10
-1.176633086028377,   0.000000000000000,   3.690223557991855,   0.000000000000000,   -0.622791766173194,   0.000000000000000,   0.722837373872203,   0.000000000000000,   
11
2.739754205367484,   0.000000000000000,   -0.062610410524552,   0.000000000000000,   -0.891296810967338,   0.000000000000000,   -1.845872258871811,   0.000000000000000,   
12
1.195039415434387,   0.000000000000000,   -2.177388969045026,   0.000000000000000,   1.078649103637905,   0.000000000000000,   2.570976050490193,   0.000000000000000,   
13
-1.383551403404574,   0.000000000000000,   2.392141424058873,   0.000000000000000,   2.858002843205065,   0.000000000000000,   -3.682433899725536,   0.000000000000000,   
14
-3.488146646451150,   0.000000000000000,   1.323468578888120,   0.000000000000000,   -0.099771155430726,   0.000000000000000,   1.561168082500454,   0.000000000000000,   
15
1.025026795103179,   0.000000000000000,   0.928841900171200,   0.000000000000000,   2.930499509864950,   0.000000000000000,   2.013349089766430,   0.000000000000000,   
16
2.381676148486737,   0.000000000000000,   -3.081062307950236,   0.000000000000000,   -0.389579115537544,   0.000000000000000,   0.181540149166620,   0.000000000000000,   
17
-2.601953341353208,   0.000000000000000,   0.333435137783218,   0.000000000000000,   -2.812945856162965,   0.000000000000000,   2.649109640172910,   0.000000000000000,   
18
-1.003963025744654,   0.000000000000000,   1.552460768755035,   0.000000000000000,   0.088641345335247,   0.000000000000000,   -2.519951327113426,   0.000000000000000,   
19
-4.341348988610527,   0.000000000000000,   0.557772429359965,   0.000000000000000,   -1.671267412948494,   0.000000000000000,   0.733951350960387,   0.000000000000000,

die Umrechnung der FFT erfolgt dann per :
1
#define TEST_LENGTH_SAMPLES 2048 
2
3
extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES]; 
4
static float32_t testOutput[TEST_LENGTH_SAMPLES/2]; 
5
6
7
/* Process the data through the CFFT/CIFFT module */ 
8
arm_cfft_radix4_f32(&S, testInput_f32_10khz);    
9
   
10
/* Process the data through the Complex Magnitude Module for  
11
calculating the magnitude at each bin */ 
12
arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);

was ich jetzt nicht verstehe ist :

warum ist jeder zweite Wert in dem "Input-Array" eine "0" ?

muss das so sein (also ist das eine Forderung damit die FFT richtig 
berechnet wird) oder ist das einfach "Zufall" das jeder Zweite Wert die 
Nulllinie schneidet ?

Gruss Uwe

: Bearbeitet durch User
von Walter (Gast)


Lesenswert?

das soll wohl das Rauschen sein ...

von holger (Gast)


Lesenswert?

>warum ist jeder zweite Wert in dem "Input-Array" eine "0" ?

Weil der Input aus komplexen Zahlen besteht.
Beim sampeln hast du aber nur Reale Werte. Der
Imaginärteil ist Null.

von Uwe B. (derexponent)


Lesenswert?

holger schrieb:
> Beim sampeln hast du aber nur Reale Werte. Der
> Imaginärteil ist Null.

ok, also muss ich, wenn ich das ganze richtig in meine Oszi-Software 
integrieren will, ein Array aufbauen das so aussieht :
1
float32_t Input[2048];
2
3
Input[0] = ADC-Messwert-1 (0...4095)
4
Input[1] = 0
5
Input[2] = ADC-Messwert-2 (0...4095)
6
Input[3] = 0
7
Input[4] = ADC-Messwert-3 (0...4095)
8
Input[5] = 0
9
Input[6] = ADC-Messwert-4 (0...4095)
10
Input[7] = 0
11
...
12
Input[n] = ADC-Messwert-m (0...4095)
13
Input[n+1] = 0

Danke, werd ich mal so umsetzen

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Uwe B. schrieb:

> dort gibt es ein "Input-Array" welches zu beginn mit Daten gefüllt ist,
> das ein 10kHz Sinus mit weißem Rauschen entspricht.
>
> Es stehen 2048 Werte in dem Array und jeder Zweite Wert ist eine "0"
>
> Dieses Array wird dann per FFT in ein "Output-Array" mit 1024 Werten
> umgerechnet

> was ich jetzt nicht verstehe ist :
>
> warum ist jeder zweite Wert in dem "Input-Array" eine "0" ?

Weil bei der Eingabe in der Zeit-Domäne in diesem Fall keine irrationale 
"j"-Komponente existiert und deshalb alle Koeffizienten in der 
y-Richtung der Ebene Null sind. Die Eingabe stellt nämlich (wie auch die 
Ausgabe) Punkte in einer Ebene dar, bestückt mit Werte_paaren_.

> muss das so sein

In dieser Anwendung schon.

> also ist das eine Forderung damit die FFT richtig
> berechnet wird

Definitiv ja.

Und bei der Auswertung der Ergebnisse in der Frequenzdomäne ist auch in 
deiner Anwendung die "j"-Komponente in den meisten Fällen wohl ungleich 
0 und muß dementsprechend korrekt berücksichtigt werden.

von Uwe B. (derexponent)


Angehängte Dateien:

Lesenswert?

c-hater schrieb:
> Und bei der Auswertung der Ergebnisse in der Frequenzdomäne ist auch in
> deiner Anwendung die "j"-Komponente in den meisten Fällen wohl ungleich
> 0 und muß dementsprechend korrekt berücksichtigt werden.

Danke für den Hinweis...leider weis ich nicht was du damit meinst :-(

ich hab das ganze jetzt mal umgesetzt (siehe Bilder) aber da scheint was 
nicht zu stimmen

die Bilder zeigen einmal die Version M1 (die ich zuerst hatte)
in denen das komplette "Input-Array" mit ADC-Messwerten gefüllt ist

und die Version M2 in der im "Input-Array" nach jedem Messwert eine "0"
steht

(beides per Debugger überprüft)

das Testsignal ist einmal ein 10kHz Sinus und einmal ein Rechteck
(aus einem sehr, sehr schlechten selbstgebauten Generator ;-(

das "Input-Array" hat 512 Einträge das "Output-Array" 256
(damit es auf die Anzeige passt, die nur 320 Pixel breit ist)

so wie es aussieht ist in der Version M2 das Output-Array in der Mitte 
gespiegelt...das scheint mir so nicht stimmen zu können

"any idea ?"

von Stefan (Gast)


Lesenswert?

Hi,
doch das stimmt. Du solltest dich mal mit der Fourier-Transformation im 
allgemeinen und mehr noch mit der Darstellung der sinusoiden Funktionen 
im Komplexen beschäftigen und dem ganzen Themengebiet. Dann wär Dir das 
absolut klar. Was Du siehst sind negative und positive Frequenzanteile.
Aber, tschulligung, für ein Forum ist das einfach zuviel, das alles zu 
erklären. Zu dem Thema findest Du bestimmt eine ganze Reihe von 
Video-Tutorials auf Youtube, z.B. von Jörn Loviscach (ich hoffe den 
schreibt man so...).
Gruß
S.

von Siliziummann (Gast)


Lesenswert?

Uwe B. schrieb:
> (siehe Bilder)

Deiner schoenen Software fehlt noch ein screenshot transfer :-)

von Uwe B. (derexponent)


Angehängte Dateien:

Lesenswert?

ich habe das ganze jetzt von Complexe-FFT auf Reele-FFT umgestellt
und damit sieht das ganze jetzt besser aus (siehe Bild)

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.