Cross-spectral and power-spectral analysis of real time series, Blackman-Tukey lagged covariance method

実数時系列のクロススペクトル・パワースペクトル解析、 Blackman・Tukey ラグ共分散法

この文書は、増田が執筆した 東京大学大型計算機センター プログラムライブラリ説明書 (東大大型計算機センター, 1987)の原稿をもとに、 操作については、 2000年3月現在増田が使用していたLinuxマシン上での説明に書きかえたものです。 機種やマシンに依存する部分には節見出しに(*)印をつけておきます。 操作以外の部分は1987年の当時の認識に基づいた記述のままです。 ここで採用したクロススペクトルの定義は、 もしかするとスペクトル解析の標準とされているものと (符号のとりかたや規格化の分母などの点で)同じでないかもしれません。 HTMLファイル中の数式およびプログラム例は、<pre>を使っており、 <pre>の中の文字のフォント幅が 日本語文字はASCII文字の2倍でそれぞれ一定であることを前提として書いてあります。 HTML本文中のリンクはこの文書内の相互参照です。

§1. あらまし

1.0 題目

二つの実数時系列のクロススペクトル、コヒーレンス、位相差、 または一つの実数時系列のパワースペクトルを、 Blackman・Tukeyのラグ共分散法で計算する。

1.1 定義

ここでは定常時系列x(t)の自己共分散関数(ラグτの関数)を

   Cxx(τ) = E(x(t)x(t-τ))                               (1.1)
(Eは期待値を示す)として、 (片側)パワースペクトル密度をWiener-Khintchine公式に従い
                ∞
   Sxx(f) = 4 ∫  Cxx(τ)cos 2πfτ dτ                   (1.2)
                0
とする。また、x(t)とy(t)の相互共分散関数を
   Cxy(τ) = E(x(t)y(t-τ))                               (1.3)
として、クロススペクトル密度を
   Sxy(f) = Kxy(f) - iQxy(f);                           (1.4a)

                ∞
   Kxy(f) = 2 ∫ (Cxy(τ)+Cxy(-τ)) cos 2πfτ dτ;     (1.4b)
                0

                ∞
   Qxy(f) = 2 ∫ (Cxy(τ)-Cxy(-τ)) sin 2πfτ dτ       (1.4c)
                0
と書くことにする。(クロススペクトルは両側スペクトルで定義するのが普通だが、 ここではx=yとしたとき(1.2)式に一致するようにした。)

クロススペクトルの実数部Kxyは、二つの時系列の位相がそろって変化している 振幅を示し、co-spectrumと言われる。 虚数部Qxyは90度位相がずれて変化している振幅を示し、quadrature spectrumと言われる。 位相を問わずに、ある(有限幅の)振動数成分がどの程度同期しているかを論じるには、コヒーレンスという量が使われる。 これはクロススペクトルの絶対値をそれぞれのパワースペクトルの積の平方根で割ったもので、全く無関係のとき0、両者が線形関係になっているとき1、一般にその間の値をとる(このコヒーレンスの2乗をコヒーレンスという人もいる)。 また、二つの時系列の各振動数成分の位相差はクロススペクトルの偏角として求められる(たとえば日野、1977、4章を参照)。

1.2 計算の方式

ここでは、(1.2), (1.4)式に従って、パワースペクトル密度は自己共分散関数の、クロススペクトル密度は相互共分散関数のフーリエ変換として求める。 実際には時系列の長さが有限であるために振動数領域は離散化され、また時系列が離散的にサンプリングされているために振動数領域は有限となる。

特に、共分散を計算するラグ(時間差)LΔtをある有限のところ(L=LMAX)で打ち切ることは、共分散関数に箱型のラグウィンドウ(2.1.3節のIWNTYP=0)をかけていることに相当する。 時間領域でラグウィンドウをかけることと、振動数領域でそのフーリエ変換であるスペクトルウィンドウをたたみこむことは同等であるが、箱型ウィンドウをフーリエ変換すると、非常に波うった形のスペクトルウィンドウとなり、正であるべきパワースペクトルが負になることも多い。 負のパワーを避けるとともにスペクトルの推定誤差を小さくするために、L=LMAXに向かってなめらかに0に落ちるようなラグウィンドウをかけておくことが行なわれる。 ウィンドウを使うことの必要性を誤差解析から体系的に論じたBlackman・Tukey(1958)の本にちなんで、この方法は普通Blackman・Tukey法と呼ばれる。 スペクトルの推定値のばらつきと偏りとは競合する関係にあるので、どんな誤差を最小にしたいかによっていろいろなウィンドウが考えられる。 Hanning (Blackman・Tukeyがオーストリアの気候学者Julius von Hannにちなんでつけた名前)はもともと、(1,2,1)の重みをつけた平滑化をさしていた。 それをスペクトル領域で行なうのと同等なラグウィンドウが2.1.3節のIWNTYP=2である。 スペクトル密度の推定誤差については、正規分布を前提としてではあるが、よく調べられている(たとえば日野、1977、11章参照)。

