3章:高速フーリエ変換プログラムのC言語ソース

  1. 高速フーリエ変換プログラムのC言語ソース
     高速フーリエ変換プログラムのC言語ソースを以下に示します。
     なお、データ入力とデータ出力の部分は省略しています。

    #include
    #include
    #include
    int L,n;
    double X[4100],Y[4100],f;
    void main()
    {
     int i,j,ns,L1,arg,arg2,i0,i1,m[4100],n1;
     double s,c,sc,X1,Y1,t,PI;

     IN_FM();//データ入力
     PI=3.14159265358979;//円周率を設定
     n=(int)pow(2,L);//データ数
     n1=n/2;//データ数の1/2
     ns=n/2;//2進数の最上位の値
     sc=2.0*PI/(double)n;
     for(i=0;i < n;i++){m[i]=0;} //m[i]の初期化
     while(ns >= 1) //2進数の最上位の値が1になるまで繰り返し
     {
      for(L1=0;L1 < n;L1=L1+2*ns) //L1の値を0からnまで、2×最上位の値のstepで繰り返し
      {
       arg=m[L1]/2; //回転子=前の回転子の値/2
       arg2=arg+n1; //回転子2=回転子+データ数の1/2
       c=cos(sc*(double)arg);
       s=sin(f*sc*(double)arg);
       for(i0=L1;i0 < L1+ns;i0++) //i0の値をL1の値からL1+2進数の最上位の値まで繰り返し
       {
        i1=i0+ns; //i1=i0+2進数の最上位の値
        X1=X[i1]*c-Y[i1]*s;
        Y1=Y[i1]*c+X[i1]*s;
        X[i1]=X[i0]-X1;
        Y[i1]=Y[i0]-Y1;
        X[i0]=X[i0]+X1;
        Y[i0]=Y[i0]+Y1;
        m[i0]=arg; //m[i0]に回転子を保存
        m[i1]=arg2; //m[i1]に回転子2を保存
       }
      }
      ns=ns/2;//2進数の最上位の値を繰り下げ
     }
     if(f < 0)//正規化処理
     {
      for(i=0;i < n; i++)
      {
       X[i]=X[i]/(double)n;
       Y[i]=Y[i]/(double)n;
      }
     }
     for(i=0;i < n; i++)//ビット反転処理
     {
      if(i < m[i])
      {
       j=m[i];
       t=X[i];X[i]=X[j];X[j]=t;
       t=Y[i];Y[i]=Y[j];Y[j]=t;
      }
     }
      OUT_FM();//データ出力
    }

     高速フーリエ変換の基礎理論と比較してプログラムのソースが短いと感じるかもしれません?
     しかし、短くても難解なプログラムのソースなのです。



4章:高速フーリエ変換プログラムのVBAソースに行く。

トップページに戻る。