コード例 #1
0
ファイル: radix_4_fft.cpp プロジェクト: bensch128/arduino
void fft_radix4_I( int *fr, int *fi, int ldn)
{
    const int n = (1UL<<ldn);
    int ldm = 0, rdx = 2;

    for (int i0 = 0; i0 < n; i0 += 4)
        {
            int xr,yr,ur,vr, xi,yi,ui,vi;

            int i1 = i0 + 1;
            int i2 = i1 + 1;
            int i3 = i2 + 1;

            sum_dif_I(fr[i0], fr[i1], xr, ur);
            sum_dif_I(fr[i2], fr[i3], yr, vi);
            sum_dif_I(fi[i0], fi[i1], xi, ui);
            sum_dif_I(fi[i3], fi[i2], yi, vr);

            sum_dif_I(ui, vi, fi[i1], fi[i3]);
            sum_dif_I(xi, yi, fi[i0], fi[i2]);
            sum_dif_I(ur, vr, fr[i1], fr[i3]);
            sum_dif_I(xr, yr, fr[i0], fr[i2]);
        }
    
    for (ldm = 2 * rdx; ldm <= ldn; ldm += rdx)
    {
        int m = (1UL<<ldm);
        int m4 = (m>>rdx);

        int phI0 =  NWAVE / m;                            
        int phI  = 0;

        for (int j = 0; j < m4; j++)
        {
        int c,s,c2,s2,c3,s3;

         s  = Sinewave[   phI];
         s2 = Sinewave[ 2*phI];
         s3 = Sinewave[ 3*phI];

         c  = Sinewave[   phI + NWAVE/4];
         c2 = Sinewave[ 2*phI + NWAVE/4];
         c3 = Sinewave[ 3*phI + NWAVE/4];

       for (int r = 0; r < n; r += m)    
       {
                int i0 = j + r;
                int i1 = i0 + m4;
                int i2 = i1 + m4;
                int i3 = i2 + m4;

           int xr,yr,ur,vr, xi,yi,ui,vi;

             mult_shf_I( c2, s2, fr[i1], fi[i1], xr, xi);
             mult_shf_I(  c,  s, fr[i2], fi[i2], yr, vr);
             mult_shf_I( c3, s3, fr[i3], fi[i3], vi, yi);

             int t = yi - vr;
                yi += vr;
                vr = t;

                ur = fr[i0] - xr;
                xr += fr[i0];

              sum_dif_I(ur, vr, fr[i1], fr[i3]);

                 t = yr - vi;
                yr += vi;
                vi = t;

                ui = fi[i0] - xi;
                xi += fi[i0];

              sum_dif_I(ui, vi, fi[i1], fi[i3]);
              sum_dif_I(xr, yr, fr[i0], fr[i2]);
              sum_dif_I(xi, yi, fi[i0], fi[i2]);
            }
          phI += phI0;
        }
    }
}
コード例 #2
0
void fft_radix4_I(int *fr, int *fi, int ldn) {
    const int n = (1UL<<ldn);
    int ldm = 0, rdx = 2;

    ldm = (ldn&1);
    if ( ldm!=0 ) {
        for (int i0=0; i0<n; i0+=8) {
            fft8_dit_core_p1(fr+i0, fi+i0);
        }
    } else {
		for (int i0 = 0; i0 < n; i0 += 4) {
			int xr,yr,ur,vr, xi,yi,ui,vi;

			int i1 = i0 + 1;
			int i2 = i1 + 1;
			int i3 = i2 + 1;

			sum_dif_I(fr[i0], fr[i1], &xr, &ur);
			sum_dif_I(fr[i2], fr[i3], &yr, &vi);
			sum_dif_I(fi[i0], fi[i1], &xi, &ui);
			sum_dif_I(fi[i3], fi[i2], &yi, &vr);

			sum_dif_I(ui, vi, &fi[i1], &fi[i3]);
			sum_dif_I(xi, yi, &fi[i0], &fi[i2]);
			sum_dif_I(ur, vr, &fr[i1], &fr[i3]);
			sum_dif_I(xr, yr, &fr[i0], &fr[i2]);
		}
    }
    for (ldm += 2 * rdx; ldm <= ldn; ldm += rdx) {
        int m = (1UL<<ldm);
        int m4 = (m>>rdx);

        int phI0 =  NWAVE / m;
        int phI  = 0;

        for (int j = 0; j < m4; j++) {
			int c,s,c2,s2,c3,s3;

			s  = pgm_read_word(&Sinewave[   phI]);
			s2 = pgm_read_word(&Sinewave[ 2*phI]);
			s3 = pgm_read_word(&Sinewave[ 3*phI]);

			c  = pgm_read_word(&Sinewave[   phI + NWAVE/4]);
			c2 = pgm_read_word(&Sinewave[ 2*phI + NWAVE/4]);
			c3 = pgm_read_word(&Sinewave[ 3*phI + NWAVE/4]);

			for (int r = 0; r < n; r += m) {
                int i0 = j + r;
                int i1 = i0 + m4;
                int i2 = i1 + m4;
                int i3 = i2 + m4;

                int xr,yr,ur,vr,xi,yi,ui,vi;

				mult_shf_I( c2, s2, fr[i1], fi[i1], &xr, &xi);
				mult_shf_I(  c,  s, fr[i2], fi[i2], &yr, &vr);
				mult_shf_I( c3, s3, fr[i3], fi[i3], &vi, &yi);

				int t = yi - vr;
                yi += vr;
                vr = t;

                ur = fr[i0] - xr;
                xr += fr[i0];

                sum_dif_I(ur, vr, &fr[i1], &fr[i3]);

                t = yr - vi;
                yr += vi;
                vi = t;

                ui = fi[i0] - xi;
                xi += fi[i0];

                sum_dif_I(ui, vi, &fi[i1], &fi[i3]);
                sum_dif_I(xr, yr, &fr[i0], &fr[i2]);
                sum_dif_I(xi, yi, &fi[i0], &fi[i2]);
			}
			phI += phI0;
        }
    }
}