%表題 AGCM5 GCM基本ルーチンライブラリ (高速フーリエ変換)
%
%履歴 
%\Drireki{95/08/09 竹広真一}
%
%
\section{サブルーチンの説明 : 高速フーリエ変換}
\label{ufftr}

高速フーリエ変換のためのサブルーチン群. 
Numerical Recipes より移植した. 
基数 2 の長さのもののみあつかうことができる. 
内部でチェックしないので使用する時には注意が必要である. 
\vspace{1em}

\subsection{RFFTIM}
\label{rfftim}
\begin{enumerate}
  \item 機能 
  \begin{quote}
     高速フーリエ変換用の三角関数表を作成する. 
  \end{quote}
  \item 呼び出し方法 
      \begin{verbatim}
          CALL RFFTIM
         I     ( N     ,
         O       WTBL  , IFAC  )
      \end{verbatim}
  \item パラメーターの説明 
  \begin{quote}
    \begin{tabular}{llp{11cm}}
      {\tt N}         & {\tt [I]} & FFT を行う次元の入力データの長さ.\\
      {\tt WTBL(2,N)} & {\tt [R]} & 三角関数表\\
      {\tt IFAC(*)}   & {\tt [I]} & 因数分解(ダミー)\\
    \end{tabular}
  \end{quote}
  \item 備考 
  \begin{enumerate}
    \item 特になし. 
  \end{enumerate}
\end{enumerate}

\subsection{FFT99Y}
\label{fft99y}
\begin{enumerate}
  \item 機能 
  \begin{quote}
     格子点配列の一部に関して高速フーリエ正/逆変換を行う.
  \end{quote}
  \item 呼び出し方法 
      \begin{verbatim}
          CALL FFT99Y
         M     ( G     ,
         M       Z     ,
         C       WTBL  , 
         C       ISTR  , IFFT  , IDIM  , 
         C       KSTR  , KMAX  , KDIM  , 
         C       ISIGN                   )
      \end{verbatim}
  \item パラメーターの説明 
  \begin{quote}
    \begin{tabular}{llp{11cm}}
      {\tt G(*)}   & {\tt [R]} & 格子データ {\tt G( IDIM, KDIM )} \\
      {\tt Z(*)}   & {\tt [R]} & スペクトル {\tt Z( IFFT, KMAX )} \\
      {\tt WTBL(*)}& {\tt [R]} & 三角関数表\\
      {\tt ISTR}& {\tt [I]}    & FFT を計算開始する位置\\
      {\tt IFFT}& {\tt [I]}    & FFT の長さ\\
      {\tt IDIM}& {\tt [I]}    & 格子データの第 1 次元の大きさ\\
      {\tt KSTR}& {\tt [I]}    & FFT を計算開始する位置\\
      {\tt KSTR}& {\tt [I]}    & FFT を計算開始する位置\\
      {\tt KMAX}& {\tt [I]}    & FFT を計算する第 2 次元の大きさ\\
      {\tt KDIM}& {\tt [I]}    & 第 2 次元の大きさ\\
      {\tt ISIGN}& {\tt [I]}   & 正逆変換スイッチ. 0 :正変換 1: 逆\\
    \end{tabular}
  \end{quote}
  \item 備考 
  \begin{enumerate}
     \item 三角関数表 {\tt WTBL} はあらかじめ {\tt RFFTIM} を呼んで設
           定しておく. 
     \item {\tt G} は大きさ {\tt IDIM*KDIM} の複素数データ. 
           第 2 次元に関して {\tt KSTR} から {\tt KSTR+KMAX-1} まで, 
           それぞれ第 1 次元の {\tt ISTR} から {\tt ISTR+IFFT-1} まで
           FFT を実行する. 
     \item 正変換のとき, 出力{\tt Z} は
           第 1 次元に関して周波数 0 の成分, 周波数 {\tt 2/N}の成分, 
           {\tt 1/N} の $\cos$ 成分, $-\sin$ 成分, 
           {\tt 2/N}, $\cdots$  {\tt (2/N-1)/N} の順に並ぶ. 
     \item 変換は規格化されている. 
     \item 変換において入力データは保存されない.
  \end{enumerate}
\end{enumerate}

