この文書は、増田が執筆した 東京大学大型計算機センター プログラムライブラリ説明書 (東大大型計算機センター, 1987)の原稿をもとに、 操作については、 2000年3月現在増田が使用していたLinuxマシン上での説明に書きかえたものです。 機種やマシンに依存する部分には節見出しに(*)印をつけておきます。 操作以外の部分は1987年の当時の認識に基づいた記述のままです。 ここで採用したクロススペクトルの定義は、 もしかするとスペクトル解析の標準とされているものと (符号のとりかたや規格化の分母などの点で)同じでないかもしれません。 HTMLファイル中の数式およびプログラム例は、<pre>を使っており、 <pre>の中の文字のフォント幅が 日本語文字はASCII文字の2倍でそれぞれ一定であることを前提として書いてあります。 HTML本文中のリンクはこの文書内の相互参照です。
ここでは定常時系列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.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) 2M(プログラム中のLMAX)は最大のラグの番号であるとともに最大の振動数番号、Wはラグウィンドウである。
Blackman・Tukey法によるスペクトルの推定誤差はほぼ自由度2N/Mのχ2分布に従う。Mを大きくするとスペクトルの分解能1/MΔtは上がるが推定の誤差が大きくなる。 実用的には、MをおよそNの1/10以下にするのがよいとされる(たとえば日野、1977、12章)。
このほかのスペクトル計算方式としてよく使われるものは、直接フーリエ変換法(普通高速フーリエ変換を使うのでFFT法と呼ばれる)と、最大エントロピー法(MEM)がある。
FFT法は時系列を直接離散フーリエ変換し、振動数領域でかけ合わせることでパワースペクトルやクロススペクトルを求めるものである。 フーリエ変換の一意性から、これは共分散関数から求めるのと同等であることがわかる。 ただし時系列の端の処理だけは互換性がない。 推定誤差を小さくするためのスペクトルウィンドウとしては、Blackman・Tukey法で考えられているラグウィンドウをフーリエ変換したものを使えばよい。 ほしい振動数の分解能が高くなるにしたがってBlackman・Tukey法ではラグを長くとらなければならないので共分散の計算量がふえ、相対的にFFT法が有利になる。ただしFFT法では欠損値の処理が困難である。
MEM法あるいは自己回帰モデルあてはめ法は、時系列が線スペクトルでよく近似されるような周期性をもっていることを前提として、それを情報量を失わないように取り出そうとするものである。 それに対してBlackman・Tukey法やFFT法は、仮定をおかずにある振動数帯にどれだけのパワーをもっているかを見ようとするものである。 したがって、MEMに比べてBlackman・ Tukey法ではするどいピークが出にくいのは当然である。
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
% f77 USER.f -lg3rxl % ./a.out
PROGRAM p1 .......... CALL G3RIL(......) CALL G3RXL(......) .......... END
注: ルーチンY8AA01はロードモジュールライブラリに含めていない。
% cp /usr/local/src/masuda/spectr/g3rxl.f . % f77 USER.f % ./a.outUSER.fの中には、次のように、 INCLUDE文を入れておき、 ライブラリのソースプログラムをコンパイルさせる。
PROGRAM p2 .......... CALL G3RIL(......) CALL G3RXL(......) .......... END INCLUDE '/usr/local/src/masuda/spectr/g3rxl.f'
注: ルーチンY8AA01を利用する場合は、 g3rxl.fに加えて、同じディレクトリの別ファイルy8aa01.fも INCLUDEする必要がある。
cd /usr/local/src/masuda/spectr a2ps g3rxl.f | lpr -Pgslips
cp /usr/local/src/masuda/spectr/g3rxl.f .これでカレントディレクトリの g3rxl.f へ複写される。
CALL G3RIL(LMAX,MXCS,COSSIN,WINDOW,IWNTYP,LDATA,QLAMDA)
入出力の別 | 引き数 | 型、長さ(バイト) | 寸法(配列の) | 内容 |
---|---|---|---|---|
入力 | LMAX | 整数*4 | ラグをいくつまでとるか。(ラグの範囲は0からLMAX*Δtまで) | |
MXCS | 整数*4 | COSSINの寸法に関する定数。MXCS≧LMAX*2-1。 | ||
IWNTYP | 整数*4 | ウィンドウの選択。2.1.3節参照。 | ||
LDATA | 整数*4 | =0:データの長さによる共分散の補正をしない。 ≠0:データの長さによる共分散の補正をする。 LDATAはG3RXLまたはG3RPLのLENGと等しくすること。 | ||
QLAMDA | 整数*4 | IWNTYP=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の共分散にかける重み。 |
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) |
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)式のままとする。
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)
入出力の別 | 引き数 | 型、長さ(バイト) | 寸法(配列の) | 内容 |
---|---|---|---|---|
入力 | LENG | 整数*4 | 時系列の長さ。 | |
LMAX | 整数*4 | ラグをいくつまでとるか。 | ||
DELT | 実数*4 | 時間のサンプリング間隔。 | ||
A1 | 実数*4 | (LENG) | 第1の時系列データ。 | |
A2 | 実数*4 | (LENG) | 第2の時系列データ。 | |
MXCS | 整数*4 | G3RIL(2.1節)のMXCSと同じ。 | ||
COSSIN | 実数*4 | (0:MXCS,2) | 三角関数の表(G3RILで作られたもの)。 | |
WINDOW | 実数*4 | (0:LMAX) | ラグウィンドウ(G3RILで作られたもの)。 | |
IFMIS1 | 整数*4 | =0:第1の時系列には欠損値がない。 ≠0:第1の時系列には欠損値がある。 | ||
QMISS1 | 実数*4 | IFMIS1≠0のとき、|A1(J)|≧QMISS1であるA1(J)は欠損値である。IFMIS1=0のときはQMISS1は意味がない。 | ||
IFMIS2 | 整数*4 | =0:第2の時系列には欠損値がない。 ≠0:第2の時系列には欠損値がある。 | ||
QMISS2 | 実数*4 | IFMIS2≠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のとき、ほかの計算結果は無意味である。 |
G3RXL: SPECTRA ARE NOT CALCULATED. ALL DATA ARE MISSING FOR COVARIANCE WITH LAG = (ラグの数) BETWEEN SERIES NO.(1または2)AND(1または2)ただし、平均値の計算ができない場合、(ラグの数)を0として表示する。
CALL G3RPL(LENG, LMAX, DELT, A1, COV1, MISS1, FOUR1, MXCS, COSSIN,WINDOW,IFMIS1,QMISS1,IRTN)
入出力の別 | 引き数 | 型、長さ(バイト) | 寸法(配列の) | 内容 |
---|---|---|---|---|
入力 | LENG | 整数*4 | 時系列の長さ。 | |
LMAX | 整数*4 | ラグをいくつまでとるか。 | ||
DELT | 実数*4 | 時間のサンプリング間隔。 | ||
A1 | 実数*4 | (LENG) | 時系列データ。 | |
MXCS | 整数*4 | G3RIL(2.1節)のMXCSと同じ。 | ||
COSSIN | 実数*4 | (0:MXCS,2) | 三角関数の表(G3RILで作られたもの)。 | |
WINDOW | 実数*4 | (0:LMAX) | ラグウィンドウ(G3RILで作られたもの)。 | |
IFMIS1 | 整数*4 | =0:時系列には欠損値がない。 ≠0:時系列には欠損値がある。 | ||
QMISS1 | 実数*4 | IFMIS1≠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のとき、ほかの計算結果は無意味である。 |
G3RPL: SPECTRA ARE NOT CALCULATED. ALL DATA ARE MISSING FOR COVARIANCE WITH LAG = (ラグの数)ただし、平均値の計算ができない場合、(ラグの数)を0として表示する。
入出力の別 | 引き数 | 型、長さ(バイト) | 寸法(配列の) | 内容 |
---|---|---|---|---|
入力 | LENG | 整数*4 | 時系列の長さ。 | |
A1 | 実数*4 | (LENG) | 時系列データ。 | |
IFMIS1 | 整数*4 | =0:時系列には欠損値がない。 ≠0:時系列には欠損値がある。 | ||
QMISS1 | 実数*4 | IFMIS1≠0のとき、|A1(J)|≧QMISS1であるA1(J)は欠損値である。IFMIS1=0のときはQMISS1は意味がない。 | ||
出力 | ABAR1 | 実数*4 | 時系列の平均値。 | |
IRTN | 整数*4 | = 0: 平均値が正常に求まった。 = 1: 欠損値のため平均値が計算できなかった。 IRTN≠0のとき、ほかの計算結果は無意味である。 |
CALL G3RCV(LENG,LMAX,A1,A2,COVX,MISSX,ABAR1,ABAR2, IFMIS1,QMISS1,IFMIS2,QMISS2,IRTN)
入出力の別 | 引き数 | 型、長さ(バイト) | 寸法(配列の) | 内容 |
---|---|---|---|---|
入力 | LENG | 整数*4 | 時系列の長さ。 | |
LMAX | 整数*4 | ラグをいくつまでとるか。 | ||
A1 | 実数*4 | (LENG) | 第1の時系列データ。 | |
A2 | 実数*4 | (LENG) | 第2の時系列データ。 | |
ABAR1 | 実数*4 | A1の平均値 (G3RAVで計算されたもの) | ||
ABAR2 | 実数*4 | A2の平均値 (G3RAVで計算されたもの) | ||
IFMIS1 | 整数*4 | =0:第1の時系列には欠損値がない。 ≠0:第1の時系列には欠損値がある。 | ||
QMISS1 | 実数*4 | IFMIS1≠0のとき、|A1(J)|≧QMISS1であるA1(J)は欠損値である。IFMIS1=0のときはQMISS1は意味がない。 | ||
IFMIS2 | 整数*4 | =0:第2の時系列には欠損値がない。 ≠0:第2の時系列には欠損値がある。 | ||
QMISS2 | 実数*4 | IFMIS2≠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のとき、ほかの計算結果は無意味である。 |
入出力の別 | 引き数 | 型、長さ(バイト) | 寸法(配列の) | 内容 |
---|---|---|---|---|
入力 | LMAX | 整数*4 | ラグをいくつまでとるか。 | |
DELT | 実数*4 | 時間のサンプリング間隔。 | ||
COVX | 実数*4 | (0:LMAX) | 共分散関数(G3RCVで作られたもの) | |
ICS | 整数*4 | = 1: COVXを偶関数とみなしてcosine変換をする。 = 2: COVXを奇関数とみなして sine変換をする。 | ||
MXCS | 整数*4 | G3RIL(2.1節)のMXCSと同じ。 | ||
COSSIN | 実数*4 | (0:MXCS,2) | 三角関数の表(G3RILで作られたもの)。 | |
WINDOW | 実数*4 | (0:LMAX) | ラグウィンドウ(G3RILで作られたもの)。 | |
FOURX | 実数*4 | (0:LMAX) | パワースペクトルまたはクロススペクトル。 |
入出力の別 | 引き数 | 型、長さ(バイト) | 寸法(配列の) | 内容 |
---|---|---|---|---|
入力 | 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の時系列を表わす文字。 |
Y8AA01: LMAX (LMAXの値) IS LARGER THAN DIMENSION (MXLの値)これより大きいLMAXの値で使いたいときは、ソースライブラリをコピーし、PARAMETER文
PARAMETER (MXL=100, MXCS=2*MXL-1)のMXLの値を変えて使えばよい。
COMMON COSSIN(0:MXCS,2), WINDOW(0:MXL)無名commonを別の目的に使いたいときは注意が必要である。 これはもともと、繰り返し使いたい三角関数とラグウィンドウの値を保存させるため、メインプログラムと共有する形にしたものである。 HITAC Mシリーズ機やHITAC S810では、特にオーバーレイをしないかぎりすべての変数が保存されるので、メインプログラムに同じcommon文を置く必要はない。 (§3の使用例ではcommon文を入れておいた。)
IWNTYP = 2 Hanningである。 LDATA = 0 2.1.4節で述べた補正を行なわない。 QLAMDA = 0.0 (Hanningなので特に意味はない。)欠損値について(G3RXLの引き数):
IFMIS1 = IFMIS2 = 1 どちらの時系列にも欠損値がありうる。 QMISS1 = QMISS2 = 1.E6 欠損値は絶対値百万以上の値で表わされている。
サブルーチンY8AA01の中にKSKIPという変数がある。登録されているプログラムでは KSKIPはDATA文で1に設定してあるが、これを0に変えてコンパイル、実行すると、2.7.3節で述べたものに加えて、クロススペクトルを振動数の小さいほうから積分したものおよびそれを全パワーで規格化したものを表示する。 なお、旧版では、規格化の際振動数の番号0、1、2の部分を別あつかいにしていた(おそらく低周波部分はスペクトルの信頼度が落ちるため)が、一般性がないので、全パワーに対する割合に改めた。
% cp /usr/local/src/masuda/spectr/tg3rpl.f . % f77 tg3rpl.f -lg3rxl % ./a.outで実行できる。 このプログラムは正弦波を作り、そのパワースペクトルを計算するものである。
% cp /usr/local/src/masuda/spectr/tg3rxl.f . % f77 tg3rxl.f -lg3rxl % ./a.outで実行できる。 このプログラムは振動数が同じで位相の違う二つの正弦波を作り、 そのコヒーレンスと位相差が正しく求められるかをテストするものである。 (次のY8AA01の使用例をもとに、形式を変更したものである。)
% 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) の使用例と基本的に同じものである。)
このプログラムの原型は、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の形で使えるように残したので、以前からの利用者はルーチン名とコマンド名だけ変えればよい。