cvdxt.cpp.svn-base

来自「非结构化路识别」· SVN-BASE 代码 · 共 1,339 行 · 第 1/5 页

SVN-BASE
1,339
字号
        /*C-------n/8 butterfly-----------------------------------------------C*/
        for( is = 0, id = 2*n2; is < n - 1; is = 2*id - n2, id *= 4 )
        {
            for( i1 = is + n8; i1 < n; i1 += id )
            {
                double T1, T2, T3, T4, T5;

                T1     = X1(i1) - X3(i1);
                X1(i1) = X1(i1) + X3(i1);
                T2     = X2(i1) - X4(i1);
                X2(i1) = X2(i1) + X4(i1);
                T3     = Y1(i1) - Y3(i1);
                Y1(i1) = Y1(i1) + Y3(i1);
                T4     = Y2(i1) - Y4(i1);
                Y2(i1) = Y2(i1) + Y4(i1);
                T5     = (T4 - T1)*CV_SIN_45;
                T1     = (T4 + T1)*CV_SIN_45;
                T4     = (T3 - T2)*CV_SIN_45;
                T2     = (T3 + T2)*CV_SIN_45;
                X3(i1) = (float)(T4 + T1);
                Y3(i1) = (float)(T4 - T1);
                X4(i1) = (float)(T5 + T2);
                Y4(i1) = (float)(T5 - T2);
            }
        }

        if( n8 <= 1 )
            continue;

        /*C-------General butterfly. Two at a time----------------------------C*/
        {
            double SD1 = icvDxtTab[k+1][1], SS1 = SD1;
            double SD3 = 3.*SD1-4.*SD1*SD1*SD1, SS3 = SD3;
            double CD1 = icvDxtTab[k+1][0], CC1 = CD1;
            double CD3 = 4.*CD1*CD1*CD1-3.*CD1, CC3 = CD3;
            double TT1, TT3;
            int j, jn;

            for( j = 1; j < n8; j++ )
            {
                jn = n4 - 2*j;
                
                for( is = 0, id = 2*n2; is < n; is = 2*id - n2, id *= 4 )
                {
                    for( i1 = is + j; i1 < n + j; i1 += id )
                    {
                        double T1, T2, T3, T4, T5;

                        T1     = X1(i1) - X3(i1);
                        X1(i1) = X1(i1) + X3(i1);
                        T2     = X2(i1) - X4(i1);
                        X2(i1) = X2(i1) + X4(i1);
                        T3     = Y1(i1) - Y3(i1);
                        Y1(i1) = Y1(i1) + Y3(i1);
                        T4     = Y2(i1) - Y4(i1);
                        Y2(i1) = Y2(i1) + Y4(i1);
                        T5 = T1 - T4;
                        T1 = T1 + T4;
                        T4 = T2 - T3;
                        T2 = T2 + T3;
                        X3(i1) = (float)( T1*CC1 - T4*SS1);
                        Y3(i1) = (float)(-T4*CC1 - T1*SS1);
                        X4(i1) = (float)( T5*CC3 + T2*SS3);
                        Y4(i1) = (float)( T2*CC3 - T5*SS3);
                        i2 = i1 + jn;
                        T1     = X1(i2) - X3(i2);
                        X1(i2) = X1(i2) + X3(i2);
                        T2     = X2(i2) - X4(i2);
                        X2(i2) = X2(i2) + X4(i2);
                        T3     = Y1(i2) - Y3(i2);
                        Y1(i2) = Y1(i2) + Y3(i2);
                        T4     = Y2(i2) - Y4(i2);
                        Y2(i2) = Y2(i2) + Y4(i2);
                        T5 = T1 - T4;
                        T1 = T1 + T4;
                        T4 = T2 - T3;
                        T2 = T2 + T3;
                        X3(i2) = (float)( T1*SS1 - T4*CC1);
                        Y3(i2) = (float)(-T4*SS1 - T1*CC1);
                        X4(i2) = (float)(-T5*SS3 - T2*CC3);
                        Y4(i2) = (float)(-T2*SS3 + T5*CC3);
                    }
                }

                TT1 = CC1*CD1 - SS1*SD1;
                SS1 = CC1*SD1 + SS1*CD1;
                CC1 = TT1;
                TT3 = CC3*CD3 - SS3*SD3;
                SS3 = CC3*SD3 + SS3*CD3;
                CC3 = TT3;
            }
        }
    }

    /*C-----Length two butterflies----------------------------------------C*/
    for( is = 0, id = 4; is < n; is = 2*id - 2, id = 4*id )
    {
        for( i1 = is; i1 < n - 1; i1 += id )
        {
            double T1;

            T1       = X1(i1);
            X1(i1)   = (float)(T1 + X1(i1+1));
            X1(i1+1) = (float)(T1 - X1(i1+1));
            T1       = Y1(i1);
            Y1(i1)   = (float)(T1 + Y1(i1+1));
            Y1(i1+1) = (float)(T1 - Y1(i1+1));
        }
    }
 
    /*C-------Digit reverse counter---------------------------------------C*/
    icvBitRev_32fc( v, m, itab );

    return CV_OK;
}


