3章:高速フーリエ変換プログラムのC言語ソース
 高速フーリエ変換プログラムのC言語ソース 高速フーリエ変換プログラムの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ソースに行く。
4章:高速フーリエ変換プログラムのVBAソースに行く。
 トップページに戻る。
トップページに戻る。