FFT ARM DSP Lib: Shift im Ergebnis?

Gast #3950866
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
}
Gast #3951872
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren