示例#1
0
        protected void kf_bfly5(Array <kiss_fft_cpx <kiss_fft_scalar> > Fout, int fstride, int m)
        {
            Array <kiss_fft_cpx <kiss_fft_scalar> > Fout0, Fout1, Fout2, Fout3, Fout4;
            int u;

            kiss_fft_cpx <kiss_fft_scalar>[]        scratch  = new kiss_fft_cpx <kiss_fft_scalar> [13];
            Array <kiss_fft_cpx <kiss_fft_scalar> > twiddles = new Array <kiss_fft_cpx <kiss_fft_scalar> >(Twiddles);
            Array <kiss_fft_cpx <kiss_fft_scalar> > tw;
            kiss_fft_cpx <kiss_fft_scalar>          ya, yb;

            ya = twiddles[fstride * m];
            yb = twiddles[fstride * 2 * m];

            Fout0 = Fout;
            Fout1 = Fout0 + m;
            Fout2 = Fout0 + 2 * m;
            Fout3 = Fout0 + 3 * m;
            Fout4 = Fout0 + 4 * m;

            tw = new Array <kiss_fft_cpx <kiss_fft_scalar> >(twiddles);
            for (u = 0; u < m; ++u)
            {
                Fout[0]    = A.FixDivide(Fout[0], 5);
                Fout1[0]   = A.FixDivide(Fout1[0], 5);
                Fout2[0]   = A.FixDivide(Fout2[0], 5);
                Fout3[0]   = A.FixDivide(Fout3[0], 5);
                Fout4[0]   = A.FixDivide(Fout4[0], 5);
                scratch[0] = new kiss_fft_cpx <kiss_fft_scalar>(Fout[0]);

                scratch[1] = A.Multiply(Fout1[0], tw[u * fstride]);
                scratch[2] = A.Multiply(Fout2[0], tw[2 * u * fstride]);
                scratch[3] = A.Multiply(Fout3[0], tw[3 * u * fstride]);
                scratch[4] = A.Multiply(Fout4[0], tw[4 * u * fstride]);

                scratch[7]  = A.Add(scratch[1], scratch[4]);
                scratch[10] = A.Subtract(scratch[1], scratch[4]);
                scratch[8]  = A.Add(scratch[2], scratch[3]);
                scratch[9]  = A.Subtract(scratch[2], scratch[3]);

                Fout[0].r = A.Add(Fout[0].r, A.Add(scratch[7].r, scratch[8].r));
                Fout[0].i = A.Add(Fout[0].i, A.Add(scratch[7].i, scratch[8].i));

                scratch[5].r = A.Add(scratch[0].r, A.Add(A.Multiply(scratch[7].r, ya.r), A.Multiply(scratch[8].r, yb.r)));
                scratch[5].i = A.Add(scratch[0].i, A.Add(A.Multiply(scratch[7].i, ya.r), A.Multiply(scratch[8].i, yb.r)));

                scratch[6].r = A.Add(A.Multiply(scratch[10].i, ya.i), A.Multiply(scratch[9].i, yb.i));
                scratch[6].r = A.Negate(A.Add(A.Multiply(scratch[10].r, ya.i), A.Multiply(scratch[9].r, yb.i)));

                Fout1[0] = A.Subtract(scratch[5], scratch[6]);
                Fout4[0] = A.Add(scratch[5], scratch[6]);

                scratch[11].r = A.Add(scratch[0].r, A.Add(A.Multiply(scratch[7].r, yb.r), A.Multiply(scratch[8].r, ya.r)));
                scratch[11].i = A.Add(scratch[0].i, A.Add(A.Multiply(scratch[7].i, yb.r), A.Multiply(scratch[8].i, ya.r)));
                scratch[12].r = A.Subtract(A.Multiply(scratch[9].i, ya.i), A.Multiply(scratch[10].i, yb.i));
                scratch[12].i = A.Subtract(A.Multiply(scratch[10].r, yb.i), A.Multiply(scratch[9].r, ya.i));

                Fout2[0] = A.Add(scratch[11], scratch[12]);
                Fout3[0] = A.Subtract(scratch[11], scratch[12]);

                ++Fout0;
                ++Fout1;
                ++Fout2;
                ++Fout3;
                ++Fout4;
            }
        }