FFT ARM DSP Lib: Shift im Ergebnis?

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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.