gtstspct の解説

96/09/08 堀之内
97/02/01 堀之内 (ちょっと書き足す)

● 機能

空間(主に経度を想定)-時間 の2次元のスペクトルを求める。

※ 「空間」軸は等間隔グリッドであれば必ずしも経度でなくてよいが、以下
   の説明では簡単のため経度を想定し、「東進」、「西進」といった表現を
   使う。

● 旧版(gtstspct_old)との違い。

新しく実現した機能： 定常成分の出力(オプション steady=T)

なくなった機能： 「空間」軸を指定するオプション sdim を廃止し、
第１次元を空間軸と仮定

上記の機能廃止は、意図したものというより、SDIM が 1 以外である可能性を
残したままでのプログラムの改造が面倒くさかったからという消極的な理由に
よるものである。実際の使用にあたっては 空間軸＝経度 でばかり使っていた
ので、SDIM=1 しか必要なかった。

● 入力

入力は異なる時刻には異なるヘッダーがつく時系列(gtseqしていないもの)を
仮定する。「空間」軸にはデータの第一次元を用いる(※)。

  (※) 旧版 gtstspct_old ではオプション SDIM により「空間」軸を選べる。

計算に用いる FFT の都合上、空間軸時間軸ともグリッド数が 2,3,5 で因数分
解できる偶数でなければならない。

 

● 出力

出力されるファイルは

  スペクトル (デフォルト名はgtool.out)
  位相       (デフォルト名はgtoolph.out)
  波数軸ファイル (@WVNWE* : *には最大波数が入る)
  振動数軸ファイル (@FREQ*-? : *にはデータの個数が、?には何日分の時系列
                    からつくられたかが入る)

である。スペクトルと位相の定義は後述。位相及び軸ファイルは出力しないこ
ともできる(オプション -noph, -noax)。

波数軸は西進から東進へとならび (M=-MMAX,-MMAX+1,...,0,...,MMAX)、振動
数は低周波から高周波へと並ぶ。その際、定常成分（振動数＝０）を省略する
ことも可能である。

※ このコマンドを最初につくったときには定常成分を出力しないようにして
   いたが、後に出力できるよう改良した。その経緯からデフォルトでは出力
   しないようにしている(● オプション の steady の項を参照のこと)。ま
   た、定常成分を出力するかしないかでつくられる軸ファイルが違うのも無
   駄だと思うので統一するよう改めたい。

入力が３次元データ(の時系列)である場合、出力は４次元になってしまうが
gtool の都合上、３次元データの列にせざるを得ない。デフォルトでは振動数
の列として出力されるが、オプション seq により、別の軸をばらして列にす
ることもできる。各ヘッダーの ETTL に周期や本来の軸上の位置を書き込む。

※ バグ: SEQ=2または3の場合、軸の最初のグリッドは軸ファイル上の一番目
   の位置を仮定するので gtext したファイルを入力にした場合の ETTL は正
   しくない。

● オプション 

out[C]  出力ファイル名(スペクトル. デフォルトは $GTTMPDIR/gtool.out)
outp[C] 出力ファイル名(位相. デフォルトは $GTTMPDIR/gtoolph.out)
noax[L] T-> 軸ファイルを出力しない (デフォルトは F)
noph[L] T -> 位相を出力しない (デフォルトは F)
steady[L] T -> 定常成分(ω＝0)も出力する (デフォルトは F)
seq[I] (空間３次元データのスペクトルを求める場合にのみ有効)
       1-3 を指定すると、振動数を第3番目の軸として出力する代りに、
       もとのデータの seq 番目の軸をばらして列にする(seq=1なら波数を
       ばらす).
       デフォルトは 4. すなわち振動数をばらして列にする.
rstrd[L] T -> 空間FFTの前にリニアトレンドを引く(うまく行ってるかどう
         か確認してなかったかも知れない.  デフォルトは F.)
rttrd[L] T -> 時間FFTの前にリニアトレンドを引く (同上)
mis00[L] T -> s=ω=0成分を欠損値にする(これを指定すると強制的に
         steady=Tにする) デフォルトは F. このオプションは s=ω=0 成分
         が大きすぎてグラフを書く上でうっとうしい場合に用いるとよい.
log[L] ヘッダーの STYP を 2 にする
help[L], item[C], unit[C], title[C], dset[C], greset[L] 多くのコマンド
       と共通。unitは何も指定しなくても適当な書き換えが行われる。

● スペクトルと位相の定義。

ここでは振動数を０以上とする one-sided スペクトルを用いる。

空間・時間グリッド

  x=x_1,x_2,..,x_I, t=t_1,t_2,..,t_J  (等間隔)

上で与えられた f_{ij}≡f(x_i,t_j) は

  f_{ij}= \sum_{l=0}^{J/2} \sum_{k=-I/2}^{I/2}
             E_{kl} cos( ki - lj + φ_{kl} )

と表せる。k>0は東進、k<0が西進成分である。「位相」は φ_{kl} で定義し、
「スペクトル」は

  S_{kl} = ( E_{kl} )^2 / 2 (l≠0の場合)
           ( E_{kl} )^2     (l＝0の場合)

で定義する。すると

  (f_{ij})^2 の平均値 ＝ \sum_{l=0}^{J/2} \sum_{k=-I/2}^{I/2} S_{kl}  (*)

となる（パーセバルの等式）。なお、steady=F により定常成分を出さない場
合、左辺はもちろん f_{ij} から時間平均値を引いたものの二乗平均値になる。

S_{kl} の単位は f_{ij} のそれの二乗になる。


● 「パワースペクトル密度」を求めたいとき  (以下 97/02/01 に記す)

定数倍すればよい。以下では標準的な使用法である、経度・時間に関してフー
リエ変換した場合を例として、「定数」には何を用いれば良いかを述べる。

波数 s、振動数 f を独立変数とする場合、パワースペクトル密度 P_{kl} は 
(*) のかわりに

  (f_{ij})^2 の平均値 ＝ \sum_{l=0}^{J/2} \sum_{k=-I/2}^{I/2} P_{kl}ΔsΔf
                                                                     (**)
    Δs ＝ sの増分 ＝ 1
    Δf ＝ fの増分 ＝ 1/T (Tはデータの期間)

が成り立つようにすれば良い。よって、

   P_{kl} ＝ S_{kl}/(ΔsΔf) ＝ T・S_{kl}。

つまり T 倍すれば良い。

● 応用例 -- クロススペクトル

u.data と v.data という２つのデータのクロススペクトルを求める。

  % gtstspct u.data outp:u.phase                 # 位相 ＞ u.phase
                                                   スペクトル ＞ gtool.out
  % gtsqrt   out:u.amp                           # スペクトルのルート＞u.amp
  % gtstspct v.data outp:v.phase
  % gtsqrt   out:v.amp
  % gtsub u.phase v.phase
  % gtcos                                        # cos(位相差) ＞ gtool.out
  % gtmlt u.amp                                  # それに u.amp を掛け、
  % gtmlt v.amp  out:uv.cospect \
      unit:'m|2"s|-2"' title:'cospectrum(U,W)'   # v.amp を掛けて出来上がり。
                                                   u,w の単位＝m/sを仮定した

以上でコスペクトル(0 or π ずれ成分)が求まる。これを応用すると EP フラッ
クスの波数・振動数分布の計算といったことが出来る。


