Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Jak wykonać 8 punktowe IFFT i FFT na dsPIC33FJ128GP802

drejaspan 10 Paź 2010 21:37 1643 2
  • #1 10 Paź 2010 21:37
    drejaspan
    Poziom 9  

    Pozdrawiam serdecznie,

    Mam mały problem, ponieważ usiłuję zrobić 8-punktową IFFT a następnie FFT na dsPICu jak w temacie.
    Danymi wejściowymi miały być wartości zmapowane 16QAM, czyli dajmy na to (-3, -1, +1, +3).
    Jak się okazało dsPIC liczy tylko dla wartości float [-0.5,0.5) czyli [0xC000,0x3FFF], a przykład Microchipa sugeruje dawać wartości z przedziału [-1,1) czyli [0x8000,0x7FFF] i przesuwać bity o 1 w prawo.
    Podaję więc wartości [-1, -0.33, +0.33, +1], i przesuwam te bity, następnie liczę IFFT, potem FFT i wychodzi zupełnie co innego niż to co podaje na IFFT po przesunięciu, a powinienem otrzymać to samo prawda?

    Moje pytanie brzmi, co robię źle? Jak to naprawić? Czuje, że jestem blisko i robie głupi błąd, może powinienem gdzieś zastosować funkcję BitReverseComplex?

    Proszę o pomoc.

    Oto kod:

    Code:

    int i;
    float wejRe[8]={-1,-0.33,-1,-0.33,-1,0.33,-1,-0.33};    //Here you can change input Real values...
    float wejIm[8]={-1,0.33,1,0.33,1,0.33,1,-0.33};          // and here the Imaginary..
    float daneRe[8];
    float daneIm[8];

    fractcomplex data[FFT_BLOCK_LENGTH]       
    __attribute__ ((space(ymemory),far,   
    aligned (FFT_BLOCK_LENGTH * 2 *2)));             

    fractcomplex twiddleFactors[FFT_BLOCK_LENGTH/2]       
    __attribute__ ((section (".xbss, bss, xmemory"), aligned (FFT_BLOCK_LENGTH*2)));


    // main
    int main(void){

                TwidFactorInit (LOG2_BLOCK_LENGTH, &twiddleFactors[0], 0);       

                for(i=0;i<8;i++){   
                    data.real=Float2Fract(wejRe);
                    data.imag=Float2Fract(wejIm);
                }
               
                  // shift right
                fractcomplex *p_cmpx = &data[0];
                for(i=0;i<8;i++){                                                         
                    (*p_cmpx).real = (*p_cmpx).real>>1;
                    (*p_cmpx).imag = (*p_cmpx).imag>>1;




                    (*p_cmpx++);
                }

                IFFTComplexIP (LOG2_BLOCK_LENGTH, &data[0], &twiddleFactors[0], COEFFS_IN_DATA);
               
                //BitReverseComplex (LOG2_BLOCK_LENGTH, &data[0]);   // <<<<< what does it do?? it gives strange values..

                FFTComplexIP (LOG2_BLOCK_LENGTH, &data[0], &twiddleFactors[0], COEFFS_IN_DATA);
                  // the result of FFT isn't the same as the data put into IFFT...
               
             //shift left..
                fractcomplex *p_cmpx2 = &data[0];
                for(i=0;i<8;i++){                                                         
                    (*p_cmpx2).real = (*p_cmpx2).real<<1;
                    (*p_cmpx2).imag = (*p_cmpx2).imag<<1;
                    (*p_cmpx2++);
                }
               
                 // the results in daneRe and daneIm aren't the same... as in wejRe and wejIm...
                for(i=0;i<8;i++){
                    daneRe=Fract2Float(data.real);
                    daneIm=Fract2Float(data.imag);
                }

        return 0;
    }
    // end main


    Załączam też projekt MPLABa.

    Z poważaniem,
    Łukasz D.

    0 2
  • #2 11 Paź 2010 08:38
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Przejrzyj dokumentację do biblioteki DSP - tam są przykłady i wszystko wiadomo.

    4\/3!!

    0
  • #3 11 Paź 2010 09:35
    drejaspan
    Poziom 9  

    Drogi Freddie,

    To nie jest żadna pomoc, przestudiowałem ten przykład bardzo dokładnie i nie potrafie sobie poradzić, dlatego piszę tutaj, co jest już ostatecznością...

    Z poważaniem,
    Łukasz.

    0