⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transform8.cc

📁 各种工程计算的库函数
💻 CC
📖 第 1 页 / 共 5 页
字号:
                a[k - l] = t[j] - t[j + 1];                a[k + l] = t[j] + t[j + 1];            }            l <<= 1;            mh = m >> 1;            for (j = 0; j < mh; j++) {                k = m - j;                t[j] = t[m + k] - t[m + j];                t[k] = t[m + k] + t[m + j];            }            t[mh] = t[m + mh];            m = mh;        }        a[l] = t[0];        a[n] = t[2] - t[1];        a[0] = t[2] + t[1];    } else {        a[1] = a[0];        a[2] = t[0];        a[0] = t[1];    }}void clTransform8::dfst(long n, double *a, double *t, long *ip, double *w){    long j, k, l, m, mh, nw, nc;    double xr, xi, yr, yi;        nw = ip[0];    if (n > (nw << 3)) {        nw = n >> 3;        makewt(nw, ip, w);    }    nc = ip[1];    if (n > (nc << 1)) {        nc = n >> 1;        makect(nc, ip, w + nw);    }    if (n > 2) {        m = n >> 1;        mh = m >> 1;        for (j = 1; j < mh; j++) {            k = m - j;            xr = a[j] + a[n - j];            xi = a[j] - a[n - j];            yr = a[k] + a[n - k];            yi = a[k] - a[n - k];            a[j] = xr;            a[k] = yr;            t[j] = xi + yi;            t[k] = xi - yi;        }        t[0] = a[mh] - a[n - mh];        a[mh] += a[n - mh];        a[0] = a[m];        dstsub(m, a, nc, w + nw);        if (m > 4) {            bitrv2(m, ip + 2, a);            cftfsub(m, a, w);            rftfsub(m, a, nc, w + nw);        } else if (m == 4) {            cftfsub(m, a, w);        }        a[n - 1] = a[1] - a[0];        a[1] = a[0] + a[1];        for (j = m - 2; j >= 2; j -= 2) {            a[2 * j + 1] = a[j] - a[j + 1];            a[2 * j - 1] = -a[j] - a[j + 1];        }        l = 2;        m = mh;        while (m >= 2) {            dstsub(m, t, nc, w + nw);            if (m > 4) {                bitrv2(m, ip + 2, t);                cftfsub(m, t, w);                rftfsub(m, t, nc, w + nw);            } else if (m == 4) {                cftfsub(m, t, w);            }            a[n - l] = t[1] - t[0];            a[l] = t[0] + t[1];            k = 0;            for (j = 2; j < m; j += 2) {                k += l << 2;                a[k - l] = -t[j] - t[j + 1];                a[k + l] = t[j] - t[j + 1];            }            l <<= 1;            mh = m >> 1;            for (j = 1; j < mh; j++) {                k = m - j;                t[j] = t[m + k] + t[m + j];                t[k] = t[m + k] - t[m + j];            }            t[0] = t[m + mh];            m = mh;        }        a[l] = t[0];    }    a[0] = 0;}/* -------- initializing routines -------- */void clTransform8::makewt(long nw, long *ip, double *w){    long j, nwh;    double delta, x, y;        ip[0] = nw;    ip[1] = 1;    if (nw > 2) {        nwh = nw >> 1;#       ifndef TRANSFORM_EXT_PREC        delta = atan(1.0) / nwh;#       else        delta = (double) (atanl(1.0l) / nwh);#       endif        w[0] = 1;        w[1] = 0;#       ifndef TRANSFORM_EXT_PREC        w[nwh] = cos(delta * nwh);#       else        w[nwh] = (double) cosl(delta * nwh);#       endif        w[nwh + 1] = w[nwh];        if (nwh > 2) {            for (j = 2; j < nwh; j += 2) {#               ifndef TRANSFORM_EXT_PREC                x = cos(delta * j);                y = sin(delta * j);#               else                x = (double) cosl(delta * j);                y = (double) sinl(delta * j);#               endif                w[j] = x;                w[j + 1] = y;                w[nw - j] = y;                w[nw - j + 1] = x;            }            for (j = nwh - 2; j >= 2; j -= 2) {                x = w[2 * j];                y = w[2 * j + 1];                w[nwh + j] = x;                w[nwh + j + 1] = y;            }            bitrv2(nw, ip + 2, w);        }    }}void clTransform8::makect(long nc, long *ip, double *c){    long j, nch;    double delta;        ip[1] = nc;    if (nc > 1) {        nch = nc >> 1;#       ifndef TRANSFORM_EXT_PREC        delta = atan(1.0) / nch;        c[0] = cos(delta * nch);#       else        delta = (double) (atanl(1.0l) / nch);        c[0] = (double) (cosl(delta * nch));#       endif        c[nch] = 0.5 * c[0];        for (j = 1; j < nch; j++) {#           ifndef TRANSFORM_EXT_PREC            c[j] = 0.5 * cos(delta * j);            c[nc - j] = 0.5 * sin(delta * j);#           else            c[j] = (double) (0.5l * cosl(delta * j));            c[nc - j] = (double) (0.5l * sinl(delta * j));#           endif        }    }}/* -------- child routines -------- */T8_INLINE void clTransform8::bitrv2(long n, long *ip, double *a){    long j, j1, k, k1, l, m, m2;    double xr, xi, yr, yi;        ip[0] = 0;    l = n;    m = 1;    while ((m << 3) < l) {        l >>= 1;        for (j = 0; j < m; j++) {            ip[m + j] = ip[j] + l;        }        m <<= 1;    }    m2 = 2 * m;    if ((m << 3) == l) {        for (k = 0; k < m; k++) {            for (j = 0; j < k; j++) {                j1 = 2 * j + ip[k];                k1 = 2 * k + ip[j];                xr = a[j1];                xi = a[j1 + 1];                yr = a[k1];                yi = a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;                j1 += m2;                k1 += 2 * m2;                xr = a[j1];                xi = a[j1 + 1];                yr = a[k1];                yi = a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;                j1 += m2;                k1 -= m2;                xr = a[j1];                xi = a[j1 + 1];                yr = a[k1];                yi = a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;                j1 += m2;                k1 += 2 * m2;                xr = a[j1];                xi = a[j1 + 1];                yr = a[k1];                yi = a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;            }            j1 = 2 * k + m2 + ip[k];            k1 = j1 + m2;            xr = a[j1];            xi = a[j1 + 1];            yr = a[k1];            yi = a[k1 + 1];            a[j1] = yr;            a[j1 + 1] = yi;            a[k1] = xr;            a[k1 + 1] = xi;        }    } else {        for (k = 1; k < m; k++) {            for (j = 0; j < k; j++) {                j1 = 2 * j + ip[k];                k1 = 2 * k + ip[j];                xr = a[j1];                xi = a[j1 + 1];                yr = a[k1];                yi = a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;                j1 += m2;                k1 += m2;                xr = a[j1];                xi = a[j1 + 1];                yr = a[k1];                yi = a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;            }        }    }}T8_INLINE void clTransform8::bitrv2conj(long n, long *ip, double *a){    long j, j1, k, k1, l, m, m2;    double xr, xi, yr, yi;        ip[0] = 0;    l = n;    m = 1;    while ((m << 3) < l) {        l >>= 1;        for (j = 0; j < m; j++) {            ip[m + j] = ip[j] + l;        }        m <<= 1;    }    m2 = 2 * m;    if ((m << 3) == l) {        for (k = 0; k < m; k++) {            for (j = 0; j < k; j++) {                j1 = 2 * j + ip[k];                k1 = 2 * k + ip[j];                xr = a[j1];                xi = -a[j1 + 1];                yr = a[k1];                yi = -a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;                j1 += m2;                k1 += 2 * m2;                xr = a[j1];                xi = -a[j1 + 1];                yr = a[k1];                yi = -a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;                j1 += m2;                k1 -= m2;                xr = a[j1];                xi = -a[j1 + 1];                yr = a[k1];                yi = -a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;                j1 += m2;                k1 += 2 * m2;                xr = a[j1];                xi = -a[j1 + 1];                yr = a[k1];                yi = -a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;            }            k1 = 2 * k + ip[k];            a[k1 + 1] = -a[k1 + 1];            j1 = k1 + m2;            k1 = j1 + m2;            xr = a[j1];            xi = -a[j1 + 1];            yr = a[k1];            yi = -a[k1 + 1];            a[j1] = yr;            a[j1 + 1] = yi;            a[k1] = xr;            a[k1 + 1] = xi;            k1 += m2;            a[k1 + 1] = -a[k1 + 1];        }    } else {        a[1] = -a[1];        a[m2 + 1] = -a[m2 + 1];        for (k = 1; k < m; k++) {            for (j = 0; j < k; j++) {                j1 = 2 * j + ip[k];                k1 = 2 * k + ip[j];                xr = a[j1];                xi = -a[j1 + 1];                yr = a[k1];                yi = -a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;                j1 += m2;                k1 += m2;                xr = a[j1];                xi = -a[j1 + 1];                yr = a[k1];                yi = -a[k1 + 1];                a[j1] = yr;                a[j1 + 1] = yi;                a[k1] = xr;                a[k1 + 1] = xi;            }            k1 = 2 * k + ip[k];            a[k1 + 1] = -a[k1 + 1];            a[k1 + m2 + 1] = -a[k1 + m2 + 1];        }    }}T8_INLINE void clTransform8::cftfsub(long n, double *a, double *w){    long j, j1, j2, j3, l;    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;        l = 2;    if (n >= 16) {        cft1st(n, a, w);        l = 16;        while ((l << 3) <= n) {            cftmdl(n, l, a, w);            l <<= 3;        }    }    if ((l << 1) < n) {        for (j = 0; j < l; j += 2) {            j1 = j + l;            j2 = j1 + l;            j3 = j2 + l;            x0r = a[j] + a[j1];            x0i = a[j + 1] + a[j1 + 1];            x1r = a[j] - a[j1];            x1i = a[j + 1] - a[j1 + 1];            x2r = a[j2] + a[j3];            x2i = a[j2 + 1] + a[j3 + 1];            x3r = a[j2] - a[j3];            x3i = a[j2 + 1] - a[j3 + 1];            a[j] = x0r + x2r;            a[j + 1] = x0i + x2i;            a[j2] = x0r - x2r;            a[j2 + 1] = x0i - x2i;            a[j1] = x1r - x3i;            a[j1 + 1] = x1i + x3r;            a[j3] = x1r + x3i;            a[j3 + 1] = x1i - x3r;        }    } else if ((l << 1) == n) {        for (j = 0; j < l; j += 2) {            j1 = j + l;            x0r = a[j] - a[j1];            x0i = a[j + 1] - a[j1 + 1];            a[j] += a[j1];            a[j + 1] += a[j1 + 1];            a[j1] = x0r;            a[j1 + 1] = x0i;        }    }}T8_INLINE void clTransform8::cftbsub(long n, double *a, double *w){    long j, j1, j2, j3, j4, j5, j6, j7, l;    double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i,         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;        l = 2;    if (n > 16) {        cft1st(n, a, w);        l = 16;        while ((l << 3) < n) {            cftmdl(n, l, a, w);            l <<= 3;        }    }    if ((l << 2) < n) {        wn4r = w[2];        for (j = 0; j < l; j += 2) {            j1 = j + l;            j2 = j1 + l;   

⌨️ 快捷键说明

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