高速フーリエ変換
高速フーリエ逆変換
X=fft(A [,sign] [,option]) X=fft(A,sign,selection [,option]) X=fft(A,sign,dims,incr [,option] )
実数または複素数ベクトル, 実数または複素数配列(ベクトル, 行列またはN-D配列).
A
と同じ形状の実数または複素数配列
1
or
-1
. Select direct or inverse
transform. The default value is -1
(direct transform)."symmetric"
または
"nonsymmetric"
です.
A
が対称かどうかを示します.
この引数が省略された場合,アルゴリズムは
A
が対称かどうかを自動的に定義します.
詳細は説明のパートを参照ください.A
配列の次元の添字を有するベクトル.
詳細は説明のパートを参照ください.各要素はA
の要素の総数の約数とする
必要があります.
要素の積はA
の全要素数より
少ない必要があります.
incr
は,
dims
と同じ要素数とする必要があります.
各要素は
A
の全要素数の約数とする必要があります.
incr
要素は厳密に昇順とする必要があります.
X=fft(A,-1 [,option])
または
X=fft(A [,option])
は直接変換を出力します.
A
が単一変量のベクトルの場合,
次のように直接FFTが計算されます:
(引数-1
は指数の符号を示しており,
"逆"ではありません),
A
が行列または多次元配列の場合,
多変量直接FFTが行われます.
X=fft(A,1)
または
X=ifft(A)
は,
A==ifft(fft(A))
のような
正規化された逆変換を実行します.
A
がベクトルの場合,
単一変量逆FFTが実行されます.
A
が行列または多次元配列の場合,
多変量逆FFTが実行されます.
X=fft(A,sign,selection [,option])
により,選択した次元方向のA
の
"スライス"の直接または逆fftを効率的に実行することができます.
例えば,A
が3次元配列の場合,
X=fft(A,-1,2)
は以下と等価です:
X=fft(A,-1,[1 3])
は以下と等価です:
前記の構文,
X=fft(A,sign,dims,incr [,option])
は,
指定した次元方向に A
のスライスの
直接または逆fftを行うことも可能です.
例えば, A
が
n1*n2*n3
個の要素を有する配列の場合,
X=fft(A,-1,n1,1)
は
X=fft(matrix(A,[n1,n2,n3]),-1,1)
と等価です.
また、X=fft(A,-1,[n1 n3],[1 n1*n2])
は
X=fft(matrix(A,[n1,n2,n3]),-1,[1,3])
と等価です.
A
またはその"スライス"全体
の対称性に関してfftアルゴリズムに情報を提供するために使用できます.
次元n1
, ..., np
の
N次元配列B
は,
B==conj(B([1 n1:-1:2],[1
n2:-1:2],...,[1 np:-1:2]))
の場合に限り,fftが共役対称です.
このような場合,
結果X
は実数で,効率的な専用のアルゴリズムを
使用できます.
A
またはその全"スライス"を
共役対称として扱うfftを実行する値です.
このオプションは,
A
またはその全"スライス" が
丸め誤差の影響で厳密に対称ではない場合に,
自動的な対称性の定義を回避したい場合に有用です.注意: fftw 関数は自動的に直近のパラメータをメモリに保存し, 2回目に再利用します. これにより,(同じパラメータで)連続的なコールを行った場合に 著しく計算時間が改善します.
get_fftw_wisdom, set_fftw_wisdom関数により 更にfftを最適化することができます.
この関数は,fftw3 ライブラリを 使用しています.
1次元fft
//Frequency components of a signal //---------------------------------- // build a noised signal sampled at 1000hz containing pure frequencies // at 50 and 70 Hz sample_rate=1000; t = 0:1/sample_rate:0.6; N=size(t,'*'); //number of samples s=sin(2*%pi*50*t)+sin(2*%pi*70*t+%pi/4)+grand(1,N,'nor',0,1); y=fft(s); //s is real so the fft response is conjugate symmetric and we retain only the first N/2 points f=sample_rate*(0:(N/2))/N; //associated frequency vector n=size(f,'*') clf() plot(f,abs(y(1:n))) | ![]() | ![]() |
2次元fft
//---------------------------------- A = zeros(256,256); A(5:24,13:17) = 1; X = fftshift(fft(A)); set(gcf(),"color_map",jetcolormap(128)); clf;grayplot(0:255,0:255,abs(X)') | ![]() | ![]() |
mupliple fft
//simple case, 3 1-D fft at a time N=2048; t=linspace(0,10,2048); A=[2*sin(2*%pi*3*t)+ sin(2*%pi*3.5*t) 10*sin(2*%pi*8*t) sin(2*%pi*0.5*t)+4*sin(2*%pi*0.8*t)]; X=fft(A,-1,2); fs=1/(t(2)-t(1)); f=fs*(0:(N/2))/N; //associated frequency vector clf;plot(f(1:100)',abs(X(:,1:100))') legend(["3 and 3.5 Hz","8 Hz","0.5 and 0.8 Hz"],"in_upper_left") // 45 3-D fft at a time Dims=[5 4 9 5 6]; A=matrix(rand(1,prod(Dims)),Dims); y=fft(A,-1,[2 4 5]); //equivalent (but less efficient code) y1=zeros(A); for i1=1:Dims(1) for i3=1:Dims(3) ind=list(i1,:,i3,:,:); y1(ind(:))=fft(A(ind(:)),-1); end end | ![]() | ![]() |
//Using explicit formula for 1-D discrete Fourier transform //------------------------------------------------ function xf=DFT(x, flag); n=size(x,'*'); //Compute the n by n Fourier matrix if flag==1 then,//backward transformation am=exp(2*%pi*%i*(0:n-1)'*(0:n-1)/n); else //forward transformation am=exp(-2*%pi*%i*(0:n-1)'*(0:n-1)/n); end xf=am*matrix(x,n,1);//dft xf=matrix(xf,size(x));//reshape if flag==1 then,xf=xf/n;end endfunction //Comparison with the fast Fourier algorithm a=rand(1,1000); norm(DFT(a,1) - fft(a,1)) norm(DFT(a,-1) - fft(a,-1)) timer();DFT(a,-1);timer() timer();fft(a,-1);timer() | ![]() | ![]() |
Matteo Frigo and Steven G. Johnson, "FFTW Documentation" http://www.fftw.org/#documentation