欠損値(観測もれやデータ伝達の誤りなど)のある時系列のスペクトルの推定については必ずしも統計理論の裏付けはない。 ここでは、共分散関数の推定値を求める際に欠損のある対をはぶくとともに、分母にも算入しないことにする。 つまり、ラグLΔtでの欠損値を含む対の数をmとすると、


                  1     N
   Cxy (LΔt)  = -----  Σ            x(jΔt) y((j-L)Δt)   (1.5)
                 N-L-m  j=L+1(有効な対)

で計算している。

また、共分散関数からスペクトル密度へのフーリエ変換は、

         k         M                          πkL
   Sxx(------) = 4 Σ  Cxx(LΔt) W(LΔt) cos ------  δ(L) Δt
        2MΔt     L=0                          M                (1.6)

         k         M     (e)                  πkL
   Kxy(------) = 4 Σ  Cxy(LΔt) W(LΔt) cos ------  δ(L) Δt
        2MΔt     L=0                          M                (1.7a)

         k         M     (o)                  πkL
   Qxy(------) = 4 Σ  Cxy(LΔt) W(LΔt) sin ------  δ(L) Δt
        2MΔt     L=0                          M                (1.7b)
として計算する。ただし
   δ(L) = 0.5 : L=0とL=M,  
           1.0 : 0 < L < M                                      (1.8)
区間(0,MΔt)のうち、離散化されたラグLが代表するτの幅はδ(L)Δtである。
     (e)      1
   Cxy(τ) = ---(Cxy(τ) + Cyx(τ)): 相互共分散の偶関数部分     (1.9a)
              2

     (o)      1
   Cxy(τ) = ---(Cxy(τ) - Cyx(τ)): 相互共分散の奇関数部分     (1.9b)
              2
M(プログラム中のLMAX)は最大のラグの番号であるとともに最大の振動数番号、Wはラグウィンドウである。

Blackman・Tukey法によるスペクトルの推定誤差はほぼ自由度2N/Mのχ2分布に従う。Mを大きくするとスペクトルの分解能1/MΔtは上がるが推定の誤差が大きくなる。 実用的には、MをおよそNの1/10以下にするのがよいとされる(たとえば日野、1977、12章)。

1.3 ほかの計算方式との比較

このほかのスペクトル計算方式としてよく使われるものは、直接フーリエ変換法(普通高速フーリエ変換を使うのでFFT法と呼ばれる)と、最大エントロピー法(MEM)がある。

FFT法は時系列を直接離散フーリエ変換し、振動数領域でかけ合わせることでパワースペクトルやクロススペクトルを求めるものである。 フーリエ変換の一意性から、これは共分散関数から求めるのと同等であることがわかる。 ただし時系列の端の処理だけは互換性がない。 推定誤差を小さくするためのスペクトルウィンドウとしては、Blackman・Tukey法で考えられているラグウィンドウをフーリエ変換したものを使えばよい。 ほしい振動数の分解能が高くなるにしたがってBlackman・Tukey法ではラグを長くとらなければならないので共分散の計算量がふえ、相対的にFFT法が有利になる。ただしFFT法では欠損値の処理が困難である。

MEM法あるいは自己回帰モデルあてはめ法は、時系列が線スペクトルでよく近似されるような周期性をもっていることを前提として、それを情報量を失わないように取り出そうとするものである。 それに対してBlackman・Tukey法やFFT法は、仮定をおかずにある振動数帯にどれだけのパワーをもっているかを見ようとするものである。 したがって、MEMに比べてBlackman・ Tukey法ではするどいピークが出にくいのは当然である。

1.4 ルーチンの構成

このライブラリは7つのルーチンからなっている。
G3RIL  G3RXLまたはG3RPLに必要な三角関数とラグウィンドウを用意する。
G3RXL  二つの時系列のクロススペクトルを計算する。
G3RPL  一つの時系列のパワースペクトルを計算する。
G3RAV  平均値を計算する(G3RXL,G3RPLの下うけ)。
G3RCV  共分散を計算する(G3RXL,G3RPLの下うけ)。
G3RFU  共分散からスペクトル密度へのフーリエ変換(G3RXL,G3RPLの下うけ)。
Y8AA01 二つの時系列のクロススペクトルを計算し、印刷する(G3RXLの応用)。
呼ぶ関係(左から右を呼ぶ)
  Y8AA01----G3RXL----G3RAV
                 ----G3RCV
                 ----G3RFU
        ----G3RIL
            G3RPL----G3RAV
                 ----G3RCV
                 ----G3RFU

