TimeSeries: 基本#
電圧信号を作成し、メタデータを確認し、時間区間を選択してプロットを保存します。前提知識はクイックスタートです。追加の解析パッケージや外部データは不要です。説明を読んで実行する所要時間の目安は約 15 分です。
1. 信号の作成#
クイックスタートと同じ 40 Hz の正弦波と、乱数シードを固定したセンサーノイズを使います。TimeSeries はサンプル値に加えて、単位、開始時刻、サンプリング間隔を保持します。
from gwexpy.noise.wave import gaussian, sine
settings = dict(duration=16, sample_rate=512, t0=0, unit="V")
signal = sine(frequency=40, **settings) + gaussian(std=0.3, seed=10, **settings)
signal.name = "Sensor A"
2. 値とメタデータの確認#
value はサンプル値の配列を保持し、unit、t0、sample_rate はその値の意味を表します。dt はサンプル間の時間間隔です。別のツールへ値を出力する場合は、これらの属性も保持してください。
print(signal[:5])
print("Unit:", signal.unit)
print("Start:", signal.t0)
print("Sample rate:", signal.sample_rate)
print("Cadence:", signal.dt)
assert signal.size == 16 * 512
TimeSeries([-0.33100153, 0.25388934, 0.59692804, 1.07527748,
0.84930531],
unit: V,
t0: 0.0 s,
dt: 0.001953125 s,
name: Sensor A,
channel: None)
Unit: V
Start: 0.0 s
Sample rate: 512.0 Hz
Cadence: 0.001953125 s
3. 時間区間の選択#
区間は 2 秒から始まり、4 秒の直前までを含みます。元のデータ全体を保持するため、戻り値の時系列を別の名前に代入します。TimeSeriesDict のコレクションを保持する場合は、channels.copy().crop(...) を使ってください。
segment = signal.crop(2, 4, copy=True)
assert segment.size == 2 * 512
assert signal.size == 16 * 512
4. プロットと保存#
短い区間を表示すると、一つ一つの振動を確認できます。プロットにはサンプルの単位が表示され、savefig でログやスライドに使える図を保存できます。
plot = signal.crop(2, 2.1, copy=True).plot()
plot.savefig("timeseries.png")
5. ASD の推定#
平均化には 16 秒間のデータ全体を使います。Hann 窓を適用した 2 秒の区間を 1 秒ずつ重ねると、周波数ビン幅は 0.5 Hz になります。ASD の単位は V/√Hz で、個々の正弦波の振幅を表すものではありません。
spectrum = signal.asd(fftlength=2, overlap=1, window="hann", method="welch")
plot = spectrum.plot(xlim=(1, 256))
plot.savefig("timeseries-asd.png")
assert spectrum.unit.is_equivalent(signal.unit / signal.sample_rate.unit**0.5)