cvdxt.cpp.svn-base

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

SVN-BASE
1,339
字号
    icvBitRev_64fc( v, m, itab );

    return CV_OK;
}

#undef X1
#undef Y1
#undef X2
#undef Y2
#undef X3
#undef Y3
#undef X4
#undef Y4


/* FFT of real vector */
/* output vector format: */
/* re[0], re[1], im[1], ... , re[n/2-1], im[n/2-1], re[n/2] */
#define ICV_REAL_FWD_AND_CCS_INV_FFT_FUNCS( flavor, datatype )              \
static CvStatus icvFFT_fwd_##flavor( datatype *v, int m, int* itab )        \
{                                                                           \
    if( m == 0 )                                                            \
    {                                                                       \
    }                                                                       \
    else if( m == 1 )                                                       \
    {                                                                       \
        double t = v[0] + v[1];                                             \
        v[1] = v[0] - v[1];                                                 \
        v[0] = (datatype)t;                                                 \
    }                                                                       \
    else                                                                    \
    {                                                                       \
        double w1_re, w1_im, wi_re, wi_im, t0, t;                           \
        int n = 1 << m;                                                     \
        int n2 = n >> 1;                                                    \
        int j;                                                              \
                                                                            \
        icvFFT_fwd_##flavor##c( (CvPoint2D##flavor*)v, m - 1, itab );       \
                                                                            \
        t = v[0] - v[1];                                                    \
        v[0] = v[0] + v[1];                                                 \
        v[1] = (datatype)t;                                                 \
                                                                            \
        wi_re = w1_re = icvDxtTab[m][0];                                    \
        wi_im = w1_im = -icvDxtTab[m][1];                                   \
                                                                            \
        t0 = v[n2];                                                         \
        t = v[n-1];                                                         \
        v[n-1] = v[1];                                                      \
                                                                            \
        for( j = 2; j < n2; j += 2 )                                        \
        {                                                                   \
            double h1_re, h1_im, h2_re, h2_im;                              \
                                                                            \
            /* calc even */                                                 \
            h1_re = 0.5*(v[j] + v[n-j]);                                    \
            h1_im = 0.5*(v[j+1] - t);                                       \
                                                                            \
            /* calc odd */                                                  \
            h2_re = 0.5*(v[j+1] + t);                                       \
            h2_im = 0.5*(v[n-j] - v[j]);                                    \
                                                                            \
            /* rotate */                                                    \
            t = h2_re*wi_re - h2_im*wi_im;                                  \
            h2_im = h2_re*wi_im + h2_im*wi_re;                              \
            h2_re = t;                                                      \
                                                                            \
            t = wi_re*w1_re - wi_im*w1_im;                                  \
            wi_im = wi_re*w1_im + wi_im*w1_re;                              \
            wi_re = t;                                                      \
                                                                            \
            t = v[n-j-1];                                                   \
                                                                            \
            v[j-1] = (datatype)(h1_re + h2_re);                             \
            v[n-j-1] = (datatype)(h1_re - h2_re);                           \
            v[j] = (datatype)(h1_im + h2_im);                               \
            v[n-j] = (datatype)(h2_im - h1_im);                             \
        }                                                                   \
                                                                            \
        v[n2-1] = (datatype)t0;                                             \
        v[n2] = (datatype)-t;                                               \
    }                                                                       \
                                                                            \
    return CV_OK;                                                           \
}                                                                           \
                                                                            \
/* FFT of complex conjugate-symmetric vector */                             \
/* input vector format: */                                                  \
/* re[0], re[1], im[1], ... , re[n/2-1], im[n/2-1], re[n/2] */              \
static CvStatus icvFFT_inv_##flavor( datatype *v, int m, int* itab )        \
{                                                                           \
    if( m == 0 )                                                            \
    {                                                                       \
    }                                                                       \
    else if( m == 1 )                                                       \
    {                                                                       \
        double t = v[0] + v[1];                                             \
        v[1] = v[0] - v[1];                                                 \
        v[0] = (datatype)t;                                                 \
    }                                                                       \
    else                                                                    \
    {                                                                       \
        double w1_re, w1_im, wi_re, wi_im, t0, t;                           \
        int n = 1 << m;                                                     \
        int n2 = n >> 1;                                                    \
        int j;                                                              \
                                                                            \
        t = v[1];                                                           \
        t0 = (v[0] + v[n-1]);                                               \
        v[1] = (datatype)(v[n-1] - v[0]);                                   \
        v[0] = (datatype)t0;                                                \
                                                                            \
        wi_re = w1_re = icvDxtTab[m][0];                                    \
        wi_im = w1_im = icvDxtTab[m][1];                                    \
                                                                            \
        for( j = 2; j < n2; j += 2 )                                        \
        {                                                                   \
            double h1_re, h1_im, h2_re, h2_im;                              \
                                                                            \
            h1_re = (t + v[n-j-1]);                                         \
            h1_im = (v[j] - v[n-j]);                                        \
                                                                            \
            h2_re = (t - v[n-j-1]);                                         \
            h2_im = (v[j] + v[n-j]);                                        \
                                                                            \
            t = h2_re*wi_re - h2_im*wi_im;                                  \
            h2_im = h2_re*wi_im + h2_im*wi_re;                              \
            h2_re = t;                                                      \
                                                                            \
            t = wi_re*w1_re - wi_im*w1_im;                                  \
            wi_im = wi_re*w1_im + wi_im*w1_re;                              \
            wi_re = t;                                                      \
                                                                            \
            t = v[j+1];                                                     \
            v[j] = (datatype)(h1_re - h2_im);                               \
            v[j+1] = -(datatype)(h1_im + h2_re);                            \
                                                                            \
            v[n-j] = (datatype)(h1_re + h2_im);                             \
            v[n-j+1]= (datatype)(h1_im - h2_re);                            \
        }                                                                   \
                                                                            \
        v[n2+1] = (datatype)(v[n2]*2);                                      \
        v[n2] = (datatype)(t*2);                                            \
                                                                            \
        icvFFT_fwd_##flavor##c( (CvPoint2D##flavor*)v, m-1, itab );         \
        for( j = 0; j < n; j += 2 )                                         \
            v[j+1] = -v[j+1];                                               \
    }                                                                       \
                                                                            \
    return CV_OK;                                                           \
}