§2.使い方

2.0 コマンド(*)

("USER"は適当な名前を表わす)

2.0.1 ロードモジュールライブラリの利用

% f77 USER.f -lg3rxl
% ./a.out
USER.fの内容
      PROGRAM p1
..........
      CALL G3RIL(......)
      CALL G3RXL(......)
..........
      END

注: ルーチンY8AA01はロードモジュールライブラリに含めていない。

2.0.2 ソースライブラリの利用(*)

2.0.2.1 プログラムの実行(*)
% cp /usr/local/src/masuda/spectr/g3rxl.f .
% f77 USER.f
% ./a.out
USER.fの中には、次のように、 INCLUDE文を入れておき、 ライブラリのソースプログラムをコンパイルさせる。
USER.fの内容
      PROGRAM p2
..........
      CALL G3RIL(......)
      CALL G3RXL(......)
..........
      END
      INCLUDE '/usr/local/src/masuda/spectr/g3rxl.f'

注: ルーチンY8AA01を利用する場合は、 g3rxl.fに加えて、同じディレクトリの別ファイルy8aa01.fも INCLUDEする必要がある。

2.0.2.2 ライブラリプログラムの印刷(*)
cd /usr/local/src/masuda/spectr
a2ps g3rxl.f | lpr -Pgslips
2.0.2.3 ライブラリプログラムの複写(*)
cp /usr/local/src/masuda/spectr/g3rxl.f .
これでカレントディレクトリの g3rxl.f へ複写される。

2.1 初期設定ルーチン G3RIL

2.1.0 役割

G3RXLまたはG3RPLで使う三角関数の表COSSINおよびラグウィンドウWINDOWを用意する。 G3RXLまたはG3RPLを使う場合には先にこれを呼んでおかなければならない。 ただし同じLMAXの値で使う場合には、G3RILを1回呼んで得られたCOSSINとWINDOWを繰り返し使えばよい。

2.1.1 呼びだし方

CALL G3RIL(LMAX,MXCS,COSSIN,WINDOW,IWNTYP,LDATA,QLAMDA)

2.1.2 引き数の説明

入出力の別引き数型、長さ(バイト)寸法(配列の)内容
入力LMAX整数*4ラグをいくつまでとるか。(ラグの範囲は0からLMAX*Δtまで)
MXCS整数*4COSSINの寸法に関する定数。MXCS≧LMAX*2-1。
IWNTYP整数*4ウィンドウの選択。2.1.3節参照。
LDATA整数*4=0:データの長さによる共分散の補正をしない。
≠0:データの長さによる共分散の補正をする。 LDATAはG3RXLまたはG3RPLのLENGと等しくすること。
QLAMDA整数*4IWNTYP=21の場合の定数Λ。
出力COSSIN実数*4(0:MXCS,2)三角関数の表。
COSSIN(KL,1): cos(KL*π/LMAX)
COSSIN(KL,2): sin(KL*π/LMAX)
WINDOW実数*4(0:LMAX)ラグウィンドウ。
WINDOW(L): ラグLの共分散にかける重み。

2.1.3 ラグウィンドウの選択 IWNTYPの意味

(注) WINDOW(L) = W(LΔt), R = Lπ / LMAX, a = L / LMAX。
0:箱型(box-car)WINDOW(L) = 1.0 (L ≦ LMAX, 以下同じ)
1:Bartlett (三角)WINDOW(L) = (LMAX-L)/LMAX
2:Hanning (raised cosine; Blackman・Tukey 1958, p.14) WINDOW(L) = 0.5 + 0.5cosR
3:Hamming(raised cosine を修正し、最初のside lobeが最小になるようにしたもの、 Blackman・Tukey 1958, p.14)WINDOW(L) = 0.54 + 0.46cosR
4:Blackman (Blackman・Tukey 1958, P. 98) WINDOW(L) = 0.42 + 0.50cosR + 0.08cos2R
10:赤池 (赤池・中川 1972, p.46)WINDOW(L) = 0.625 + 0.50cosR - 0.125cos2R
11:赤池(1962, 1968) の W(1)WINDOW(L) = 0.5132 + 0.4868cosR
12:同 W(2)WINDOW(L) = 0.6398 + 0.4802cosR - 0.1200cos2R
13:同 W(3)WINDOW(L) = 0.7029 + 0.4456cosR - 0.1782cos2R + 0.0298cos3R
21:Daniell (区間(f-Λ,f+Λ)のスペクトルの推定; 藤井 1974, p. 162) WINDOW(L) = sin(2πΛL)
Λは引き数QLAMDAとして与える。
31:Parzen (コヒーレンスの絶対値が1以内になる; 日野 1977, p. 190) WINDOW(L) = 1 - 6(1-a)a2 (L ≦ LMAX/2)
WINDOW(L) = 2(1-a)3 (LMAX/2 < L < LMAX)
これ以外のIWNTYPの値が指定された場合には、警告メッセージを出したうえHanningとして処理する。

