Python で励磁突入電流を解析する:瞬時値・60Hz 実効値・FFT・DC 成分をまとめて可視化する方法

電力系統の解析では、三相電流の瞬時値だけでなく、60 Hz 実効値(RMS)DC 成分(直流オフセット)、さらに 周波数スペクトル(FFT) を確認することが重要である。

本記事では、Python(pandas / matplotlib / NumPy)を用いて、

  • 三相電流 ia, ib, ic の瞬時値
  • 60 Hz の 1 周期 RMS
  • 零相電流 i0 = ia + ib + ic
  • FFT による DC 成分・60 Hz 成分の抽出
  • グラフの PNG 保存

までを一括で行う解析コードを解説する。

解析コードの全体構成

本記事で扱うコードは、以下の 5 つの処理で構成されている。

  • CSV データの読み込みと整形
  • 60 Hz 実効値(RMS)の計算
  • FFT による周波数解析
  • DC 成分(平均値)の算出
  • 4 段グラフ(ia / ib / ic / i0)の描画と保存
  • FFT グラフの描画と保存

解析対象の CSV は以下の列を持つことを想定している。

  • t(秒)
  • i(SwCB_a)
  • i(SwCB_b)
  • i(SwCB_c)
t,i(SwCB_a),i(SwCB_b),i(SwCB_c)
0,0,0,0
0.0001,-6.27238227751644E-05,-0.000476417815174878,0.00053913563838831
0.0002,-8.08975681498594E-05,-0.000485468856170683,0.000566309647482591
0.0003,-4.92502409424707E-05,-0.000493972095036829,0.000543016241371062
0.0004,-1.64779107705474E-05,-0.000501815195642578,0.00051812537473591

CSV データの読み込みと前処理

まずは CSV を読み込み、秒 → ミリ秒変換、列名整理、零相電流 i0 の生成を行う。

ポイントは以下の通りである。

  • t は秒で記録されているため、ミリ秒に変換する
  • 列名を ia, ib, ic に統一する
  • i0 = ia + ib + ic を新たに作成する
def load_data(file_path: str, usecols: list, encoding: str = 'utf-8') -> pd.DataFrame:
    df = pd.read_csv(file_path, usecols=usecols, encoding=encoding)

    # 秒 → ミリ秒変換
    df["t"] *= 1000

    # 列名整理
    df["ia"] = df["i(SwCB_a)"]
    df["ib"] = df["i(SwCB_b)"]
    df["ic"] = df["i(SwCB_c)"]
    df["i0"] = df["ia"] + df["ib"] + df["ic"]

    return df

60 Hz 実効値(RMS)の計算方法

電力系統の実効値は 1/60 秒(約 16.6667 ms) の窓幅で計算する。

本コードでは、

  1. サンプリング周期 dt を t 列から自動推定
  2. 窓幅(ms)をサンプル数に変換
  3. rolling().mean() を用いて RMS を算出

という流れで RMS を求めている。

def compute_rms(series: pd.Series, t: pd.Series, window_ms: float) -> pd.Series:
    dt = t.diff().median()  # サンプリング周期(ms)
    window_samples = int(window_ms / dt)
    if window_samples < 1:
        window_samples = 1
    return series.pow(2).rolling(window_samples).mean().apply(np.sqrt)

FFT による周波数解析

FFT(高速フーリエ変換)を用いて、以下の成分を抽出する。

  • DC 成分(0 Hz)
  • 基本波(60 Hz)
  • 高調波(120 Hz, 180 Hz, …)

FFT のポイントは以下である。

  • サンプリング周期 dt からサンプリング周波数 fs を計算
  • NumPy の np.fft.fft() を使用
  • 片側振幅スペクトルに変換(実効的な振幅を得るため)
  • ±1 Hz の範囲で最大値を抽出し、60 Hz 成分を求める
def compute_fft(series: pd.Series, t: pd.Series):
    """FFT を計算し、周波数軸と片側振幅スペクトルを返す"""
    # サンプリング周期(秒)
    dt_sec = (t.diff().median()) / 1000.0
    fs = 1.0 / dt_sec  # サンプリング周波数

    N = len(series)
    fft_vals = np.fft.fft(series - np.mean(series))  # DC 成分を除去してもよい
    fft_vals = np.abs(fft_vals) / N * 2              # 片側振幅に変換

    freqs = np.fft.fftfreq(N, d=dt_sec)
    mask = freqs >= 0  # 片側のみ

    return freqs[mask], fft_vals[mask], fs

DC 成分(平均値)の算出

突入電流では、非対称成分(DC オフセット) が重要である。

FFT の 0 Hz 成分でも DC を推定できるが、 最もシンプルで正確なのは 時系列データの平均値 である。

本コードでは以下のように DC 成分を算出している。

dc_value = df[col].mean()

4 段グラフで瞬時値と RMS を可視化

本コードでは、以下の 4 段構成でグラフを描画する。

  1. ia(瞬時値+RMS)
  2. ib(瞬時値+RMS)
  3. ic(瞬時値+RMS)
  4. i0(瞬時値+RMS+DC 成分の水平線)

RMS は赤の太線、瞬時値は青の半透明線で描画しているため、 突入電流の立ち上がりや DC 成分の影響が視覚的にわかりやすい。

図 4 段グラフで瞬時値と RMS を可視化

FFT グラフ

i0 の FFT スペクトルを PNG 形式で保存する。

  • 0〜500 Hz の範囲を表示
  • DC 成分、60 Hz 成分、高調波が視覚的に確認できる
図 i0 の FFT スペクトル

まとめ

本記事では、Python を用いて突入電流の解析を行う方法を紹介した。

  • 三相電流の瞬時値と RMS を可視化
  • 零相電流 i0 の DC 成分を算出
  • FFT により 60 Hz 成分や高調波を抽出
  • グラフを PNG 形式で保存

電験・電力解析・保護協調・変圧器の励磁突入電流の評価など、 幅広い用途で活用できる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です