drfftmr.dll (倍精度離散型混合基数実フーリエ変換) Ver. 1.0
dcfftmr.dll (倍精度離散型混合基数複素フーリエ変換) Ver. 1.0
Oct. 1999, Copuright (C) Hiroshi KOBAYASHI

 2つのDLL(ダイナミックリンクライブラリ)は、それぞれ実数・複素数の離散型フーリエ変換を倍精度で行います。混合基数を用いているためデータ数は任意です(2のべき乗に限りません)。実際の使い方については to_use.htm をご覧ください。
(A) drfftmr.dll (倍精度離散型混合基数実フーリエ変換)
DRFFTMR(x, n, isn, icon)
  A1. 機能
 1次元(項数n)の実時系列データ { x j } が与えられたときに、倍精度離散型実フーリエ変換またはその逆変換を混合基数を用いた高速手法(FFT)により行います。項数nは2のべき乗に限りません。

(1) フーリエ変換
{ x j } を入力しフーリエ係数 { n*ak } 、{ n*bk } を求めます。
--- nが偶数のとき ---
        n-1
n*ak = 2 Σ xj*cos(2πkj/n)  ( k = 0, 1, ..., n/2)
        j=0

        n-1
n*bk = 2 Σ xj*sin(2πkj/n)  ( k = 1, 2, ..., n/2-1)
        j=0
	
--- nが奇数のとき ---
        n-1
n*ak = 2 Σ xj*cos(2πkj/n)  ( k = 0, 1, ..., (n-1)/2)
        j=0

        n-1
n*bk = 2 Σ xj*sin(2πkj/n)  ( k = 1, 2, ..., (n-1)/2)
        j=0
	
(2) フーリエ逆変換
{ ak } 、{ bk } を入力しフーリエ級数の値 { 2*x j } を求めます。
--- nが偶数のとき ---
             n/2-1
2*xj = a0 + 2Σ(ak*cos(2πkj/n)+bk*sin(2πkj/n))+ an/2*cos(πj)
             k=1
                                               ( j = 0, 1, ..., n-1)
     
--- nが奇数のとき ---
             (n-1)/2
2*xj = a0 + 2Σ(ak*cos(2πkj/n)+bk*sin(2πkj/n))
             k=1
                                               ( j = 0, 1, ..., n-1)
     
A2. パラメータ   DRFFTMR(x, n, isn, icon)
x……
入力 --- { x j } または { ak } 、{ bk }
出力 --- { n*ak } 、{ n*bk } または { x j }
下限が0で大きさがnの1次元配列 x(0:n-1)
図1を参照してください。
n……
入力 --- 変換の項数n。
isn……
入力 --- 変換か逆変換かを指定する
変換 : isn = +1
逆変換: isn = −1
icon……
出力 --- コンディションコード
表1を参照してください。
図1
---------- nが偶数の場合 ----------
{ x j }    x0 x1 x2 x3 x4 x5 ………… xn-2 xn-1
←― n(x(0:n-1)なる1次元配列) ―→
{ a k }, { b k }    a0 an/2 a1 b1 a2 b2 ………… an/2-1 bn/2-1
(注意){ n*a k }, { n*b k } は { a k }, { b k } に準じます
 
---------- nが奇数の場合 ----------
{ x j }    x0 x1 x2 x3 x4 x5 ………… xn-2 xn-1
←― n(x(0:n-1)なる1次元配列) ―→
{ a k }, { b k }    a0 a1 b1 a2 b2 a3 ………… a(n-1)/2 b(n-1)/2
(注意){ n*a k }, { n*b k } は { a k }, { b k } に準じます

表1
コード 意味
エラー無し
nが1以下
isnが+1または−1ではなかった

A3. 注意事項
 A1. 機能 の欄の通り、このプログラムはフーリエ係数 { a k }, { b k } に対して { n*a k }, { n*b k } を、{ x j } に対しては { 2*x j } を求めますので結果の正規化は必要に応じて行ってください。ちなみに本プログラムによって変換・逆変換を正規化せずに連続して実行すると入力データの各要素は 2*n 倍されて出力されます。
(B) dcfftmr.dll (倍精度離散型混合基数複素フーリエ変換)
DCFFTMR(cr, ci, n, isn, icon)
  B1. 機能
 1次元(項数n)の実時系列データ { c j } が与えられたときに、離散型複素フーリエ変換またはその逆変換を混合基数を用いた高速手法(FFT)により行います。項数nは2のべき乗に限りません。

(1) フーリエ変換
{ c j } を入力しフーリエ係数 { n*αk } を求めます。
       n-1
n*αk =  Σ cj*exp(-2πi/n*(kj))  ( k = 0, 1, ..., n-1)
       j=0
	
(2) フーリエ逆変換
{ αk } 、を入力しフーリエ級数の値 { c j } を求めます。
      n-1
cj =  Σ αk*exp(2πi/n*(kj))  ( j = 0, 1, ..., n-1)
      k=0
     
B2. パラメータ   DCFFTMR(cr, ci, n, isn, icon)
cr……複素数の実部
入力 --- { Re( c j ) } または { Re( αk ) }
出力 --- { Re( n*αk ) } または { Re( cj ) }
下限が0で大きさがnの1次元配列 cr(0:n-1)
図1を参照してください。
ci……複素数の虚部
入力 --- { Im( c j ) } または { Im( αk ) }
出力 --- { Im( n*αk ) } または { Im( cj ) }
下限が0で大きさがnの1次元配列 ci(0:n-1)
図2を参照してください。
n……
入力 --- 変換の項数n。
isn……
入力 --- 変換か逆変換かを指定する
変換 : isn = +1
逆変換: isn = −1
icon……
出力 --- コンディションコード
表1を参照してください。
図1  cr について
{ Re( cj ) }    Re(c0) Re(c1) Re(c2) ………… Re(cn-2) Re(cn-1)
←― n(cr(0:n-1)なる1次元配列) ―→
{ Re( α k ) },     Re(α0) Re(α1) Re(α2) ………… Re(αn-2) Re(αn-1)
(注意){ n*α k } は { α k } に準じます

図2  ci について
{ Im( cj ) }    Im(c0) Im(c1) Im(c2) ………… Im(cn-2) Im(cn-1)
←― n(ci(0:n-1)なる1次元配列) ―→
{ Im( α k ) },     Im(α0) Im(α1) Im(α2) ………… Im(αn-2) Im(αn-1)
(注意){ n*α k } は { α k } に準じます

表1
コード 意味
エラー無し
nが1以下
isnが+1または−1ではなかった

B3. 注意事項
 B1. 機能 の欄の通り、このプログラムはフーリエ係数 { α k } に対して { n*α k } を求めますので結果の正規化は必要に応じて行ってください。ちなみに本プログラムによって変換・逆変換を正規化せずに連続して実行すると入力データの各要素は n 倍されて出力されます。