2.1.4 ラグウィンドウの補正 LDATAの意味

このプログラム(サブルーチンG3RCV)では、時系列xとyとのラグLΔtでの共分散関数Cxy(LΔt)の推定には、(1.5)式を使っている。 欠損値のない場合、次の式になる。
                  1    N
   Cxy (LΔt) = -----  Σ x(jΔt) y((j-L)Δt)                    (2.1)
                 N-L  j=L+1
ここでNはデータの長さ(LENG)である。分母のN-Lは、実際に計算に使えるデータの対の数である。 これに対して、Lにかかわらず常にNを分母とした
                  1    N
   Cxy (LΔt) = ----- Σ x(jΔt) y((j-L)Δt)                    (2.2)
                  N   j=L+1
を使ったほうがよいという立場もある(たとえば赤池・中川、1972)。 そこで、藤井(1974)と同様に、(N-L)/Nをラグウィンドウのほうにかけておくことにより、実質的に(2.2)式を共分散関数の推定値として使うことができるようにした。 これは、G3RILで、LDATAにNの値を与えることによって指定できる。 LDATA=0を与えたときは(2.1)式のままとする。

2.2 クロススペクトルの計算 G3RXL

2.2.0 役割

二つの時系列のクロススペクトル、コヒーレンス、位相差を計算する。結果は引き数の配列で持ち帰る。 エラーメッセージ以外の読み書きは行なわない。

2.2.1 呼び出し方

CALL G3RXL(LENG,  LMAX,  DELT,  A1,    A2,
     COV1,  COV2,  COV12, COV21, COVC,  COVS,  MISS1, MISS2, MIS12, MIS21, 
     FOUR1, FOUR2, FOURC, FOURQ, FOURX, FOURY, COHER, PHASE,
     MXCS,  COSSIN,WINDOW,IFMIS1,QMISS1,IFMIS2,QMISS2,IRTN)

2.2.2 引き数の説明

位相差(A1に対するA2の位相の進み)。単位ラジアン
入出力の別引き数型、長さ(バイト)寸法(配列の)内容
入力LENG整数*4時系列の長さ。
LMAX整数*4ラグをいくつまでとるか。
DELT実数*4時間のサンプリング間隔。
A1実数*4(LENG)第1の時系列データ。
A2実数*4(LENG)第2の時系列データ。
MXCS整数*4G3RIL(2.1節)のMXCSと同じ。
COSSIN実数*4(0:MXCS,2)三角関数の表(G3RILで作られたもの)。
WINDOW実数*4(0:LMAX)ラグウィンドウ(G3RILで作られたもの)。
IFMIS1整数*4=0:第1の時系列には欠損値がない。
≠0:第1の時系列には欠損値がある。
QMISS1実数*4IFMIS1≠0のとき、|A1(J)|≧QMISS1であるA1(J)は欠損値である。IFMIS1=0のときはQMISS1は意味がない。
IFMIS2整数*4=0:第2の時系列には欠損値がない。
≠0:第2の時系列には欠損値がある。
QMISS2実数*4IFMIS2≠0のとき、|A2(J)|≧QMISS2であるA2(J)は欠損値である。IFMIS2=0のときはQMISS2は意味がない。
出力COV1実数*4(0:LMAX)時系列1の自己共分散関数。
COV2実数*4(0:LMAX)時系列2の自己共分散関数。
COV12実数*4(0:LMAX)時系列1と時系列2の相互共分散関数(時系列1のある時刻の値と時系列2のL*DELTだけ過去の値との時差共分散)。
COV21実数*4(0:LMAX)時系列2と時系列1の相互共分散関数。
COVC実数*4(0:LMAX)二つの時系列の共分散関数の偶関数成分。
COVS実数*4(0:LMAX)二つの時系列の共分散関数の奇関数成分。
MISS1整数*4(0:LMAX)COV1 を計算したときのそれぞれのラグLについての欠損値を含む対の数。
MISS2整数*4(0:LMAX)COV2 を計算したときのそれぞれのラグLについての欠損値を含む対の数。
MIS12整数*4(0:LMAX)COV12を計算したときのそれぞれのラグLについての欠損値を含む対の数。
MIS21整数*4(0:LMAX)COV21を計算したときのそれぞれのラグLについての欠損値を含む対の数。
FOUR1実数*4(0:LMAX)時系列1のパワースペクトル。
FOUR2実数*4(0:LMAX)時系列2のパワースペクトル。
FOURC実数*4(0:LMAX)二つの時系列のco-spectrum.
FOURQ実数*4(0:LMAX)二つの時系列のquadrature spectrum.
FOURX実数*4(0:LMAX)(FOUR1*FOUR2)
FOURY実数*4(0:LMAX)(FOURC**2 + FOURQ**2)
COHER実数*4(0:LMAX)二つの時系列のコヒーレンス (FOURY/FOURX)。
PHASE実数*4(0:LMAX)
IRTN整数*4= 0: スペクトルが正常に求まった。
= 1: 欠損値のため平均値が計算できなかった。
= 2: 欠損値のためあるラグに対する共分散が計算できなかった。
IRTN≠0のとき、ほかの計算結果は無意味である。

