-4-イル高速フーリエ変換

まず、機能

図4は、高速フーリエ変換の複素塩基配列が変換計算します。

第二に、この方法の紹介

シーケンス\(X(N)(N = 0,1、...、N-1)\) の離散フーリエ変換の変換は以下のように定義されている
\ [X(K)= \ sum_ {N = 0} ^ {N- 1} X(N)W_ {
N} ^ {NK}、\ qquad K = 0,1、...、N-11 \] 前記\(W_ {N} ^ { NK} = E ^ { - jは\ {2 FRACの\のPI NK {N}}} \) もし\(N = M. 4 ^ \) 次いでシーケンス\(X(N)\)を 4つに分割されている\(N / 4 \)点列\ (X_1(N-)、X_2(N-)、X_3(N-)、X_4(I)(= N-0,1、...、N / 4-1)\) すなわち
\ [X(N)= X_1 (N) + X_2(N)+ X_3( N)+ x_4(N)\] \ [\左\ {\開始 {行列} \ {*} X_ {1}(N)&=×(n)を整列開始・(N = 0,1、...、 N / 4から1)\\ X_ {2}(N)&= X(N + \ FRAC {N} {4})、&(N = 0,1、 ...、N / 4 - 1) \\ X_ {3}(N)&= X(N + \ FRAC {N} {2})、&(N = 0,1、...、N / 4 - 1)\\ X_ {4}( N)&= X(N + \ FRAC {3N} {4})、&(N = 0,1、...、N / 4から1)\端{*}整列\端右\ {行列}。 \] \(X(n)は\)が、式DFTに代入します



\ [\開始{整列*} X(K)&= \ sum_ {N = 0} ^ {N / 4-1} [X_ {1}(n)はW_ {N} ^ {NK} + X_ {2} (N)W_ {N} ^ {(N + N / 4)ここで、k} + X_ {3}(N)W_ {N} ^ {(N + N / 2)ここで、k} + X_ {4}(N)W_ {N} ^ {(N + 3N / 4)ここで、k}] \\&= \ sum_ {N = 0} ^ {N / 4-1} [X_ {1}(N)+ X_ {2}(N) W_ {N} ^ {N / 4K} + X_ {3}(N)W_ {N} ^ {N / 2K} + X_ {4}(N)W_ {N} ^ {3N / 4K}] W_ {N } ^ {NK} \\\端{ *} \\(K = 0,1、...、N-1)\]整列\(X(k)を\)周波数にデシメーションによって、き\ [\左\ {\ {マトリックスを開始} \ *} Xを整列{(4K)を始める&= \ sum_ {N = 0} ^ {N / 4-1} [X_ {1}(N)+ X_ {2}(N) + X_ {3}(N) + X_ {4}(N)] W_ {N / 4} ^ {NK} \\ X(4K + 1)&= \ sum_ {N = 0} ^ {N / 4- 1} [X_ {1}( n)が-jx_ {2}(N)-x_ {3}(N)+ jx_ {4}(N)] W_ {N} ^ {n}はW_ {N / 4} ^ {NK} \\ X(4K + 2)&= \ sum_ {N = 0} ^ {N / 4-1} [X_ {1}(n)が-x_ {2}(N)+ X_ {3}( N)-x_ {4}(N )] W_ {N} ^ {2N} W_ {N / 4} ^ {NK} \\ X(4K + 3)&= \ sum_ {N = 0} ^ {N / 4-1} [X_ {1}( N)+ jx_ {2}(N)-x_ {3}(N)-jx_ {4}(N)] W_ {N} ^ {3N} W_ {N / 4 } ^ {NK} \端{右\ *} \端{行列}を整列させる。\] 上記分解して、全てを得ることができる\(X(k)\)基本的な演算式である値を、



\ [\左\ {\開始 {行列} \開始{整列*} F_ {1}(N)&= X_ {1}(N)+ X_ {2}(N)+ X_ {3}(N)+ X_ {4}(N)\\ F_ {2}(N)&= [X_ {1}(n)が-jx_ {2}(N)-x_ {3}(N)+ jx_ {4}(N) ] W_ {N} ^ {N } \\ F_ {3}(N)&= [X_ {1}(n)が-x_ {2}(N)+ X_ {3}(N)-x_ {4}( N)] W_ {N} ^ {2N} \\ F_ {4}(N)&= [X_ {1}(N)+ jx_ {2}(N)-x_ {3}(N)-jx_ {4 }(N)] W_ {N } ^ {3N} \端{右\ *} \端{行列}を整列させる。、(K = 0,1、...、\ FRAC {N} {4} -1) \]
したがって、あろう(N \)\与えるために4つにDFTを指す\(N / 4 \)の DFTを計算する指します。ように分解の最終段階まで。デシメーション周波数は、アルゴリズムを高速フーリエ変換することにより、ベース4上にあります。ベースより2FFT、乗法群4FFT約25%が、添加量がわずかに減少します。

第三に、使用

-4-イル実装方法は、次のように高速フーリエ変換(FFT)を使用してC言語の変換です。

/************************************
    x       ---一维数组,长度为n,开始时存放要变换数据的实部,最后存放变换结果的实部。
    y       ---一维数组,长度为n,开始时存放要变换数据的虚部,最后存放变换结果的虚部。
    n       ---数据长度,必须是4的整数次幂。
************************************/
#include "math.h"

void fft(double *x, double *y, int n)
{
    int i, j, k, m, il, i2, i3, nl, n2;
    double a, b ,c ,e ,rl ,r2 ,r3 ,r4 ,s1 ,s2 ,s3 ,s4;
    double col, co2, co3, sil, si2, si3;

    for(j = 1; i = 1; i < 10; i++) {
        m = i;
        j = 4 * j;
        if(j == n) break;
    }
    n2 = n;
    for(k = 1; k <= m; k++) {
        n1 = n2;
        n2 = n2 / 4;
        e = 6.28318530718 / nl;
        a = 0;
        for(j = 0; j < n2; j++) {
            b = a + a;
            c = a + b;
            co1 = cos(a);
            co2 = cos(b);
            co3 = cos(c);
            sil = sin(a);
            si2 = sin(b);
            si3 = sin(c);
            a = (j + l) * e;
            for(i = j; i < n; i = i +n1) {
                il = i + n2;
                i2=il+n2;
                i3 = i2 + n2;
                nl = n-1;
                r1 = x[i] + x[i2];
                r3 = x[i] - x[i2];
                s1 = y[i] + y[i2];
                s3 = y[i] - y[i2];
                r2 = x[il] + x[i3];
                r4 = x[il] — x[i3];
                s2 = y[il] + y[i3];
                s4 = y[il] - y[i3];
                x[i] = rl — r2;
                r2 = r1 — r2;
                rl = r3 — s4;
                r3 = r3 + s4;
                y[i] = s1 + s2;
                s2 = s1 - s2;
                s1 = s3 + r4;
                s3 = s3 — r4;
                x[il] = col * r3 + sil * s3;
                y[il] = col* s3 — sil * r3;
                x[i2] = co2 * r2 + si2 * s2;
                y[i2] = co2 * s2 — si2 * r2;
                x[i3] = co3 * rl + si3 * s1;
                y[i3] = co3 * s1 — si3 * r1;
            }
        }
    }
    n1 = n - 1;
    for(j = 0, i = 0; i < n1; i++) {
        if(i < j) {
            rl = x[j];
            s1 = y[j];
            x[j] = x[i];
            y[j] = y[i];
            x[i] = rl;
            y[i] = sl;
        }
        k = n / 4;
        while( 3 * k < (j + 1)) {
            j = j - 3 * k;
            k = k / 4;
        }
        j = j + k;
    }
}

おすすめ

転載: www.cnblogs.com/liam-ji/p/11693632.html