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 + -
显示快捷键?