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

📄 fft4g.c

📁 this file is even FFT, max point is 8192,this file "fft4g.c" is computer this file "how_to_use_fft.c
💻 C
📖 第 1 页 / 共 2 页
字号:
/*Fast Fourier/Cosine/Sine Transform    dimension   :one    data length :power of 2    decimation  :frequency    radix       :4, 2    data        :inplace    table       :usefunctions    cdft: Complex Discrete Fourier Transformfunction prototypes    void cdft(int, int, FFT_TYPE *, int *, FFT_TYPE *);-------- Complex DFT (Discrete Fourier Transform) --------    [definition]        <case1>            X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n        <case2>            X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n        (notes: sum_j=0^n-1 is a summation from j=0 to n-1)    [usage]        <case1>            ip[0] = 0; // first time only            cdft(2*n, 1, a, ip, w);        <case2>            ip[0] = 0; // first time only            cdft(2*n, -1, a, ip, w);    [parameters]        2*n            :data length (int)                        n >= 1, n = power of 2        a[0...2*n-1]   :input/output data (FFT_TYPE *)                        input data                            a[2*j] = Re(x[j]),                             a[2*j+1] = Im(x[j]), 0<=j<n                        output data                            a[2*k] = Re(X[k]),                             a[2*k+1] = Im(X[k]), 0<=k<n        ip[0...*]      :work area for bit reversal (int *)                        length of ip >= 2+sqrt(n)                        strictly,                         length of ip >=                             2+(1<<(int)(log(n+0.5)/log(2))/2).                        ip[0],ip[1] are pointers of the cos/sin table.        w[0...n/2-1]   :cos/sin table (FFT_TYPE *)                        w[],ip[] are initialized if ip[0] == 0.    [remark]        Inverse of             cdft(2*n, -1, a, ip, w);        is             cdft(2*n, 1, a, ip, w);            for (j = 0; j <= 2 * n - 1; j++) {                a[j] *= 1.0 / n;            }        .*/typedef float FFT_TYPE;void cdft(int n, int isgn, FFT_TYPE *a, int *ip, FFT_TYPE *w){    void makewt(int nw, int *ip, FFT_TYPE *w);    void bitrv2(int n, int *ip, FFT_TYPE *a);    void bitrv2conj(int n, int *ip, FFT_TYPE *a);    void cftfsub(int n, FFT_TYPE *a, FFT_TYPE *w);    void cftbsub(int n, FFT_TYPE *a, FFT_TYPE *w);        if (n > (ip[0] << 2)) {        makewt(n >> 2, ip, w);    }    if (n > 4) {        if (isgn >= 0) {            bitrv2(n, ip + 2, a);            cftfsub(n, a, w);        } else {            bitrv2conj(n, ip + 2, a);            cftbsub(n, a, w);        }    } else if (n == 4) {        cftfsub(n, a, w);    }}/* -------- initializing routines -------- */#include <math.h>void makewt(int nw, int *ip, FFT_TYPE *w){    void bitrv2(int n, int *ip, FFT_TYPE *a);    int j, nwh;    FFT_TYPE delta, x, y;        ip[0] = nw;    ip[1] = 1;    if (nw > 2) {        nwh = nw >> 1;        delta = atan(1.0) / nwh;        w[0] = 1;        w[1] = 0;        w[nwh] = cos(delta * nwh);        w[nwh + 1] = w[nwh];        if (nwh > 2) {            for (j = 2; j < nwh; j += 2) {                x = cos(delta * j);                y = sin(delta * j);                w[j] = x;                w[j + 1] = y;                w[nw - j] = y;                w[nw - j + 1] = x;            }            bitrv2(nw, ip + 2, w);        }    }}/* -------- child routines -------- */void bitrv2(int n, int *ip, FFT_TYPE *a){    int j, j1, k, k1, l, m, m2;    FFT_TYPE 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;            }        }    }}void bitrv2conj(int n, int *ip, FFT_TYPE *a){    int j, j1, k, k1, l, m, m2;    FFT_TYPE 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];        }    }}void cftfsub(int n, FFT_TYPE *a, FFT_TYPE *w){    void cft1st(int n, FFT_TYPE *a, FFT_TYPE *w);    void cftmdl(int n, int l, FFT_TYPE *a, FFT_TYPE *w);

⌨️ 快捷键说明

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