1. HOME
  2. ブログ
  3. IT技術
  4. 【第3回】Pythonによるオシロスコープ波形データ解析の秘訣【アナログデータ編】
Pythonによるオシロスコープ波形データ解析の秘訣(アナログデータ編)

【第3回】Pythonによるオシロスコープ波形データ解析の秘訣【アナログデータ編】

Python でオシロスコープ波形データを解析しよう!

前回は、オシロスコープで波形データを取得する意義について解説しました。

今回は、オシロスコープで得た「csv 形式の波形データを、Python で解析する方法」を紹介します。

Python で波形データを解析するメリット

波形データ解析に Python を用いると、以下のようなメリットがあります。

  1. スクリプト型言語なので、トライアンドエラーでデバッグが迅速
  2. 数学に強いライブラリが充実しているため、複雑な演算も可能
  3. グラフ描画ライブラリで、解析結果をすぐに可視化できる
  4. PyVISA との連携で、データ取得から解析まで一括でできる

実際にどうやって解析するのか?

今回ご紹介するのは、PC メモリを圧迫しない「時系列逐次処理」を使った解析方法です。

実際のアナログ波形データを想定した正弦波と RC 回路の過渡応答波形を用いて、最大・最小と立ち上がり時間の測定を行います。

最後に、csv 読み込みからデータ取得まで行えるサンプルコードを記載していますので、活用してみてください。

前回の記事はこちら

環境準備

実行環境は、「Python(3.6)」「Spyder(3.2.6)」となっています。

また、コード実行には、以下のモジュールが波形データ生成に必要です。

  1. Pandas モジュール
  2. math モジュール
  3. random モジュール

解析する波形データ

使用する波形データは、Python で簡単に生成できますので、下記のコードを実行してみてください。

実際のアナログデータを想定しているので、上記にはランダムノイズも含まれます。

今回生成した波形データのサンプル数は3,000個で、仕様は以下のとおりです。

  1. 振幅 5V の正弦波(チャンネル1)
  2. RC 回路の過渡応答を想定した 5V の立ち上がり波形(チャンネル2)

チャンネル1

理解を深めるため、グラフで見ていきましょう。

振幅 5V の正弦波(チャンネル1)は、このようになっています。

振幅 5V の正弦波(チャンネル1)

チャンネル2

一方、RC 回路の過渡応答を想定した5Vの立ち上がり波形(チャンネル2)は、こんな感じです。

RC 回路の過渡応答を想定した5Vの立ち上がり波形(チャンネル2)

求める特性値

これで求める特性値は、以下の2つです。

  1. 振幅 5V の正弦波における最大・最小値
  2. RC 回路における立ち上がり時間

時系列逐次処理でデータ解析!

それでは、いよいよ実際にデータを解析してみましょう!

ただし、csv ファイルをそのまま読み込むとメモリを大幅に圧迫してしまいます。

そこで、使うのが「時系列逐次処理」です。

時系列逐次処理とは?

時系列逐次処理は、一行ごとに csv データを読み捨てるため、メモリをほとんど使用せずに解析ができます。

オシロスコープの波形が、横軸を時間とする時系列データだからこそ、採用できる方法です。

あるトリガタイミングから過去に遡ってデータ解析を行うことは難しいですが、大抵の特性値なら簡単に取得することができます。

読み込んだ csv データの1列目がインデックスで、2列目がチャンネル1、3列目がチャンネル2のデータです。

csv ファイル中のデータ開始行が先頭からでないケースに備えて、開始行までスキップする機能も含まれています。

今回のサンプル波形データは1行目がヘッダになっているので、1行分スキップしていますね。

以降の処理は、この繰り返し文の中に記述していく形になります。

①正弦波データの最大・最小

まず、正弦波データの最大・最小値から確認していきましょう。

全データを一括で読み込んだ場合なら「Max」「Min」のメソッドを使えば完了ですが、逐次処理なので少々ややこしい手順となります。

以下のコードで、最大値と最小値を大きいものから順に5個測定できます。

※別途、各種リストの初期化処理が必要なので、最後のサンプルコードを参照ください。

最大値

行を読み込んでいく過程で最大値を更新した場合に、検出した値とインデックス番号を、 ch1_max というリストへ保存していきます。

リスト用の「insert」メソッドを活用すれば、更新データを自由に挿入できるため、自動的に順位を更新可能です。

溢れた6個目のデータは、「del」メソッドで削除されていきます。

最小値

最小値も、基本的な動作は最大値と同じです。

不等号が逆な点と、使用するリスト名が異なるくらいしか違いはありません。

②RC 回路の立ち上がり時間

次に、RC 回路立ち上がりデータにおける、電圧20%から80%までの時間を測定してみましょう。

コードは以下になります。

タイミング検出のポイント

ノイズ重畳のせいで、指定された電圧値の到達タイミング検出が難しくなっています。

そのため、要素数10個のリングバッファを使い、5回連続で指定電圧を超えたタイミングを記録します。

この時、以下のポイントを意識してください。

  1. 検出処理は1サンプルごとではなく、任意に行う(ノイズに強い検出ができる)
  2. rise_st_f フラグを使い、検出が終了したら以後は行わない(フラグ管理しないと延々と検出・更新され続ける)

電圧80%の検出タイミングも、変数や閾値が違うだけで基本は同じです。

③両データの連携:立ち上がりの指定タイミングでの正弦波の値

最後に、あるチャンネルの指定タイミングにおけるもう片方のチャンネルの測定値を取得する方法をご紹介します。

チャンネル2で電圧20%を検出したときに、チャンネル1の電圧値を取得してみましょう。

②のコード内にある ch1_at_ch2_rise.append([index_dt,ch1_dt]) がその処理にあたります。

処理中は全チャンネル時間的な同期がとれているので、片方のチャンネル処理中に割り込む形で処理を追加すればいいのです。

サンプルコード:波形データの最大・最小と立ち上がり時間の解析

本記事で紹介したテクニックをまとめて、1つのコードにしてみました。

コード自体は今回使用するサンプルの波形データに合わせたものですが、ファイル名やスキップする行を変えれば、どんな波形データでも対応できますよ。

さいごに

今回は、電圧の最大・最小や立ち上がり時間といった「アナログ特性の取得方法」を紹介しました。

1つの波形データだけなら、オシロスコープのカーソル機能や測定機能だけでも事足りるでしょう。

しかし、Python を使えば、大量のデータ処理ができる上、解析結果の集約も非常に簡単です。

回路動作を自動化し、オシロスコープと連携してしまえば、無人測定も可能ですよ!

そして、次回は「シリアル通信の解析」を行っていきたいと思います。

お楽しみに!

第4回はこちら!

第1回はこちら!

こちらの記事もオススメ!



書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア