Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT ARM DSP Lib: Shift im Ergebnis?


von LEler (Gast)


Lesenswert?

Hallo,

ich experimentiere mit der ARM-DSP-Lib für die M4 (hier für einen 
XMC4500) unter DAVE. Ich habe untenstehenden Testcode geschrieben um die 
RFFT-Funktion zu testen. Der Code läuft, ich wundere mich aber über das 
Ergbnis. In dem Array das das Spektrum speichert (testout) sollte an 
Index 0 der Gleichanteil stehen und an Index 8 & 32 erwarte ich die 
Peaks aus dem Testsignal. Der Gleichanteil ist korrekt, wenn ich die 
Skalierung mit der FFT-Länge in Betracht zieht, gleiches gilt für die 
Amplitudenhöhe der Peaks; nur sind die Peaks nicht an den Indices 8 & 32 
zu finden, sondern an 9 & 33. Egal wie das Testsignal aussieht, ich habe 
immer einen Shift von 1. Liegt das an der FFT oder mache ich einen 
(Denk)Fehler?

LEler
1
float32_t testInput_f32[2048];
2
float32_t testout_f32[2048];
3
4
int main(void)
5
{
6
  DAVE_Init();      // Initialization of DAVE Apps
7
8
  uint32_t fftSize = 1024;
9
  uint32_t ifftFlag = 0;
10
  uint32_t testIndex = 0;
11
  uint32_t i;
12
  arm_status status = ARM_MATH_SUCCESS;
13
  arm_rfft_fast_instance_f32 S;
14
  float32_t maxValue;
15
        //Erzeuge Testsignal
16
  for(i=0;i<fftSize*2;i++)
17
  {
18
    testInput_f32[i]= 100 + arm_sin_f32(8*i*2*PI/(2*fftSize)) + arm_sin_f32(32*i*2*PI/(2*fftSize));
19
  };
20
21
  status = arm_rfft_fast_init_f32(&S, fftSize);
22
  arm_rfft_fast_f32(&S, testInput_f32, testout_f32, ifftFlag);
23
  arm_abs_f32(testout_f32, testout_f32, fftSize);
24
  arm_max_f32(testout_f32, fftSize, &maxValue, &testIndex);
25
26
  while(1);
27
}

von LEler (Gast)


Lesenswert?

Falls sich jemand die gleiche Frage stellt, hier ist die Lösung:
1
.../(2*fftSize)
Es werden nur die Punkte 0..fftSize verarbeitet, die zweite Hälte des 
Arrays ist unnütz, daher sind effektiv nur die halbe Anzahl an Perioden 
im Testsignal. => Die Peaks müssen an Position 4 & 16 liegen.

Die RFFT gibt als Ausgabe komplexe Amplitudenwerte, wobei an Index 2n & 
2n+1 jeweils Real- & Imaginärteil stehen.
Weil im Testsignal 4 & 16 Sinusperioden (Sinus=>Imaginärteil, Cosinus => 
Realteil) sind, sind die Peaks bei den Indices 9 (Peak 4, Imaginärer 
Anteil) & 33 (Peak 16, Imaginärer Anteil) gelandet.
Vieleicht hilft es jemand, ansonsten kann das hier entsorgt werden.

Ein LEler

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.