gwpy.frequencyseries.FrequencySeries
Contents
FrequencySeries とは?
gwpy.frequencyseries.FrequencySeries は、周波数領域(スペクトル)のデータを扱うクラスです。 TimeSeries が「時間 vs 値」であるのに対し、FrequencySeries は「周波数 vs 値」の情報を持ちます。
主に以下の用途で使われます。
ASD (振幅スペクトル密度): 感度カーブのプロット
PSD (パワースペクトル密度): ノイズパワーの評価
伝達関数: フィルタの特性や、チャンネル間の伝達効率(複素数を持つ場合あり)
データの作成・取得
FrequencySeries を一から手動で作ることは稀で、通常は以下の2通りの方法で入手します。
1. TimeSeries から計算する
最も一般的な方法です。TimeSeries オブジェクトの .asd() や .fft() メソッドの結果として生成されます。 (計算方法は TimeSeriesのページ を参照)
from gwpy.timeseries import TimeSeries
# データの取得とASD計算
data = TimeSeries.fetch_open_data('H1', 1126259462, 1126259494)
asd = data.asd(fftlength=4, method='welch')
print(asd)
# <FrequencySeries([ 3.99...e-20, 3.63...e-20, 4.39...e-20, ...,
# 4.72...e-24, 4.75...e-24, 4.80...e-24]
# unit=Unit("1 / Hz(1/2)"),
# name='Strain',
# epoch=<Time object: scale='utc' format='gps' value=1126259462.0>,
# f0=<Quantity 0. Hz>,
# df=<Quantity 0.25 Hz>)>
2. ファイルから読み込む
保存されたスペクトルデータ(HDF5やXML形式、テキストファイルなど)を読み込む場合です。 KAGRAの感度カーブ(設計感度や過去の観測感度)を読み込んで比較する際によく使います。
from gwpy.frequencyseries import FrequencySeries
# テキストファイル (2列: 周波数, 感度) を読む例
# frequency_data.txt:
# 10.0 1e-19
# 11.0 2e-20 ...
spectrum = FrequencySeries.read('frequency_data.txt')
データのプロット (Plot)
TimeSeries と同様に .plot() メソッドを使います。 スペクトルデータは桁が大きく変わるため、通常は **対数軸 (Log-Log plot)** で表示します。
plot = asd.plot()
ax = plot.gca()
# X軸, Y軸を対数スケールにする (必須)
ax.set_xscale('log')
ax.set_yscale('log')
# 範囲の調整
ax.set_xlim(10, 2000) # 10Hz ~ 2kHz
ax.set_ylim(1e-24, 1e-18)
plot.show()
基本的な操作
単位の変換
例えば、変位スペクトル [m/rtHz] に キャリブレーション係数 [N/m] を掛けて 力雑音 [N/rtHz] に変換する場合など、単なる掛け算が可能です。Astropyの単位系が自動で追従します。
# 単純な定数倍 new_asd = asd * 100 # 単位情報の更新 (手動で上書きする場合) import astropy.units as u new_asd.unit = u.meter
再サンプリング (Interpolate / Resample)
異なる周波数分解能 (df) を持つ2つのスペクトルを比較したり、割り算したりする場合、周波数軸を揃える必要があります。
# asd2 の周波数軸を asd1 に合わせて補間する asd2_interp = asd2.interpolate(asd1.frequencies) # 比率を取る (Transfer Functionの確認など) ratio = asd1 / asd2_interp
属性へのアクセス (Attributes)
プロットではなく、数値データとして解析に使いたい場合に参照する属性です。
属性名 |
型 |
説明 |
asd.value |
numpy.ndarray |
スペクトルのY軸データ(振幅やパワー)。 |
asd.frequencies |
astropy.units.Quantity |
X軸の周波数配列。asd.frequencies.value で数値配列取得。 |
asd.df |
astropy.units.Quantity |
周波数分解能 (Frequency bin size)。FFT長が4秒なら0.25Hz。 |
asd.f0 |
astropy.units.Quantity |
開始周波数(通常は0Hz)。 |
asd.unit |
astropy.units.Unit |
データの単位。ASDなら 1/sqrt(Hz)。 |
例: 特定の周波数の値を取得する
配列のインデックス番号ではなく、「何Hzの値が欲しい」というアクセスをする場合、自分でインデックスを探す必要があります。
import numpy as np
target_freq = 50.0 # 50Hzの値を知りたい
df = asd.df.value # 周波数分解能 (例: 0.25Hz)
# インデックスを計算
idx = int(target_freq / df)
print(f"{target_freq} Hz の値: {asd.value[idx]}")
データの保存 (Write)
計算したASDやコヒーレンスをファイルに保存しておくと、後で再利用できて便利です。 HDF5形式が推奨されます。
# HDF5形式で保存
asd.write('my_spectrum.hdf5', format='hdf5')読み出すときは FrequencySeries.read('my_spectrum.hdf5') で復元できます。
