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

📄 libfft.h

📁 实现ipvlbi数据记录
💻 H
📖 第 1 页 / 共 3 页
字号:
        a[0] = a[m + mh];        a[m + mh] = a[mh];        m = mh;    }    a[1] = a[0];    a[0] = 0;    bitrv1(n, a);}/* -------- child routines -------- */#include <math.h>#ifndef M_PI_2#define M_PI_2      1.570796326794896619231321691639751442098584699687#endif#ifndef WR5000  /* cos(M_PI_2*0.5000) */#define WR5000      0.707106781186547524400844362104849039284835937688#endif#ifndef WR2500  /* cos(M_PI_2*0.2500) */#define WR2500      0.923879532511286756128183189396788286822416625863#endif#ifndef WI2500  /* sin(M_PI_2*0.2500) */#define WI2500      0.382683432365089771728459984030398866761344562485#endif#ifndef RDFT_LOOP_DIV  /* control of the RDFT's speed & tolerance */#define RDFT_LOOP_DIV 64#endif#ifndef DCST_LOOP_DIV  /* control of the DCT,DST's speed & tolerance */#define DCST_LOOP_DIV 64#endifvoid bitrv2(int n, double *a){    int j0, k0, j1, k1, l, m, i, j, k;    double xr, xi, yr, yi;        l = n >> 2;    m = 2;    while (m < l) {        l >>= 1;        m <<= 1;    }    if (m == l) {        j0 = 0;        for (k0 = 0; k0 < m; k0 += 2) {            k = k0;            for (j = j0; j < j0 + k0; j += 2) {                xr = a[j];                xi = a[j + 1];                yr = a[k];                yi = a[k + 1];                a[j] = yr;                a[j + 1] = yi;                a[k] = xr;                a[k + 1] = xi;                j1 = j + m;                k1 = k + 2 * m;                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 += m;                k1 -= m;                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 += m;                k1 += 2 * m;                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;                for (i = n >> 1; i > (k ^= i); i >>= 1);            }            j1 = j0 + k0 + m;            k1 = j1 + m;            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;            for (i = n >> 1; i > (j0 ^= i); i >>= 1);        }    } else {        j0 = 0;        for (k0 = 2; k0 < m; k0 += 2) {            for (i = n >> 1; i > (j0 ^= i); i >>= 1);            k = k0;            for (j = j0; j < j0 + k0; j += 2) {                xr = a[j];                xi = a[j + 1];                yr = a[k];                yi = a[k + 1];                a[j] = yr;                a[j + 1] = yi;                a[k] = xr;                a[k + 1] = xi;                j1 = j + m;                k1 = k + m;                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;                for (i = n >> 1; i > (k ^= i); i >>= 1);            }        }    }}void bitrv2conj(int n, double *a){    int j0, k0, j1, k1, l, m, i, j, k;    double xr, xi, yr, yi;        l = n >> 2;    m = 2;    while (m < l) {        l >>= 1;        m <<= 1;    }    if (m == l) {        j0 = 0;        for (k0 = 0; k0 < m; k0 += 2) {            k = k0;            for (j = j0; j < j0 + k0; j += 2) {                xr = a[j];                xi = -a[j + 1];                yr = a[k];                yi = -a[k + 1];                a[j] = yr;                a[j + 1] = yi;                a[k] = xr;                a[k + 1] = xi;                j1 = j + m;                k1 = k + 2 * m;                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 += m;                k1 -= m;                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 += m;                k1 += 2 * m;                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;                for (i = n >> 1; i > (k ^= i); i >>= 1);            }            k1 = j0 + k0;            a[k1 + 1] = -a[k1 + 1];            j1 = k1 + m;            k1 = j1 + m;            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 += m;            a[k1 + 1] = -a[k1 + 1];            for (i = n >> 1; i > (j0 ^= i); i >>= 1);        }    } else {        a[1] = -a[1];        a[m + 1] = -a[m + 1];        j0 = 0;        for (k0 = 2; k0 < m; k0 += 2) {            for (i = n >> 1; i > (j0 ^= i); i >>= 1);            k = k0;            for (j = j0; j < j0 + k0; j += 2) {                xr = a[j];                xi = -a[j + 1];                yr = a[k];                yi = -a[k + 1];                a[j] = yr;                a[j + 1] = yi;                a[k] = xr;                a[k + 1] = xi;                j1 = j + m;                k1 = k + m;                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;                for (i = n >> 1; i > (k ^= i); i >>= 1);            }            k1 = j0 + k0;            a[k1 + 1] = -a[k1 + 1];            a[k1 + m + 1] = -a[k1 + m + 1];        }    }}void bitrv1(int n, double *a){    int j0, k0, j1, k1, l, m, i, j, k;    double x;        l = n >> 2;    m = 1;    while (m < l) {        l >>= 1;        m <<= 1;    }    if (m == l) {        j0 = 0;        for (k0 = 0; k0 < m; k0++) {            k = k0;            for (j = j0; j < j0 + k0; j++) {                x = a[j];                a[j] = a[k];                a[k] = x;                j1 = j + m;                k1 = k + 2 * m;                x = a[j1];                a[j1] = a[k1];                a[k1] = x;                j1 += m;                k1 -= m;                x = a[j1];                a[j1] = a[k1];                a[k1] = x;                j1 += m;                k1 += 2 * m;                x = a[j1];                a[j1] = a[k1];                a[k1] = x;                for (i = n >> 1; i > (k ^= i); i >>= 1);            }            j1 = j0 + k0 + m;            k1 = j1 + m;            x = a[j1];            a[j1] = a[k1];            a[k1] = x;            for (i = n >> 1; i > (j0 ^= i); i >>= 1);        }    } else {        j0 = 0;        for (k0 = 1; k0 < m; k0++) {            for (i = n >> 1; i > (j0 ^= i); i >>= 1);            k = k0;            for (j = j0; j < j0 + k0; j++) {                x = a[j];                a[j] = a[k];                a[k] = x;                j1 = j + m;                k1 = k + m;                x = a[j1];                a[j1] = a[k1];                a[k1] = x;                for (i = n >> 1; i > (k ^= i); i >>= 1);            }        }    }}void cftfsub(int n, double *a){    void cft1st(int n, double *a);    void cftmdl(int n, int l, double *a);    int j, j1, j2, j3, l;    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;        l = 2;    if (n > 8) {        cft1st(n, a);        l = 8;        while ((l << 2) < n) {            cftmdl(n, l, a);            l <<= 2;        }    }    if ((l << 2) == 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 {        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;        }    }}void cftbsub(int n, double *a){    void cft1st(int n, double *a);    void cftmdl(int n, int l, double *a);    int j, j1, j2, j3, l;    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;        l = 2;    if (n > 8) {        cft1st(n, a);        l = 8;        while ((l << 2) < n) {            cftmdl(n, l, a);            l <<= 2;        }    }    if ((l << 2) == 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 {        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[j + 1] - a[j1 + 1];            a[j1] = x0r;            a[j1 + 1] = x0i;        }    }}void cft1st(int n, double *a){    int j, kj, kr;    double ew, wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;        x0r = a[0] + a[2];    x0i = a[1] + a[3];    x1r = a[0] - a[2];    x1i = a[1] - a[3];    x2r = a[4] + a[6];    x2i = a[5] + a[7];    x3r = a[4] - a[6];    x3i = a[5] - a[7];    a[0] = x0r + x2r;    a[1] = x0i + x2i;    a[4] = x0r - x2r;    a[5] = x0i - x2i;    a[2] = x1r - x3i;    a[3] = x1i + x3r;    a[6] = x1r + x3i;    a[7] = x1i - x3r;    wn4r = WR5000;    x0r = a[8] + a[10];    x0i = a[9] + a[11];    x1r = a[8] - a[10];    x1i = a[9] - a[11];    x2r = a[12] + a[14];    x2i = a[13] + a[15];    x3r = a[12] - a[14];    x3i = a[13] - a[15];    a[8] = x0r + x2r;    a[9] = x0i + x2i;    a[12] = x2i - x0i;    a[13] = x0r - x2r;    x0r = x1r - x3i;    x0i = x1i + x3r;    a[10] = wn4r * (x0r - x0i);    a[11] = wn4r * (x0r + x0i);    x0r = x3i + x1r;    x0i = x3r - x1i;    a[14] = wn4r * (x0i - x0r);    a[15] = wn4r * (x0i + x0r);    ew = M_PI_2 / n;    kr = 0;    for (j = 16; j < n; j += 16) {        for (kj = n >> 2; kj > (kr ^= kj); kj >>= 1);        wk1r = cos(ew * kr);        wk1i = sin(ew * kr);        wk2r = 1 - 2 * wk1i * wk1i;        wk2i = 2 * wk1i * wk1r;        wk3r = wk1r - 2 * wk2i * wk1i;        wk3i = 2 * wk2i * wk1r - wk1i;        x0r = a[j] + a[j + 2];        x0i = a[j + 1] + a[j + 3];        x1r = a[j] - a[j + 2];        x1i = a[j + 1] - a[j + 3];        x2r = a[j + 4] + a[j + 6];

⌨️ 快捷键说明

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