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