Note

このページは Jupyter Notebook から生成されました。 ノートブックをダウンロード (.ipynb)

[1]:
# Skipped in CI: Colab/bootstrap dependency install cell.

ASD 解析: パイプライン

このチュートリアルでは、SegmentTable を使用して、複数セグメントにわたる一括 ASD(振幅スペクトル密度)解析パイプラインを構築する方法を学びます。各セグメントの切り出し(crop)、ASD計算、可視化までを流れるように実行します。

ここで使う区間は gwpy.segments.Segment、各行の波形データは GWpy の TimeSeries です。gwexpy はそれらの GWpy 基盤クラスを SegmentTable に載せ、crop() / asd() で表単位の一括処理を行う部分を拡張しています。セグメント解析の基礎関係は SegmentTable: 基本 を参照してください。

[2]:
import warnings

warnings.filterwarnings("ignore", category=UserWarning)
warnings.filterwarnings("ignore", category=DeprecationWarning)

import warnings

with warnings.catch_warnings():
    warnings.simplefilter('ignore')

    import numpy as np
    from gwpy.segments import Segment
    from gwpy.timeseries import TimeSeries

    from gwexpy.table import SegmentTable

    def get_synthetic_data(t0):
        return TimeSeries(np.random.randn(1024), sample_rate=64, t0=t0)

    segs = [Segment(i*16, i*16+16) for i in range(4)]
    st = SegmentTable.from_segments(segs)
    st.add_series_column("raw", data=[get_synthetic_data(seg[0]) for seg in segs], kind="timeseries")
    st

切り出し (Crop) と ASD 計算

crop()asd() という便利な Sugar API を使って、全セグメントを一括処理できます。

[3]:
# Cut the data to each segment span so every ASD is computed from intervals that share the same operating state.
st_cropped = st.crop("raw", out_col="cropped")
# Estimate ASD per segment to compare stationary noise floors without smearing glitches or state changes across the whole run.
st_asd = st_cropped.asd("cropped", out_col="asd", fftlength=2.0)
st_asd.display()

[3]:
span raw cropped asd
0 (0, 16) <timeseries: 1024 samples> <timeseries: 1024 samples> <frequencyseries: 65 bins>
1 (16, 32) <timeseries: 1024 samples> <timeseries: 1024 samples> <frequencyseries: 65 bins>
2 (32, 48) <timeseries: 1024 samples> <timeseries: 1024 samples> <frequencyseries: 65 bins>
3 (48, 64) <timeseries: 1024 samples> <timeseries: 1024 samples> <frequencyseries: 65 bins>

解析結果の集計

map() を使うことで、独自関数(例:特定の周波数帯域の RMS 計算)を適用してテーブルに結果を統合できます。

[4]:
def calc_rms(fs):
    return np.sqrt(np.sum(fs.value**2))  # Simplified band-integrated amplitude proxy for comparing segment-to-segment loudness.

st_asd.map("asd", calc_rms, out_col="band_rms", inplace=True)
st_asd.display()

[4]:
span band_rms raw cropped asd
0 (0, 16) 1.425641 <timeseries: 1024 samples> <timeseries: 1024 samples> <frequencyseries: 65 bins>
1 (16, 32) 1.395076 <timeseries: 1024 samples> <timeseries: 1024 samples> <frequencyseries: 65 bins>
2 (32, 48) 1.382460 <timeseries: 1024 samples> <timeseries: 1024 samples> <frequencyseries: 65 bins>
3 (48, 64) 1.437775 <timeseries: 1024 samples> <timeseries: 1024 samples> <frequencyseries: 65 bins>