ICV_REAL_FWD_AND_CCS_INV_FFT_FUNCS( 32f, float )
ICV_REAL_FWD_AND_CCS_INV_FFT_FUNCS( 64f, double )


#define ICV_DFT_FUNCS( flavor, complex_datatype, real_datatype )            \
/* simple (direct) DFT of arbitrary size complex vector (fwd or inv) */     \
static CvStatus icvDFT_##flavor##c( const complex_datatype* src,            \
                                    complex_datatype* dst, int n, int inv ) \
{                                                                           \
    double scale = CV_PI*2/n*(inv ? 1 : -1);                                \
    double c00 = cos(scale);                                                \
    double s00 = sin(scale);                                                \
    double c0 = c00, s0 = s00;                                              \
    int i, j, n2 = (n+1) >> 1;                                              \
                                                                            \
    if( n % 2 == 0 )                                                        \
    {                                                                       \
        double s0_re = 0, s0_im = 0;                                        \
        double s1_re = 0, s1_im = 0;                                        \
        complex_datatype p, m;                                              \
                                                                            \
        p.x = src[0].x + src[n2].x;                                         \
        m.x = src[0].x - src[n2].x;                                         \
        p.y = src[0].y + src[n2].y;                                         \
        m.y = src[0].y - src[n2].y;                                         \
                                                                            \
        for( i = 0; i < n; i += 2 )                                         \
        {                                                                   \
            double t0, t1;                                                  \
                                                                            \
            t0 = src[i].x;                                                  \
            t1 = src[i+1].x;                                                \
                                                                            \
            s0_re += t0 + t1;                                               \
            s1_re += t0 - t1;                                               \
                                                                            \
            t0 = src[i].y;                                                  \
            t1 = src[i+1].y;                                                \
                                                                            \
            s0_im += t0 + t1;                                               \
            s1_im += t0 - t1;                                               \
                                                                            \
            dst[i] = p;                                                     \
            dst[i+1] = m;                                                   \
        }                                                                   \
                                                                            \
        dst[0].x = (real_datatype)s0_re;                                    \
        dst[0].y = (real_datatype)s0_im;                                    \
        dst[n2].x = (real_datatype)s1_re;                                   \
        dst[n2].y = (real_datatype)s1_im;                                   \
    }                                                                       \
    else                                                                    \
    {                                                                       \
        double s_re = 0, s_im = 0;                                          \
        complex_datatype p0 = src[0];                                       \
                                                                            \
        for( i = 0; i < n; i++ )                                            \
        {                                                                   \
            s_re += src[i].x;                                               \
            s_im += src[i].y;                                               \
            dst[i] = p0;                                                    \
        }                                                                   \
                                                                            \
        dst[0].x = (real_datatype)s_re;                                     \
        dst[0].y = (real_datatype)s_im;                                     \
    }                                                                       \
                                                                            \
    for( i = 1; i < n2; i++ )                                               \
    {                                                                       \
        double s0_re = dst[i].x, s0_im = dst[i].y;                          \
        double s1_re = dst[n-i].x, s1_im = dst[n-i].y;                      \
        double c = c0, s = s0, t;                                           \
                                                                            \
        for( j = 1; j < n2; j++ )                                           \
        {                                                                   \
            double t0 = c*(src[j].x + src[n-j].x);                          \
            double t1 = s*(src[j].y - src[n-j].y);                          \
                                                                            \
            s0_re += t0 - t1;                                               \
            s1_re += t0 + t1;                                               \
                                                                            \
            t0 = c*(src[j].y + src[n-j].y);                                 \
            t1 = s*(src[j].x - src[n-j].x);                                 \
                                                                            \
            s0_im += t0 + t1;                                               \
            s1_im += t0 - t1;                                               \
                                                                            \
            t = c*c0 - s*s0;                                                \
            s = s*c0 + c*s0;                                                \
            c = t;                                                          \
        }                                                                   \
                                                                            \
        dst[i].x = (real_datatype)s0_re;                                    \
        dst[i].y = (real_datatype)s0_im;                                    \
        dst[n-i].x = (real_datatype)s1_re;                                  \
        dst[n-i].y = (real_datatype)s1_im;                                  \
                                                                            \
        t = c0*c00 - s0*s00;                                                \
        s0 = s0*c00 + c0*s00;                                               \
        c0 = t;                                                             \
    }                                                                       \
                                                                            \
    return CV_OK;                                                           \
}                                                                           \
                                                                            \
                                                                            \
/* simple (direct) forward DFT of arbitrary size real vector */             \
static CvStatus icvDFT_fwd_##flavor( const real_datatype* src,              \
                                     real_datatype* dst, int n, int )       \
{                                                                           \
    double scale = -CV_PI*2/n;                                              \
    double c00 = cos(scale);                                                \
    double s00 = sin(scale);                                                \
    double c0 = c00, s0 = s00;                                              \
    int i, j, n2 = (n+1) >> 1;                                              \

⌨️ 快捷键说明

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