2.2.3 エラーメッセージ

欠損値が多すぎて平均値や共分散関数が計算できない場合、つぎのメッセージを端末(Fortran装置番号6)に書き出す。
  G3RXL: SPECTRA ARE NOT CALCULATED.
  ALL DATA ARE MISSING FOR COVARIANCE WITH LAG = (ラグの数)
  BETWEEN SERIES NO.(1または2)AND(1または2)
ただし、平均値の計算ができない場合、(ラグの数)を0として表示する。

2.3 パワースペクトルの計算 G3RPL

2.3.0 役割

一つの時系列のパワースペクトルを計算する。 結果は引き数の配列で持ち帰る。 エラーメッセージ以外の読み書きは行なわない。

2.3.1 呼び出し方

CALL G3RPL(LENG,  LMAX,  DELT,  A1,    COV1,  MISS1,
           FOUR1, MXCS,  COSSIN,WINDOW,IFMIS1,QMISS1,IRTN)

2.3.2 引き数の説明

入出力の別引き数型、長さ(バイト)寸法(配列の)内容
入力LENG整数*4時系列の長さ。
LMAX整数*4ラグをいくつまでとるか。
DELT実数*4時間のサンプリング間隔。
A1実数*4(LENG)時系列データ。
MXCS整数*4G3RIL(2.1節)のMXCSと同じ。
COSSIN実数*4(0:MXCS,2)三角関数の表(G3RILで作られたもの)。
WINDOW実数*4(0:LMAX)ラグウィンドウ(G3RILで作られたもの)。
IFMIS1整数*4=0:時系列には欠損値がない。
≠0:時系列には欠損値がある。
QMISS1実数*4IFMIS1≠0のとき、|A1(J)|≧QMISS1であるA1(J)は欠損値である。IFMIS1=0のときはQMISS1は意味がない。
出力COV1実数*4(0:LMAX)時系列の自己共分散関数。
MISS1整数*4(0:LMAX)COV1 を計算したときのそれぞれのラグLについての欠損値を含む対の数。
FOUR1実数*4(0:LMAX)時系列のパワースペクトル。
IRTN整数*4= 0: スペクトルが正常に求まった。
= 1: 欠損値のため平均値が計算できなかった。
= 2: 欠損値のためあるラグに対する共分散が計算できなかった。
IRTN≠0のとき、ほかの計算結果は無意味である。

2.3.3 エラーメッセージ

欠損値が多すぎて平均値や共分散関数が計算できない場合、つぎのメッセージを端末(Fortran装置番号6)に書き出す。
  G3RPL: SPECTRA ARE NOT CALCULATED.
  ALL DATA ARE MISSING FOR COVARIANCE WITH LAG = (ラグの数)
ただし、平均値の計算ができない場合、(ラグの数)を0として表示する。

2.4.0 役割

一つの時系列の平均値を計算する。 (
G3RXL, G3RPLの下うけルーチン)

2.4.1 呼び出し方

CALL G3RAV (LENG, A1, ABAR1, IFMIS1, QMISS1, IRTN)

2.4.2 引き数の説明

入出力の別引き数型、長さ(バイト)寸法(配列の)内容
入力LENG整数*4時系列の長さ。
A1実数*4(LENG)時系列データ。
IFMIS1整数*4=0:時系列には欠損値がない。
≠0:時系列には欠損値がある。
QMISS1実数*4IFMIS1≠0のとき、|A1(J)|≧QMISS1であるA1(J)は欠損値である。IFMIS1=0のときはQMISS1は意味がない。
出力ABAR1実数*4時系列の平均値。
IRTN整数*4= 0: 平均値が正常に求まった。
= 1: 欠損値のため平均値が計算できなかった。
IRTN≠0のとき、ほかの計算結果は無意味である。