static CvStatus icvFFT_fwd_64fc( CvPoint2D64f* v, int m, int* itab )
{
    int k, n = 1 << m, n2 = n;
    int is, id, i1, i2;

    /*C-----L shaped butterflies------------------------------------------C*/
    for( k = m - 1; k > 0; k--, n2 >>= 1 )
    {
        int n4 = n2 >> 2;
        int n8 = n4 >> 1;
        CvPoint2D64f* v3 = v + 2*n4;

        /* CSTAGE */
        /*C-------Zero butterfly----------------------------------------------C*/

        for( is = 0, id = 2*n2; is < n; is = 2*id - n2, id *= 4 )
        {
            for( i1 = is; i1 < n; i1 += id )
            {
                double T1, T2;
            
                T1     = X1(i1) - X3(i1);
                X1(i1) = X1(i1) + X3(i1);
                T2     = Y2(i1) - Y4(i1);
                Y2(i1) = Y2(i1) + Y4(i1);
                X3(i1) = (T1 + T2);
                T2     = T1 - T2;
                T1     = X2(i1) - X4(i1);
                X2(i1) = X2(i1) + X4(i1);
                X4(i1) = T2;
                T2     = Y1(i1) - Y3(i1);
                Y1(i1) = Y1(i1) + Y3(i1);
                Y3(i1) = (T2 - T1);
                Y4(i1) = (T2 + T1);
            }
        }

        if( n4 <= 1 )
            continue;

        /*C-------n/8 butterfly-----------------------------------------------C*/
        for( is = 0, id = 2*n2; is < n - 1; is = 2*id - n2, id *= 4 )
        {
            for( i1 = is + n8; i1 < n; i1 += id )
            {
                double T1, T2, T3, T4, T5;

                T1     = X1(i1) - X3(i1);
                X1(i1) = X1(i1) + X3(i1);
                T2     = X2(i1) - X4(i1);
                X2(i1) = X2(i1) + X4(i1);
                T3     = Y1(i1) - Y3(i1);
                Y1(i1) = Y1(i1) + Y3(i1);
                T4     = Y2(i1) - Y4(i1);
                Y2(i1) = Y2(i1) + Y4(i1);
                T5     = (T4 - T1)*CV_SIN_45;
                T1     = (T4 + T1)*CV_SIN_45;
                T4     = (T3 - T2)*CV_SIN_45;
                T2     = (T3 + T2)*CV_SIN_45;
                X3(i1) = (T4 + T1);
                Y3(i1) = (T4 - T1);
                X4(i1) = (T5 + T2);
                Y4(i1) = (T5 - T2);
            }
        }

        if( n8 <= 1 )
            continue;

        /*C-------General butterfly. Two at a time----------------------------C*/
        {
            double SD1 = icvDxtTab[k+1][1], SS1 = SD1;
            double SD3 = 3.*SD1-4.*SD1*SD1*SD1, SS3 = SD3;
            double CD1 = icvDxtTab[k+1][0], CC1 = CD1;
            double CD3 = 4.*CD1*CD1*CD1-3.*CD1, CC3 = CD3;
            double TT1, TT3;
            int j, jn;

            for( j = 1; j < n8; j++ )
            {
                jn = n4 - 2*j;
                
                for( is = 0, id = 2*n2; is < n; is = 2*id - n2, id *= 4 )
                {
                    for( i1 = is + j; i1 < n + j; i1 += id )
                    {
                        double T1, T2, T3, T4, T5;

                        T1     = X1(i1) - X3(i1);
                        X1(i1) = X1(i1) + X3(i1);
                        T2     = X2(i1) - X4(i1);
                        X2(i1) = X2(i1) + X4(i1);
                        T3     = Y1(i1) - Y3(i1);
                        Y1(i1) = Y1(i1) + Y3(i1);
                        T4     = Y2(i1) - Y4(i1);
                        Y2(i1) = Y2(i1) + Y4(i1);
                        T5 = T1 - T4;
                        T1 = T1 + T4;
                        T4 = T2 - T3;
                        T2 = T2 + T3;
                        X3(i1) = ( T1*CC1 - T4*SS1);
                        Y3(i1) = (-T4*CC1 - T1*SS1);
                        X4(i1) = ( T5*CC3 + T2*SS3);
                        Y4(i1) = ( T2*CC3 - T5*SS3);
                        i2 = i1 + jn;
                        T1     = X1(i2) - X3(i2);
                        X1(i2) = X1(i2) + X3(i2);
                        T2     = X2(i2) - X4(i2);
                        X2(i2) = X2(i2) + X4(i2);
                        T3     = Y1(i2) - Y3(i2);
                        Y1(i2) = Y1(i2) + Y3(i2);
                        T4     = Y2(i2) - Y4(i2);
                        Y2(i2) = Y2(i2) + Y4(i2);
                        T5 = T1 - T4;
                        T1 = T1 + T4;
                        T4 = T2 - T3;
                        T2 = T2 + T3;
                        X3(i2) = ( T1*SS1 - T4*CC1);
                        Y3(i2) = (-T4*SS1 - T1*CC1);
                        X4(i2) = (-T5*SS3 - T2*CC3);
                        Y4(i2) = (-T2*SS3 + T5*CC3);
                    }
                }

                TT1 = CC1*CD1 - SS1*SD1;
                SS1 = CC1*SD1 + SS1*CD1;
                CC1 = TT1;
                TT3 = CC3*CD3 - SS3*SD3;
                SS3 = CC3*SD3 + SS3*CD3;
                CC3 = TT3;
            }
        }
    }

    /*C-----Length two butterflies----------------------------------------C*/
    for( is = 0, id = 4; is < n; is = 2*id - 2, id = 4*id )
    {
        for( i1 = is; i1 < n - 1; i1 += id )
        {
            double T1;

            T1       = X1(i1);
            X1(i1)   = (T1 + X1(i1+1));
            X1(i1+1) = (T1 - X1(i1+1));
            T1       = Y1(i1);
            Y1(i1)   = (T1 + Y1(i1+1));
            Y1(i1+1) = (T1 - Y1(i1+1));
        }
    }
 
    /*C-------Digit reverse counter---------------------------------------C*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?