解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python で複雑な波形データを作る



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析をするにあたり、今のところ波形データの分析が取り組みやすく、簡単だなぁ…と思っているところです。

分析対象の波形作成を簡単かつスピーディにするためのプログラムを作りました。

Microsoft Word で作成した波形の仕様書もついでに出力するプログラムにしました。

Microsoft Word の操作は下の記事でまとめています。
Python で docx を使って Microsoft Word を操作する - 解析エンジニアの自動化 blog



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# 試験用波形の作成に係る関数群
###############################################################################
 
#==============================================================================
# ファイルインポート
#==============================================================================
import numpy as np
import matplotlib.pyplot as plt
import docx
from docx.enum.text import WD_ALIGN_PARAGRAPH
 
#==============================================================================
# 試験用波形を作成する関数
#==============================================================================
def Wave(wave_number, data_number, dt):
   
    ampl        = np.random.rand(wave_number) # 0.0 以上 1.0 未満の乱数
    freq        = np.random.rand(wave_number) # 0.0 以上 1.0 未満の乱数
    t           = np.arange(0, data_number*dt, dt)
   
    for i in range(0, wave_number):
        if i==0:
            f  = ampl[i] * np.sin(2 * np.pi * freq[i] * t)
        else:
            f += ampl[i] * np.sin(2 * np.pi * freq[i] * t)
   
    # グラフ表示
    plt.plot(t, f)
    plt.grid(True)
    plt.title('Wave')
    plt.xlabel('time[sec]')
    plt.ylabel('amplitude')
   
    # グラフ出力
    file_name = 'wave.jpg'
    plt.savefig(file_name)
   
    return ampl, freq, t, f, file_name
 
#==============================================================================
# 試験用波形を作成する関数 Wave の実行結果報告書作成関数
#==============================================================================
def DocumentReport(wave_number, data_number, dt, ampl, freq, t, f, img_name):
   
    # add_heading の第2引数
    # 0 : 表題
    # 1 : 見出し1
    # 2 : 見出し2
    # 3 : 見出し3
    # 4 : 見出し4
   
    # Microsoft Word オブジェクト生成
    doc = docx.Document()
   
    # 見出し:表題の追加
    doc.add_heading('試験用波形の作成', 0)
   
    # 見出し:見出し1
    doc.add_heading('試験用波形の作成方法', 1)
    doc.add_paragraph(' 試験用波形は正弦波の重ね合わせによって作成する。\n')
   
    # 見出し:見出し1
    doc.add_heading('試験用波形の作成仕様', 1)
    doc.add_paragraph(' 試験用波形作成仕様を列挙する。\n')
    doc.add_paragraph('  合成正弦波数:' + str(wave_number) + '波')
    doc.add_paragraph('  サンプリング点数:' + str(data_number) + '点')
    doc.add_paragraph('  サンプリング周期:' + str(dt) + '秒')
    doc.add_paragraph('  正弦波式: A × sin( 2 × π × f × t )\n')
   
    # 見出し:見出し2
    doc.add_heading('正弦波式', 2)
    doc.add_paragraph(' 試験用波形の正弦波の重ね合わせに使用した正弦波式を列挙する。')
    for i in range(len(ampl)):
        doc.add_paragraph('  ' + str(ampl[i]) + ' × sin( 2 × π × ' + str(freq[i]) + ' × t )')
    doc.add_paragraph('')
   
    # 見出し:見出し1
    doc.add_heading('作成結果', 1)
    doc.add_paragraph(' 作成した試験用波形を図1に示し、試験用波形のデジタルデータをまとめる。')
    doc.add_picture(img_name) # 作成した波形グラフの挿入
    p = doc.add_paragraph('図1 試験用波形\n')
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
   
    doc.add_page_break() # 改ページ
   
    # 見出し:見出し1
    doc.add_heading('デジタルデータ', 0)
    doc.add_paragraph('time[sec],amplitude')
    for i in range(len(f)):
        doc.add_paragraph(str(t[i]) + ',' + str(f[i]))
   
    # 保存
    doc.save('C:\\Users\\UserName\\Desktop\\python-docx.docx')
 
#==============================================================================
# 試験用波形を作成する関数 Wave で作成した試験用波形デジタルデータの csv 出力関数
#==============================================================================
def WriteWaveCsv(t, f):
    w = np.stack([t, f])
    np.savetxt('C:\\Users\\UseName\\Desktop\\python-csv.csv', w.T, delimiter=',')
 
#==============================================================================
# 実用例
#==============================================================================
wave_number = 5     # 合成する波形の数
data_number = 2**12 # データ数
dt = 0.01           # サンプリング周期 [sec]
 
# 波形作成
ampl, freq, t, f, img_name = Wave(wave_number, data_number, dt)
 
# Misrosoft Word での波形作成レポート作成
DocumentReport(wave_number, data_number, dt, ampl, freq, t, f, img_name)
 
# 波形データの csv 出力
WriteWaveCsv(t, f)



結果

このプログラムから出力される波形のグラフ、 Word ファイル、 csv ファイルをそれぞれ図1 〜 図3 に示します。

図2 と図3 の Word ファイルと csv ファイルは内容が1枚の画像には収まらないので、冒頭の部分のみの画像にしました。

図1 作成した波形


図2 作成した Word ファイル(冒頭)


図3 作成した csv ファイル(冒頭)



コメント

こういったプログラムを量産していくと仕事の自動化に効果的な気がしてます。

さらに、 GUI 化や exe 化などで汎用的に出来れば効果はもっと大きいものとなると思います。

GUI の作り方と exe 化については下の記事でまとめています。

GUI の作り方】
Python で ファイル選択ダイアログを使う - 解析エンジニアの自動化 blog

【 exe 化】
Python を exe ファイルに変換する - 解析エンジニアの自動化 blog



以上