2.5 共分散関数の計算 G3RCV

2.5.0 役割

二つの時系列の相互共分散関数を計算する。二つの時系列として同じものをとれば、自己共分散関数の計算になる。 (G3RXL, G3RPLの下うけルーチン)

2.5.1 呼び出し方

CALL G3RCV(LENG,LMAX,A1,A2,COVX,MISSX,ABAR1,ABAR2,
           IFMIS1,QMISS1,IFMIS2,QMISS2,IRTN)

2.5.2 引き数の説明

入出力の別引き数型、長さ(バイト)寸法(配列の)内容
入力LENG整数*4時系列の長さ。
LMAX整数*4ラグをいくつまでとるか。
A1実数*4(LENG)第1の時系列データ。
A2実数*4(LENG)第2の時系列データ。
ABAR1実数*4A1の平均値 (G3RAVで計算されたもの)
ABAR2実数*4A2の平均値 (G3RAVで計算されたもの)
IFMIS1整数*4=0:第1の時系列には欠損値がない。
≠0:第1の時系列には欠損値がある。
QMISS1実数*4IFMIS1≠0のとき、|A1(J)|≧QMISS1であるA1(J)は欠損値である。IFMIS1=0のときはQMISS1は意味がない。
IFMIS2整数*4=0:第2の時系列には欠損値がない。
≠0:第2の時系列には欠損値がある。
QMISS2実数*4IFMIS2≠0のとき、|A2(J)|≧QMISS2であるA2(J)は欠損値である。IFMIS2=0のときはQMISS2は意味がない。
出力COVX実数*4(0:LMAX)時系列1と時系列2の相互共分散関数。
MISSX整数*4(0:LMAX)COVX を計算したときのそれぞれのラグLについての欠損値を含む対の数。
IRTN整数*4= 0: 共分散関数が正常に求まった。
> 0: 欠損値のためラグ(IRTN-1)に対する共分散が計算できなかった。
IRTN≠0のとき、ほかの計算結果は無意味である。

2.6 共分散関数からスペクトルへの変換 G3RFU

2.6.0 役割

G3RCVで求めた共分散関数にウィンドウをかけた上でフーリエ(コサインまたはサイン)変換し、スペクトル密度にする。(G3RXL, G3RPLの下うけルーチン)

2.6.1 呼び出し方

CALL G3RFU (LMAX,DELT,COVX,ICS,FOURX,MXCS,COSSIN,WINDOW)

2.6.2 引き数の説明

出力
入出力の別引き数型、長さ(バイト)寸法(配列の)内容
入力LMAX整数*4ラグをいくつまでとるか。
DELT実数*4時間のサンプリング間隔。
COVX実数*4(0:LMAX)共分散関数(G3RCVで作られたもの)
ICS整数*4= 1: COVXを偶関数とみなしてcosine変換をする。
= 2: COVXを奇関数とみなして sine変換をする。
MXCS整数*4G3RIL(2.1節)のMXCSと同じ。
COSSIN実数*4(0:MXCS,2)三角関数の表(G3RILで作られたもの)。
WINDOW実数*4(0:LMAX)ラグウィンドウ(G3RILで作られたもの)。
FOURX実数*4(0:LMAX)パワースペクトルまたはクロススペクトル。

2.7 クロススペクトルの計算と印刷 Y8AA01

2.7.0 役割

二つの時系列のクロススペクトル、コヒーレンス、位相差を計算し、端末(Fortran装置番号6)に書き出す。この中からG3RILG3RXLを呼び出している。

2.7.1 呼び出し方

CALL Y8AA01 (KAISU, ISTART, IEND, LMAX, DELT, A1, A2, MOJI1, MOJI2)

2.7.2 引き数の説明

入出力の別引き数型、長さ(バイト)寸法(配列の)内容
入力KAISU整数*4=0: 初期設定(G3RIL)を行ない、cosine, sine関数およびラグウィンドウの値を表示する。
=1: 初期設定(G3RIL)を行なう。
≧2: 初期設定を行なわない。すでに同じLMAXの値でY8AA01が呼ばれている場合。
ISTART整数*4時系列のいくつめから計算に使うか。
IEND整数*4時系列のいくつめまで計算に使うか。
LMAX整数*4ラグをいくつまでとるか。
DELT実数*4時間のサンプリング間隔。
A1実数*4(IEND)第1の時系列データ。
A2実数*4(IEND)第2の時系列データ。
MOJI1文字*1第1の時系列を表わす文字。
MOJI2文字*1第2の時系列を表わす文字。

