DiscreteTransforms[FourierTransform] - 離散フーリエ変換の計算
DiscreteTransforms[InverseFourierTransform] - 離散逆フーリエ変換の計算
使い方
FourierTransform(Z, [,options])
FourierTransform(Z1, nelem [,options])
FourierTransform(Zn, dim [,options])
FourierTransform(X, Y [,options])
FourierTransform(X1, Y1, nelem [,options])
FourierTransform(Xn, Yn, dim [,options])
InverseFourierTransform(Z, [,options])
InverseFourierTransform(Z1, nelem [,options])
InverseFourierTransform(Zn, dim [,options])
InverseFourierTransform(X, Y [,options])
InverseFourierTransform(X1, Y1, nelem [,options])
InverseFourierTransform(Xn, Yn, dim [,options])
パラメータ
Z - 複素数のデータ配列、1-5 次元
Z1 - 複素数のデータ配列、1 次元
Zn - 複素数のデータ配列、2-5 次元
X, Y - 実数のデータ配列、1-5 次元
X1, Y1 - 実数のデータ配列、1 次元
Xn, Yn - 実数のデータ配列、2-5 次元
nelem - 変換で使用する離散データ点の数
dim - 変換される配列の次元
options - option=value の形をしたオプションの引数、 ここで、オプションは、algorithm, padding, inplace のいずれかです
|
説明
|
|
•
|
FourierTransform および InverseFourierTransform コマンドは、数値入力データの および 逆フーリエ変換を計算します。入力データの形式が1つのデータ配列の場合には、入力データ Z は、複素数の配列として解釈されます。入力データの形式が2つのデータ配列の場合には、入力 X,Y は、それぞれ、データの実部、および、虚部として解釈されます。
|
|
注意: FourierTransform および InverseFourierTransform コマンドは、機械精度で厳密に動作します。従って、それらの精度は、Digits の設定に依存しません。さらに、すべての場合に、入力データは浮動小数点の数値データ、あるいは、浮動小数点の数値データ に評価されている必要があります。 記号要素を入力してはいけません。
|
•
|
データ z[j] の1-D N-点の順変換 に対して使用されている定義は、次式で与えられます。
|
/ N \
|----- |
1/2 | \ -2 I Pi (i - 1) (j - 1) |
Z[i] = (1/N) | ) z[j] exp(-----------------------)|, i = 1 .. N
| / N |
|----- |
\j = 1 /
/ N \
|----- |
1/2 | \ 2 I Pi (i - 1) (j - 1) |
z[j] = (1/N) | ) Z[i] exp(----------------------)|, j = 1 .. N
| / N |
|----- |
\i = 1 /
|
ここでは、 (1/N)^(1/2) を用いて対称的な正規化が使用されています。
|
•
|
入力データが1次元配列である場合、変換に使用される配列の要素数をnelem と指定することができます。 これにより、異なるサイズをもつ変換に対して同じ メモリ領域の再使用ができます。(さらに、出力をpaddingで置き換えることもします - 以下の inplace と padding を参照してください)。
|
•
|
入力データが1次元より大きい配列、あるいは、行列である場合、デフォルトでは、インデックスのすべての組み合わせに対して、入力のすべての次元に関して実行されます。この場合、データの長さは、指定することができません。
|
|
例えば、複素数の20x30行列とともに、FourierTransform または InverseFourierTransform をコールすると、行列データの30 列の各々に対して、20データ点の変換を実行し、続けて (すでに1度変換した) 行列データの20行の各々について30データ点の変換を行います。
|
|
dim を指定すると、FourierTransform または InverseFourierTransform は、配列の次元に対してのみ変換を行います。すなわち、20x30 行列の例に対して、dim=1 と指定すると、行列の各列に対して20 データ点の変換を行い、 行列の行について変換します。一方、dim=2 と指定すると、行列の各行に対して30 データ点の変換を行い、 行列の列について変換します。
|
|
|
オプション
|
|
|
オプションの引数は、フーリエ変換、または、逆フーリエ変換が実行される方法を制御します。
|
|
alg は、mintime (デフォルト), minstorage, または、DFT に設定することができます。 mintime アルゴリズムはBrighamからの twiddle factor FFT algorithm の効率的な実現です。minstorage アルゴリズムは、追加のメモリ領域をできるだけ使用しないように同じアルゴリズムを変更し修正したものです。詳細は、FourierTransform,efficiency を参照してください。 DFT アルゴリズムは、単純に O(N^2) の離散フーリエ変換 です(非常に遅いため、主に教育目的で提供されています)。
|
|
ここで、numは、フーリエ変換をより効率的に計算するために使用できる0 paddingの最大量を指定します。mintime と minstorage のアルゴリズムは高速フーリエ変換アルゴリズムで、データ長が高度合成数(すなわち、多くの小さな整数因数を持っている)である場合、より効率的です。デフォルトでは、0 paddingは使用されません、したがって、データ長が非常に大きい素数である場合の計算については、mintime と minstorage のアルゴリズムはDFTアルゴリズムと同じくらい非効率的です。変換データとして高度合成数個のデータ点を集めることは一般に適当であり、変換を効率的に計算することができるため、padding は必要ではありません。詳細は、FourierTransform,efficiency を参照してください。
|
|
ここで、bool は、値 true または false を持ち、出力が入力を上書きするかどうかを指定します。デフォルトでは、これは、false です。 さらに、float データタイプをもつ(すなわち、float, float[8], sfloat) 1つの入力配列が使用される場合、複素数の結果は、入力に保存されることができないので、 inplace 出力は使用することができません。
|
|
注意:出力データの長さが入力データのサイズを超え得るので、padding および inplace出力を使用することは一般に可能ではありません。したがって、入力には結果を格納する十分なスペースがありません。
唯一の例外は、 1-D 変換 が実行される場合で、指定したデータの長さ nelem と 最大の padding を加えたものは、入力配列になります。 この場合、出力が代わりに提供されることが可能です。
|
•
|
FourierTransform および InverseFourierTransform からの出力は、2つの形式になります。これらは、padding が使用されているかどうかにのみ依存し、異なります。
|
|
padding がない場合、出力は単に、入力データについて計算した変換を含む、(1つの複素数入力の形に対して) 1 つの 配列 あるいは、 (実部/虚部 の分けた形に対して) 配列の対を含む2つの要素の列です。 inplace の操作に対して、これらの出力の配列は、入力の配列と同じです。
|
|
padding が使用されている場合、変換に使用されるデータの長さを表すリストは、出力の列の第1の要素であり、データ (1つ、または 2つの 配列) が続きます。
|
|
効率
|
|
|
最も効率的な変換は、データ長が高度合成数である、入力データが datatype=complex[8] をもち、さらに、計算に inplaceが行われた場合に得ることができます。他のデータタイプをもつ入力データは、計算のためにcomplex[8] データ配列にコピーされ、その後、出力の際に入力データタイプに変換し直されます。詳細は、 FourierTransform,efficiency を参照してください。
|
|
|
|
例
|
|
>
|
with(DiscreteTransforms):
Digits := 15:
|
1-D 複素数のベクトルの変換
>
|
Z := Vector(5,i->evalf(exp(I*i/3)),datatype=complex[8]);
|
| (3.1) |
>
|
Z2 := FourierTransform(Z);
|
| (3.2) |
>
|
InverseFourierTransform(Z2, inplace=true):
Z-Z2;
|
| (3.3) |
2 つの1-D 実数のベクトル(実部と虚部) の変換
>
|
X,Y := Vector(5,i->evalf(cos(i/3)),datatype=float[8]),
Vector(5,i->evalf(sin(i/3)),datatype=float[8]);
|
| (3.4) |
>
|
X2,Y2 := FourierTransform(X,Y);
|
| (3.5) |
>
|
InverseFourierTransform(X2,Y2, inplace=true);
|
| (3.6) |
| (3.7) |
padding を伴う1-D 変換
>
|
Z := Vector(60,i->evalf(exp(I*i/30)));
|
| (3.8) |
>
|
Z2 := FourierTransform(Z, padding=10);
|
| (3.9) |
最大として 2 をもつ、64 のデータ長 が使用されました。
入力配列がより大きくなってもデータの長さが60と指定されている場合、in-place 出力も可能です。
>
|
Z := Vector(70,i->`if`(i>60,0,evalf(exp(I*i/30))));
|
| (3.10) |
>
|
Z2 := FourierTransform(Z, 60, padding=10, inplace=true);
|
| (3.11) |
2次元の変換、1つの時間に1次元、1度に両方を変換します。
>
|
Z := Matrix(3,4,(i,j)->(i+j)^2-i*I,datatype=complex[8]);
|
| (3.12) |
行に関して変換後、列に関して変換します。
>
|
Z2 := FourierTransform(Z, 1);
|
| (3.13) |
>
|
FourierTransform(Z2, 2, inplace=true);
|
| (3.14) |
1度に両方を変換します (inplace)。
>
|
FourierTransform(Z, inplace=true);
|
| (3.15) |
| (3.16) |
|
|
参考文献
|
|
|
E. O. Brigham.The Fast Fourier Transform. Prentice-Hall Inc., New Jersey, 1974.
|
|
|