logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[STM32]+[FFT] Dziwne wyniki

Longos 29 Lip 2011 13:33 2678 2
  • #1 9771383
    Longos
    Poziom 12  
    Staram się zaimplementować 64-punktowe FFT na procesorze STM32F103RB. Korzystam z biblioteki dostarczonej przez producenta. Tablica table_fft.h wygląda tak:
    uint16_t TableFFT[]= {0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000,
                     0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41,
                     0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000,
                     0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41,
                     0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000 // N=64                                  
    };
    reszta została wykomentowana.
    Generacja przykładowego sinusa i analiza FFT:
    
    #define PI 3.14
    #define N 64
    #define STEP (2*PI/(N-1))*2
    u32 in[N], out[N];
    u16 i;
    
    for(i = 0; i < N; i++){
    		in[i] = sin(STEP*i) * 32768 + 32768;
    	}
    
    	cr4_fft_64_stm32(out, in, 64);
    


    Otrzymuję takie tablice:
    [STM32]+[FFT] Dziwne wyniki

    Sinus wygląda dobrze, początek FFT też, ale skąd w końcowym fragmencie takie amplitudy ?

    Jako argumenty dla FFT należy podać 32-bitową wartość 16bit_im_16bit_re. Jako im wszędzie z założenia mam zero.
  • #2 9801213
    Aro_
    Poziom 15  
    Widmo wygląda prawie ok. Widać, że jest problem z ostatnią fazą syntezy widm i druga część jakby zmienia znak na przeciwny. Być może został przekroczony zakres. Zobacz jak to będzie wyglądało dla sinusoidy o mniejszej amplitudzie.
    Przy czystej sinusoidzie nie powinny pojawiać się żadne dodatkowe prążki, a to widmo wygląda, tak jakby był to przebieg prostokątny. Gdzieś przycina tą wejściową sinusoidę.
  • #3 9812606
    shg
    Poziom 35  
    Longos napisał:
    #define PI 3.14

    #include <math.h>
    i tam masz M_PI, dokładniej.

    Longos napisał:
    #define N 64
    #define STEP (2*PI/(N-1))*2

    Jeżeli chcesz jeden okres to dziel przez N, a nie N-1.



    Longos napisał:
    	cr4_fft_64_stm32(out, in, 64);
    Sinus wygląda dobrze, początek FFT też, ale skąd w końcowym fragmencie takie amplitudy ?


    Bo:
    Cytat:
    ;* Function Name : cr4_fft_64_stm32
    ;* Description : complex radix-4 64 points FFT

    Bo: u32 in[N], out[N];
    Robisz zespoloną transformację (stąd 64 punkty w wyniku), a do tego wynik traktujesz jako bez znaku, a on jest ze znakiem i w kodzie U2 tak to wygląda.
REKLAMA