2.7.3 印刷されるもの

  1. 三角関数とラグウィンドウの値 (KAISU = 0を与えた場合):
    それぞれのKLの値ごとに KL, COSSIN(KL,1), COSSIN(KL,2),
    それぞれのLの値ごとに (実際には上の三角関数の横に) L, WINDOW(L) を表示する。
  2. 共分散関数:
    それぞれのLの値ごとに L, DELT*L, COV1(L), MISS1(L), COV2(L), MISS2(L), COV21(L), MIS21(L), COV12(L), MIS12(L), COVC(L), COVS(L), L を表示する。
  3. クロススペクトル:
    それぞれのKの値ごとに K, 振動数FREQ=K/(2*LMAX*DELT), 周期PERIOD=1/FREQ, FOUR1(K), FOUR2(K), FOURX(K), FOURC(K), FOURQ(K), FOURY(K), COHER(K), 度単位の位相差PHASE(K)*180/π,周期単位の 位相差PHASE(K)/2π, K を表示する。
なお、1行132字のプリンタを想定している。 また、書式は主としてF10.2を使っているので、入力データA1,A2の大きさは10-2と102の範囲にしておくことが望ましい。

2.7.4 制限

ルーチンの中でとっている配列があるため、LMAX≦100でなければならない。 そうでないと、次のエラーメッセージを出し、計算をしないで呼んだルーチンにもどる。
   Y8AA01: LMAX (LMAXの値) IS LARGER THAN DIMENSION (MXLの値)
これより大きいLMAXの値で使いたいときは、ソースライブラリをコピーし、PARAMETER文
   PARAMETER (MXL=100, MXCS=2*MXL-1)
のMXLの値を変えて使えばよい。

2.7.5 Common変数(*)

次のcommon文により、無名(blank)common領域を使っている。
   COMMON   COSSIN(0:MXCS,2), WINDOW(0:MXL)
無名commonを別の目的に使いたいときは注意が必要である。 これはもともと、繰り返し使いたい三角関数とラグウィンドウの値を保存させるため、メインプログラムと共有する形にしたものである。 HITAC Mシリーズ機やHITAC S810では、特にオーバーレイをしないかぎりすべての変数が保存されるので、メインプログラムに同じcommon文を置く必要はない。 (§3の使用例ではcommon文を入れておいた。)

2.7.6 仮定されている値

Y8AA01からG3RILおよびG3RXLをよぶときに仮定されている値は次のとおり。 ラグウィンドウについて(G3RILの引き数):
IWNTYP = 2           Hanningである。
LDATA  = 0           2.1.4節で述べた補正を行なわない。
QLAMDA = 0.0         (Hanningなので特に意味はない。)
欠損値について(G3RXLの引き数):
IFMIS1 = IFMIS2 = 1      どちらの時系列にも欠損値がありうる。
QMISS1 = QMISS2 = 1.E6   欠損値は絶対値百万以上の値で表わされている。

2.7.7 隠しパラメータ KSKIP

サブルーチンY8AA01の中にKSKIPという変数がある。登録されているプログラムでは KSKIPはDATA文で1に設定してあるが、これを0に変えてコンパイル、実行すると、2.7.3節で述べたものに加えて、クロススペクトルを振動数の小さいほうから積分したものおよびそれを全パワーで規格化したものを表示する。 なお、旧版では、規格化の際振動数の番号0、1、2の部分を別あつかいにしていた(おそらく低周波部分はスペクトルの信頼度が落ちるため)が、一般性がないので、全パワーに対する割合に改めた。

§3. 使用例

3.1 tg3rpl.f (*)

ルーチンG3RPLの使用例tg3rpl.fは、
% cp /usr/local/src/masuda/spectr/tg3rpl.f .
% f77 tg3rpl.f -lg3rxl
% ./a.out
で実行できる。 このプログラムは正弦波を作り、そのパワースペクトルを計算するものである。

3.2 tg3rxl.f (*)

ルーチンG3RXLの使用例tg3rxl.fは、
% cp /usr/local/src/masuda/spectr/tg3rxl.f .
% f77 tg3rxl.f -lg3rxl
% ./a.out
で実行できる。 このプログラムは振動数が同じで位相の違う二つの正弦波を作り、 そのコヒーレンスと位相差が正しく求められるかをテストするものである。 (次のY8AA01の使用例をもとに、形式を変更したものである。)

3.3 ty8aa01.f (*)

ルーチンY8AA01の使用例ty8aa01.fは、
% cp /usr/local/src/masuda/spectr/ty8aa01.f .
% cp /usr/local/src/masuda/spectr/y8aa01.f .
% f77 ty8aa01.f y8aa01.f -lg3rxl
% ./a.out
で実行できる。 (これは旧版(東大大型計算機センター、1973) の使用例と基本的に同じものである。)

