1. HOME
  2. ブログ
  3. IT技術
  4. Pythonによるオシロスコープ波形データ解析の秘訣(ノイズ分析編)
Pythonによるオシロスコープ波形データ解析の秘訣(ノイズ分析編)

Pythonによるオシロスコープ波形データ解析の秘訣(ノイズ分析編)

Pythonでノイズ分析してみた!

今回は、オシロスコープで得られた波形中の周期的なノイズ成分を Python で解析する方法を紹介します。

解析の方法としては、周期成分を抽出できるフーリエ変換を活用していき、同時にフーリエ変換の結果を上手くグラフ化する方法も説明していきます。

今回も Python で生成した波形データサンプルを使ってデータ解析をしていきます。

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


波形データの周期ノイズ

設計した電気回路の現物評価を行なっていく上で、直面する代表的な障害にノイズの存在があります。

電気回路のノイズには様々なタイプがありますが、最もやっかいなものは回路内の電子部品が発するタイプです。

このタイプは、電子部品自体の動作周波数に合わせる形でノイズが発生し、関係のない回路に混入することでその回路の動作を妨害することがあります。

このようなノイズの発生源を特定するためには、その特性であるノイズ周波数を特定することが重要となっています。

その周波数を特定する方法として有用な方法がフーリエ変換です。

フーリエ変換とは

フーリエ変換とは、あらゆるデータ群は周期の異なる sin/cos の三角関数の重ね合わせでできていると想定し、それぞれの周期の三角関数がデータ群にどの程度含まれているかを数値化することができる手段です。

上記はかなり曲解した表現ではありますが、ここでは他のサイトであるような学術的な省き、実用面にフォーカスした説明をしていきます。

例えば、

単純な正弦波

のような単純な正弦波であればフーリエ変換を行うと下図のように1つの鋭いピークが得られます。

単純な正弦波のフーリエ変換後の画像

このピークが立った位置の X 座標を読み取ることで、正弦波の周波数を検出することができるのです。

三角関数の含まれないデータであったとしても周期的なパターンであれば同様にピークとして検出することができます。

これは、どのような波形であっても周期がわずかにずれた三角関数の重ね合わせとして扱われるためです。

フーリエ変換のための条件

ノイズの周波数を分析したい波形データに対してフーリエ変換を行えば、波形に含まれる周期パターンの周波数を検出できることはわかりました。

では、実際にどのようなデータでも分析することができるかといいますと、それには条件があります。

まず、検出するノイズの周波数について、元の波形のサンプリング間隔が十分細かくなければ高い周波数のノイズは検出することはできません。

また、元のデータのサンプリング数、つまり周期パターンの数を十分大きくデータ内に収めなければ正確な周波数の値を検出することができません。

波形データは有限かつ離散的なものですので、解析するデータを取得する段階でどのようなサンプリング間隔でどの程度の期間のものとするかが重要となってくるわけです。

フーリエ変換後のデータ

波形データのような離散的かつ、有限なデータをフーリエ変換する場合、これは離散フーリエ変換と呼ばれ、フーリエ変換後のデータのサンプリング間隔は以下のような式で表せます。

(フーリエ変換後のサンプリング間隔[Hz])=1÷(データのサンプル数)÷(元データのサンプリング間隔[sec])

前述したようにデータ数が多ければ間隔が短くなり、より正確な周波数を特定できることがわかります。

本記事で Python を使って周波数分析結果をプロットしていく際には、X 軸をこの単位の整数倍とする点に注意しておきましょう。

Python によるフーリエ変換

上で述べたフーリエ変換を Python で行うために特別なモジュールは必要ではありません。

基本モジュールの numpy 高速フーリエ変換(FFT)のメソッドがあり、それを活用する形です。

FFTは通常のフーリエ変換に対して計算を省略した方式ですが、精度面から言っても問題はありません。

使い方は分析したいデータ群を配列として引き渡すだけとなっています。

先程述べたように、変換結果のサンプル単位がデータ数に応じた周波数となることには注意しましょう。

この記事の目的

本記事では、正弦波に2つの周期的なノイズが重畳した波形を対象に、フーリエ変換を活用してノイズの周期成分を特定します。

ここでの波形は、オシロスコープで取得されたデータを想定しており、今までの記事と同様にcsv形式のデータを読み出すことを行います。

手順としては、まず Python のコード上で csv 波形データを読み出し、次に読み出したデータをフーリエ変換しつつ、フーリエ変換後の X 座標データを作成します。

グラフだけではピーク値がよく分かりませんので、ピーク検出をコード上で行い、整数倍の周波数を除いた結果が得られるようにします。

準備

今回のコード実行に必要な環境は下記になります。

