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

【第4回】Pythonによるオシロスコープ波形データ解析の秘訣【デジタルデータ編】

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

前回に引き続き、オシロスコープから得た csv ファイルを Python で解析していく方法をご紹介します。

今回は「デジタル編」として、クロック波形やシリアル通信の解析を行っていきましょう!

実際の波形データを Python でオシロスコープから取得する方法は、前回の記事をご参照ください。

前回の記事はこちら!

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


Python でデジタルデータを解析するメリット

デジタルデータとは?

まずは、今回の解析対象である「デジタルデータ」について説明します。

デジタルデータは、「High」と「Low」の2値で決まる論理データのことです。

これを可視化したのが、「クロック波形」と「データ波形」となります。

普通、2値の論理は、クロック波形の「立ち上がり」もしくは「立ち下がり」のエッジタイミングで決まります。

例えば、シリアル通信のデータ送受信では、クロックエッジにおけるデータ波形の電圧値で論理値を決定しているのです。

デジタルデータにおけるクロック

デジタルデータを決定する「クロック波形」は、電源電圧と同じ電圧値と、0V の電圧値を一定周期で繰り返す信号です。

クロック波形の品質は、周期の安定性が最重要ポイントで、常に一定値とはなり得ません。

そして、一定期間の周期のズレを「ジッタ」といいます。

デジタル波形データ解析のメリット

この「クロックジッタ」は、オシロスコープの画面上で波形を重ねたり、内蔵機能で測定できます。

前回のアナログデータ同様、ここでも Python を使うことで、波形データの転送からジッタ測定まで自動化できます。

同時に、シリアル通信など、クロックに同期したデータの解析も行えるのです。

データ取得から解析までを全てこなせるのは、Python ならではのメリットと言えるでしょう。

波形データの準備

今回解析するのは、「クロックのジッタ」と「クロックに対する論理データ値」です。

まずは、Python のコードで波形データを生成していきましょう!

上記コードでは、実際の波形データにある「ランダムノイズ成分」や「過渡応答」、「ジッタ成分」についても再現されています。

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

  1. 振幅 5V のクロック波形(チャンネル1)
  2. 振幅 5V で HIGH と LOW を繰り返すデータ波形(チャンネル2)

クロック波形

クロック波形をグラフ化すると、このようになります。

クロック波形

データ波形

一方、データ波形のグラフはこんな感じです。

データ波形

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

今回も、波形データに特化した「時系列逐次処理」で処理を行っていきます。

詳しい方法は、前回の記事を参照してください。

前回同様、以降の処理は繰り返し文の中に記述していきます。

前回の記事はこちら

①クロックデータの解析

さて、まずはクロックデータの解析です。

クロック波形のジッタを取得しましょう!

該当するコードは下記になります。

クロック立ち上がりタイミングの取得

クロック波形を解析するにあたって必要なことは、「立ち上がりと立ち下がりを順々に検出していくこと」です。

リングバッファを使って、5回連続で閾値を超えたタイミングを立ち上がりとします。

今回の閾値は中間の「2.5V」としましたが、実際の閾値は、立ち上がりと立ち下がりで異なるケースもあるようです。

フラグで検出タイミングを管理

検出のタイミングで前回と異なる点は

の箇所で clk_logic_det_f[0]==True: という条件が増えている点です。

今回は、「立ち上がり→立ち下がり→立ち上がり」のように、交互に検出を行うためです。

そのため、以下のように、要素を2つ持つフラグを作りましょう。

1番目を立ち上がり、2番目を立ち下がりの検出フラグとして、コード上で管理していきます。

立ち上がり検出後のコードで

としているのは、立ち上がり検出をやめて、立ち下がり検出を次から行うように切り替えているからです。

検出した立ち上がりの位置と値は

によってリストへ付加されていきます。

立ち下がりタイミングの取得

立ち上がり検出後は、5回連続で閾値以下となったタイミングで、立ち下がりを検出します。

コード上では

となっており、検出するとその位置を記録し、フラグを立ち上がり検出に切り替えるようになっています。

記録した立ち上がりタイミングからのジッタ測定

こうして波形データを最後まで読み出したら、検出した立ち上がり位置が、リスト clk_rise_point に記録されます。

このリストを使って

という計算を行えば、立ち上がり検出の間隔、つまり「周期」を求めることができます。

この周期の変動量が「ジッタ」です。

普通、最大変動量をジッタ量として評価するので、このクロックのジッタは

を計算して CLK Jitter:18.0 ということになります。

②データ波形の解析

続いて、データ波形を解析していきましょう!

コードの全体像は以下になります。

クロックとデータの連携

一般的には、データ波形は単体ではなく、クロック波形の解析とセットで行われます。

そのため、最初にデータとクロックの連動が必要です。

実際の回路動作でも、クロックの立ち上がりタイミングに同期して、データ波形の論理を確認するようになっています。

立ち上がり検出時に

というフラグ管理をして、解析するタイミングを決定します。

クロック立ち上がりタイミングでのデータ確定

クロックの立ち上がりを検出したら、同タイミングでデータ波形の論理を確認します。

データ波形を読み取り、クロックタイミングでのデータ値を確定しなければなりません。

ただし、一度の検出で確定してしまうと、ノイズなど誤検出が発生するリスクがあります。

all 関数でデータを確定させる

こうしたリスクを防ぐには、連続して複数のデータをサンプリングするのが有効です。

上記コードで、バッファに貯めたデータの論理が全て一致した時に、データを確定するようにしています。

Python の all 関数を使えば、リスト内の値が全て同一かを1行で検出可能です。

データが確定したら、バッファを「不定値 X」で初期化しておきましょう!

取得データの表示

クロックと同様に、データ読み込みが終了した時点で、リスト detect_data に確定したデータ配列が格納されています。

print で確認してみると

となっており、HIGH と LOW の論理データが順番に取得できていることがわかりますね。

サンプルコード:クロック波形とデータ波形を同時に解析し、ジッタとデジタルデータを取得

最後に、ここまでで紹介した解析処理をそのまま実行できるコードを載せておきます。

ファイル名やスキップする行を変えれば、どんな波形データでも対応できますよ!

第5回へつづく!

今回は、デジタル回路や通信波形の基本である「クロック波形と対応するデータ波形の解析手法」を紹介しました。

正直、この程度ならオシロスコープの機能だけでも十分まかなえます。

しかし、Python なら、さらに高度な解析が可能ですし、何より「自動解析」という強みがあります。

ぜひ、本記事を応用して役立ててくださいね!

そして次回は、「Python で Modbus 通信を行う方法」について解説していきます。

第5回はこちら!

第1回はこちら!

記事を書いた人

\ 3度のメシより技術が好き /
(株)ライトコードは、WEB・アプリ・ゲーム開発に強い「好きを仕事にするエンジニア集団」です。
アプリ・WEBシステム開発依頼、お見積もりはこちらまでお願いします。
また、WEB・モバイルエンジニアを積極採用中です!
※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

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



書いた人はこんな人

ライトコード社員ブログ
ライトコード社員ブログ
「好きなことを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡本社、東京オフィスの2拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もりは大歓迎!
また、WEBエンジニアとモバイルエンジニアも積極採用中です!

ご応募をお待ちしております!

関連記事

採用情報

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

バックエンドエンジニア

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

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

\ 世界を変える…! /

Androidエンジニア

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

iOSエンジニア