§4. 備考

4.1 経過

このプログラムの原型は、1960年代後半に東京大学理学部地球物理学教室の気象研究室で、熱帯大気の波動擾乱のデータ解析に使われていたサブルーチンSPECTRである。 直接にはMunkら(1959)の海洋の大規模波動のデータ解析の論文とPanofsky・Brier (1958)の気象統計学の教科書を参考にしているが、いずれもスペクトル解析に関してはTukey(1949)に従っており、Blackman・Tukey (1958)の本で理論的裏付けが与えられたのと同じ方法である。

このプログラムはMaruyama(1968)をはじめとする多くの研究に使われた。 遠藤(1971)はこれをソースリストつきで紹介している。 また、東大大型計算機センターのプログラムライブラリにもY8/TC/AA01として1972年に登録された(東大大型計算機センター、1973)。 [作成: 林 良一(Yoshikazu HAYASHI)、新田 勍(Tsuyoshi NITTA), 1972- 3-31]

当時はデータはカードで入力し、結果はラインプリンタに出てくるのが普通だったが、その後計算機の使い方が変わり、データはおもに磁気テープの形で提供され、TSS(会話型処理)で計算し、結果はグラフィック装置に作図するのが普通になった。 SPECTRもプリンタ出力を前提としたそのままの形では使われず、結果を引き数の形で持ち帰るように改造して使うことが多くなった。

そこで、1986年に次の改訂を行なった。 [改訂: 増田耕一 (Kooiti MASUDA), 1987- 1- 6]. SPECTRのうち実際に計算を行なっている部分をG3RXLとして分離し、利用者が直接呼べるようにした。 単独の時系列のパワースペクトルを計算する需要も大きいので、そのためのルーチンG3RPLも用意した。 初期設定ルーチンG3RILを整備し、Hanning以外のいろいろなラグウィンドウが選択できるようにした。 全体に、Fortran77の構文を使ってプログラムの書体を読みやすいものにするよう努力した。 サブルーチンY8AA01は従来のSPECTRの形で使えるように残したので、以前からの利用者はルーチン名とコマンド名だけ変えればよい。

4.2 参考文献

Akaike, Hirotugu, 1962:
On the design of lag window for the estimation of spectra. Annals of the Institute for Statistical Mathematics, Vol. 14, 1 - 21.
赤池弘次,1968:
スペクトル解析。 磯部 孝(編), 相関函数およびスペクトル, 東京大学出版会、28 - 46.
赤池弘次,中川東一郎,1972:
ダイナミックシステムの統計的解析と制御。サイエンス社。 189 pp.
Blackman, R. B. and Tukey, J. W., 1958:
The Measurement of Power Spectra. Dover. 190 pp.
遠藤昌宏, 1971:
気象擾乱のスペクトル解析。気象研究ノート(日本気象学会), 110号、134 - 145.
日野幹雄, 1977:
スペクトル解析。 朝倉書店。 300 pp.
藤井光昭, 1974:
時系列解析。 コロナ社。222 pp.
Maruyama, Taketo, 1968:
Time sequence of power spectra of disturbances in the equatorial lower stratosphere in relation to the quasi-biennial oscillation. Journal of the Meteorological Society of Japan, Vol. 46, 327 - 342.
Munk, W. H., Snodgrass, F. E. and Tucker, M. J., 1959:
Spectra of low-frequency ocean waves. Bulletin of Scripps Institution of Oceanography, Vol. 7, 283 - 362.
Panofsky, H. A. and Brier, G. W., 1958:
Some Applications of Statistics to Meteorology. Pennsylvania State University, 224 pp.
東京大学大型計算機センター, 1973:
Y8/TC/AA01, 擾乱のパワースペクトル解析。 東京大学 大型計算機センターニュース、Vol. 8, Supplement 2, 246 - 251.
東京大学大型計算機センター, 1987:
G3/TC/RXL, 実数時系列のクロススペクトル・パワースペクトル解析、Blackman・Tukey ラグ共分散法。 東京大学 大型計算機センターニュース、Vol. 19, Supplement 1, 69 - 85.
Tukey, J. W., 1949:
The sampling theory of power spectrum estimates. Symposium on Applications of Autocorrelation Analysis to Physical Problems, Woods Hole, June 13, 1949. NAVEXOS-P-735, Office of Naval Research.

2000-03-23; 復活 2008-06-01
増田 耕一
[スペクトル解析のプログラム例の目次へ] [本のプログラム例の目次へ]