インストールが必要なもの

  1. Python の開発環境(Spyder など)
  2. Pandas モジュール(波形データ生成及び csv 読み出しに使用)
  3. math モジュール(波形データ生成に必要)
  4. random モジュール(波形データ生成に必要

筆者の実行環境

  1. Python(3.6)
  2. Spyder(3.2.6)

解析する波形データ

今回、解析に使用する波形データの例は下記のコードを実行することで作成することができます。

コード本文にもあるように、データのサンプリング間隔を10usとし、1000Hz の正弦波に対して、

  1. ノイズ1:周期600us、周波数1666.7Hz
  2. ノイズ2:周期1400us、周波数714.3Hz

の2つの波形が加算された合成波形が対象となるデータです。

波形データ

コード本文

それでは、いよいよ分析を行うコードを実行していきます。

今回のフーリエ変換では、今までの記事のようなメモリを節約できる逐次処理は使うことができません。

波形データ全体を同時に使うことでしかフーリエ変換を行うことはできないからです。

⓪モジュールのインポート

最初は、使用するモジュールのインポートからです。

普段よく使う3つをインポートすれば問題ありません。

①波形データの読み出しとフーリエ変換後のX軸単位を計算

次にcsvの読み出しとフーリエ変換後の検出可能な周波数単位を確認していきます。

今回は csv データの呼び出しを Pandas で行っています。

これは、今回のように全データ一括の処理を行う場合には、シンプルかつ管理がしやすいためです。

読み出したデータのサンプル数を取得し、データのサンプリング間隔を定義した後は、前述した式に基づいてフーリエ変換後の X 軸の単位(周波数分解能)を算出します。

今回の例では10us ごとのデータとしているので、16.67Hz となりました。

ここで算出した値は分解能としての意味を持つので、この周波数の整数倍でしか検出ができないということになります。

本記事ではこのまま進めますが、実際に波形測定から行う場合、なるべくたくさんのサンプルデータを取ることで測定精度上昇につながることを留意しておいてください。

データ数が多ければ処理時間が長くなり、メモリも多く必要となりますが、高周波ノイズを捉えることが目的でないならば、サンプリング間隔を広くとることでも周波数分解能を上げられることも覚えておきましょう。

②フーリエ変換の実行

そしていよいよフーリエ変換を実行します。

今回は numpy の FFT メソッドを使っていき、同時にグラフ作成用のX軸データも生成します。

変換後のデータは複素数なので絶対値も忘れずにとりましょう。

③ピーク位置の算出

次に、ピーク位置の検出を行います。

Python のモジュールには自動でピークを検出するメソッドは存在しないので、処理は工夫する必要があります。

検出方法としてはデータの最初からひとつずつ見ていき、前後の値より大きいポイントをピークとしてその X 座標と値を記録していく形です。

ここで、

のように検出範囲をデータの半分としていますが、これはフーリエ変換の性質上、負の周波数が後半の半分に現れるため、それを検出しないようにしているためです。

また、ポイントとして、検出したい周波数の整数倍の周波数もピークとして出てきてしまうという特徴があります。

ノイズの解析においては、検出したいのは整数倍されていない周波数なので、for 文の中の処理で、既に検出した周波数の整数倍は無視するようにしています。

分解能の関係で、必ずしも整数倍で表れませんので、プラスマイナス1ポイントのズレも整数倍とみなすコードになっています。

そして、検出した結果はリストに追加します。

④FFTによる周波数分析結果をグラフにプロット

最後に分析結果をグラフ化します。

今回のデータの分解能からすると、負の周波数を除けば最大で50MHz まで表示されてしまうので、グラフの描画範囲を絞ります。

そしておなじみ matplotlib でグラフ作成を行います。

annotate を使うことでプロット上にコメントを表示することができ、先ほど検出したピークのみに周波数を表示させることができます。

周波数分析結果をグラフにプロット

作成したグラフは上図の通りで、データ作成時に1000Hz の正弦波に重畳させた1666.7Hz 714.3Hz のノイズを検出できていることがわかります。

分解能の影響でわずかに周波数値が異なる結果となっていますが、この程度の差であれば問題なく識別できるはずです。

さらにピークの大きさからノイズの大きさも相対的に判別することができるため、影響度の大きさも比較することができます。

サンプルスクリプト

最後に今まで行ったコードをコピペで実行できるように全文を下記に記載します。

基本的には、元データのサンプリング間隔と表示したい周波数範囲さえ調整すればどのようなデータにも対応できるはずです。

記事を書いた人

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

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


書いた人はこんな人

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

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

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

関連記事

採用情報

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

バックエンドエンジニア

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

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

\ 世界を変える…! /

Androidエンジニア

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

iOSエンジニア