コード例 #1
0
ファイル: mixfft.cpp プロジェクト: FreeSivan/drawfreq
void fft_8()
{
    double  aRe[4], aIm[4], bRe[4], bIm[4], gem;

    aRe[0] = zRe[0];    bRe[0] = zRe[1];
    aRe[1] = zRe[2];    bRe[1] = zRe[3];
    aRe[2] = zRe[4];    bRe[2] = zRe[5];
    aRe[3] = zRe[6];    bRe[3] = zRe[7];

    aIm[0] = zIm[0];    bIm[0] = zIm[1];
    aIm[1] = zIm[2];    bIm[1] = zIm[3];
    aIm[2] = zIm[4];    bIm[2] = zIm[5];
    aIm[3] = zIm[6];    bIm[3] = zIm[7];

    fft_4(aRe, aIm); fft_4(bRe, bIm);

    gem    = c8*(bRe[1] + bIm[1]);
    bIm[1] = c8*(bIm[1] - bRe[1]);
    bRe[1] = gem;
    gem    = bIm[2];
    bIm[2] =-bRe[2];
    bRe[2] = gem;
    gem    = c8*(bIm[3] - bRe[3]);
    bIm[3] =-c8*(bRe[3] + bIm[3]);
    bRe[3] = gem;
    
    zRe[0] = aRe[0] + bRe[0]; zRe[4] = aRe[0] - bRe[0];
    zRe[1] = aRe[1] + bRe[1]; zRe[5] = aRe[1] - bRe[1];
    zRe[2] = aRe[2] + bRe[2]; zRe[6] = aRe[2] - bRe[2];
    zRe[3] = aRe[3] + bRe[3]; zRe[7] = aRe[3] - bRe[3];

    zIm[0] = aIm[0] + bIm[0]; zIm[4] = aIm[0] - bIm[0];
    zIm[1] = aIm[1] + bIm[1]; zIm[5] = aIm[1] - bIm[1];
    zIm[2] = aIm[2] + bIm[2]; zIm[6] = aIm[2] - bIm[2];
    zIm[3] = aIm[3] + bIm[3]; zIm[7] = aIm[3] - bIm[3];
}   /* fft_8 */
コード例 #2
0
ファイル: mixfft.hpp プロジェクト: EQ4/vasp
    void twiddleTransf(int sofarRadix, int radix, int remainRadix,
                        T3 yRe[], T4 yIm[])

    {   /* twiddleTransf */ 
        double cosw, sinw, gem;

        initTrig(radix);
        omega = 2*M_PI/(double)(sofarRadix*radix);
        cosw =  cos(omega);
        sinw = -sin(omega);
        tw_re = 1.0;
        tw_im = 0;
        dataOffset=0;
        groupOffset=dataOffset;
        adr=groupOffset;
        for (dataNo=0; dataNo<sofarRadix; dataNo++)
        {
            if (sofarRadix>1)
            {
                twiddleRe[0] = 1.0; 
                twiddleIm[0] = 0.0;
                twiddleRe[1] = tw_re;
                twiddleIm[1] = tw_im;
                for (twNo=2; twNo<radix; twNo++)
                {
                    twiddleRe[twNo]=tw_re*twiddleRe[twNo-1]
                                   - tw_im*twiddleIm[twNo-1];
                    twiddleIm[twNo]=tw_im*twiddleRe[twNo-1]
                                   + tw_re*twiddleIm[twNo-1];
                }
                gem   = cosw*tw_re - sinw*tw_im;
                tw_im = sinw*tw_re + cosw*tw_im;
                tw_re = gem;                      
            }
            for (groupNo=0; groupNo<remainRadix; groupNo++)
            {
                if ((sofarRadix>1) && (dataNo > 0))
                {
                    zRe[0]=yRe[adr];
                    zIm[0]=yIm[adr];
                    blockNo=1;
                    do {
                        adr = adr + sofarRadix;
                        zRe[blockNo]=  twiddleRe[blockNo] * yRe[adr]
                                     - twiddleIm[blockNo] * yIm[adr];
                        zIm[blockNo]=  twiddleRe[blockNo] * yIm[adr]
                                     + twiddleIm[blockNo] * yRe[adr]; 
                    
                        blockNo++;
                    } while (blockNo < radix);
                }
                else
                    for (blockNo=0; blockNo<radix; blockNo++)
                    {
                       zRe[blockNo]=yRe[adr];
                       zIm[blockNo]=yIm[adr];
                       adr=adr+sofarRadix;
                    }
                switch(radix) {
    			// T.Grill - replaced the inlined code by their function counterparts
    			  case  2  : fft_2(zRe,zIm); break;
    			  case  3  : fft_3(zRe,zIm); break;
                  case  4  : fft_4(zRe,zIm); break;
                  case  5  : fft_5(zRe,zIm); break;
                  case  8  : fft_8(); break;
                  case 10  : fft_10(); break;
                  default  : fft_odd(radix); break;
                }
                adr=groupOffset;
                for (blockNo=0; blockNo<radix; blockNo++)
                {
                    yRe[adr]=zRe[blockNo]; yIm[adr]=zIm[blockNo];
                    adr=adr+sofarRadix;
                }
                groupOffset=groupOffset+sofarRadix*radix;
                adr=groupOffset;
            }
            dataOffset=dataOffset+1;
            groupOffset=dataOffset;
            adr=groupOffset;
        }
    }   /* twiddleTransf */