FFT takufuji 2005/07/16 01:01:26
FFT takufuji 2005/07/16 01:01:26 ツリーへ
FFT |
返事を書く |
takufuji 2005/07/16 01:01:26 | |
白石先生、十進BASICを活用している皆さん、はじめまして。 白石先生にはただ頭が下がるばかりです。大変僭越ですがFFTを作ったのでよかったら使ってください。 ------ 以下FFT ------- OPEN #1: NAME "D:\いろいろ\数学、物理\BASICw32\Onsa_440.txt" OPEN #2: NAME "D:\いろいろ\数学、物理\BASICw32\Onsa_440_FFT2.TXT" OPTION ARITHMETIC COMPLEX !複素関数 OPTION BASE 0 !配列は0から DIM f(10000),c(100,10000),w(10000),n(10000) !ポイント数に注意 LET l=4096 !ポイント数(2の乗数) LET fs=22050 !サンプリング周波数[Hz] LET m=l LET t0=TIME !--------------------- データ入力 -------------------------- FOR i=0 TO l-1 INPUT #1: f(i) NEXT i ERASE #2 !--------------------------------------------------------------- !----------------- nのビットリバースとωの作成 --------------- FOR k=0 TO l-1 LET c(0,k)=complex(f(k),0) LET w(k)=complex(COS(2*(k)*PI/l),-SIN(2*(k)*PI/l)) FOR j=0 TO LOG2(l)-1 LET n(k)=n(k)+MOD(INT(k/2^j),2)*2^(LOG2(l)-1-j) NEXT j NEXT k !--------------------------------------------------------------- !---------------------- バタフライ演算 ---------------------- FOR j=0 TO LOG2(l)-1 LET kk=2^j-1 LET m=m/2 FOR jj=0 TO kk FOR k=0 TO m-1 LET c(j+1,k+2*jj*m)=c(j,k+2*jj*m)+c(j,k+2*jj*m+m)*w(n(2*jj)) LET c(j+1,k+2*jj*m+m)=c(j,k+2*jj*m)+c(j,k+2*jj*m+m)*w(n(2*jj+1)) NEXT k NEXT jj NEXT j !--------------------------------------------------------------- !----------------- スペクトルのビットリバース ---------------- FOR k=0 TO l-1 LET c(LOG2(l)+1,n(k))=c(LOG2(l),k) NEXT k !--------------------------------------------------------------- !--------------------- スペクトルの出力 ---------------------- SET WINDOW 0,fs/2,0,10 FOR k=0 TO l/2-1 PRINT #2: Re((2/l)*c(LOG2(l)+1,k));",";(2/l)*Im(c(LOG2(l)+1,k)) ! PRINT k*fs/l;(2/l)*SQR(Re(c(LOG2(l)+1,k))^2+Im(c(LOG2(l)+1,k))^2) PLOT LINES: k*fs/l,(2/l)*SQR(Re(c(LOG2(l)+1,k))^2+Im(c(LOG2(l)+1,k))^2); NEXT k !--------------------------------------------------------------- CLOSE #1 CLOSE #2 PRINT time-t0;"秒かかりました" END |