\subsection{RFOURT}
\label{rfourt}
\begin{enumerate}
  \item 機能 
  \begin{quote}
     実数データの高速フーリエ正/逆変換を行う. 
  \end{quote}
  \item 呼び出し方法 
      \begin{verbatim}
          CALL RFOURT
         O     ( DATAO ,
         M       DATAI ,
         F       ISIGN ,
         I       WTBL  ,
         D       N     , KMAX  , KDIM )
      \end{verbatim}
  \item パラメーターの説明 
  \begin{quote}
    \begin{tabular}{llp{11cm}}
      {\tt DATAO(KDIM,N)} & {\tt [R]} & 複素数出力データ. \\
      {\tt DATAI(KDIM,N)} & {\tt [R]} & 複素数入力データ. \\
      {\tt ISIGN}         & {\tt [I]} & 正逆変換のスイッチ. 1: 正変換 -1: 逆\\
      {\tt WTBL(2,N)}     & {\tt [R]} & 三角関数表\\
      {\tt N}     & {\tt [I]}       & FFT を行う次元の入力データの長さ.\\
      {\tt KMAX}  & {\tt [I]}       & FFT を行う範囲\\
      {\tt KDIM}  & {\tt [I]}       & FFT を行う次元以外の FFT 入力データの長さ\\
    \end{tabular}
  \end{quote}
  \item 備考 
  \begin{enumerate}
     \item 三角関数表 {\tt WTBL} はあらかじめ {\tt RFFTIM} を呼んで設
           定しておく. 
     \item {\tt DATAI} は大きさ {\tt KDIM*N} の複素数データ. 
           第 1 次元に関して 1 から KMAX まで, 
           それぞれの第 2 次元に関して FFT を実行する. 
     \item 正変換のとき, 出力{\tt DATAO} は
           第 2 次元に関して
           周波数 0 の成分, 周波数 {\tt 2/N}の成分, 
           {\tt 1/N} の $\cos$ 成分, $-\sin$ 成分, 
           {\tt 2/N}, $\cdots$  {\tt (2/N-1)/N} の順に並ぶ. 
     \item 変換は規格化されている. 
  \end{enumerate}
\end{enumerate}

\subsection{CFOURT}
\label{cfourt}
\begin{enumerate}
  \item 機能 
  \begin{quote}
     複素数データの高速フーリエ正/逆変換を行う. 
  \end{quote}
  \item 呼び出し方法 
      \begin{verbatim}
          CALL CFOURT
         M     ( DATA  ,
         F       ISIGN ,
         I       WTBL  ,
         D       N     , KMAX  , KDIM )
      \end{verbatim}
  \item パラメーターの説明 
  \begin{quote}
    \begin{tabular}{llp{11cm}}
      {\tt DATA(KDIM,2,N)} & {\tt [R]} & 複素数入出力データ. \\
      {\tt ISIGN}      & {\tt [I]} & 正逆変換のスイッチ. 1: 正変換 -1: 逆\\
      {\tt WTBL(2,N)}  & {\tt [R]} & 三角関数表\\
      {\tt N}     & {\tt [I]}      & FFT を行う次元の入力データの長さ.\\
      {\tt KMAX}  & {\tt [I]}      & FFT を行う範囲\\
      {\tt KDIM}  & {\tt [I]}      & FFT を行う次元以外の FFT 入力データの長さ
    \end{tabular}
  \end{quote}
  \item 備考 
  \begin{enumerate}
     \item 三角関数表 {\tt WTBL} はあらかじめ {\tt RFFTIM} を呼んで設
           定しておく. 
     \item {\tt DATA} は大きさ {\tt KDIM*N} の複素数データ. 
           {\tt DATA(K,1,I)} が実数部, {\tt DATA(K,2,I)} が虚数部である. 
           第 1 次元に関して 1 から KMAX までそれぞれ FFT を実行する. 
     \item 正変換のとき, 出力{\tt DATA} は第 3 次元に関して
           周波数 0 の成分の実部, 虚部, {\tt 1/N} の成分の実部, 虚部, 
           {\tt 2/N}, $\cdots$  {\tt (2/N-1)/N}, {\tt 1/2}, 
           {\tt -(2/N-1)/N}, $\cdots$, {\tt -1/N}
           の順に並ぶ. 
     \item 規格化されていないので正逆続けて呼んでも元には戻らない.
           {\tt N} で割算する必要がある. 
  \end{enumerate}
\end{enumerate}

%\newpage
