Forum: Mikrocontroller und Digitale Elektronik ChaN FFT auf dem XMega


von Basti (Gast)


Lesenswert?

Hallo,

bin gerade dabei eine FFT für Audiosignale zum laufen zu bekommen.
Davon bin ich aber noch weit entfernt... erstmal hab ich mit 
unterschiedlichen Eingangsparametern gespielt...

Eine C Implementierung hat mir vom Quellcode und der Ausgabe zugesagt. 
Leider war diese deutlich langsamer als der von ChaN...

Okay, nun bin ich bei seiner gelandet und kann mir das Ausgabespektrum 
in folgendem Source nicht ganz erklären:
1
void test_fft2(void)
2
{
3
  
4
  int16_t capture[FFT_N];    /* Wave captureing buffer */
5
  complex_t bfly_buff[FFT_N];    /* FFT buffer */
6
  uint16_t spektrum[FFT_N/2];    /* Spectrum output buffer */
7
  
8
  memset(capture,0x00,sizeof(capture));
9
  memset(bfly_buff,0x00,sizeof(bfly_buff));
10
  memset(spektrum,0x00,sizeof(spektrum));
11
  
12
  for (uint16_t i=0; i<FFT_N; i++)
13
  {
14
//    capture[i] = 1000*sin(i*((2*3.1415926535)/32));
15
    if(i < FFT_N/2) {
16
      capture[i] = 1000;
17
      } else {
18
      capture[i] = -1000;
19
    }
20
  }
21
  
22
  gpio_toggle_pin(STATE_LED_IR);
23
  
24
  fft_input(capture, bfly_buff);
25
  fft_execute(bfly_buff);
26
  fft_output(bfly_buff, spektrum);
27
  
28
  gpio_toggle_pin(STATE_LED_IR);
29
  
30
  for (uint16_t i = 0; i < FFT_N/2; i++)
31
  {
32
    udi_cdc_write_buf(&capture[i],2);
33
    udi_cdc_putc(0x00);
34
    udi_cdc_write_buf(&spektrum[i],2);
35
  }
36
37
  delay_ms(1000);
38
  
39
}

Eingangswert - Nullbyte - Spektrumausgabe
1
E8 03 00 0A 00 
2
E8 03 00 AF 02 
3
E8 03 00 86 01 
4
E8 03 00 E4 00 
5
E8 03 00 9C 00 
6
E8 03 00 89 00 
7
E8 03 00 64 00 
8
E8 03 00 62 00 
9
E8 03 00 4A 00 
10
E8 03 00 4D 00 
11
E8 03 00 3A 00 
12
E8 03 00 3E 00 
13
E8 03 00 32 00 
14
E8 03 00 36 00 
15
E8 03 00 2A 00

c0 ist hier fast 0... aber auch nicht wirklich...
bei dem Rechtecksignal, sollte es doch nur gradzahlige Harmonische 
geben. Wieso sind hier immer welche da?

Bei der C FFT hat das selbe Rechtecksignal wunderbar funktioniert...

Beim Sinus passt soweit alles, außer das der Peak etwas breiter und 
gleichmäßiger in die Ränder geht, was der C Code vorher auch nicht getan 
hat.

Muss ich noch irgendwas einstellen, oder was mach ich hier falsch?

Ein paar digitale Rundungsfehler okay, aber das Rechteck ist nicht so 
wie vorgesehen...

Danke,

Basti

von Basti (Gast)


Lesenswert?

Hm, weiß keiner was darüber? Ich habe irgendwie die Vermutung, dass die 
"Seitenbänder" einer Art Rundung/Mittelwertbildung zum Opfer fallen...

Man sieht, dass die gerade Harmonischen kleiner sind als die 
benachbarten ungeraden...

Evtl. ist das sogar für meine Anwendung nicht weiter schlimm... 
verstehen würde ich es trotzdem gern... ;)

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.