ハード屋のための「実用」プログラミング講座(1)

投稿者: | 2017年1月8日

Practical Programming Workshop for hardware designers.

いわゆるハード屋さんにとっても、プログラミングが少しできると役に立つことがあります。

ソフトを書けばいいんだろうけど、知り合いに頼むのもちょっと悪いな

ということはあるのではないでしょうか。

この連載(?)の読者対象は、

  • 電子設計のハード屋さん
  • 普段は Windows の MS-Excel で計算とかシミュレーションとかしている
  • もう少し効率的に大きなファイルのデータ処理ができたらいいなあ
  • 昔、C 言語を少し囓ったことがあるけど実用的には使わなかった

という方々です。最後の「C 言語云々」は、C 言語の演算子(++ とか -= とか)を御存知だと理解が楽だというだけであり、必須の知識ではありません。


紹介するプログラミング言語は「AWK(オウク)」というものです。最新のプログラミング言語ではなく、誕生してから 40年も経つ「古い」言語であり、世の中の若い IT 系技術屋さんは首をかしげるかも知れませんが、達人級のプログラマさんには納得して頂けるはずです。何しろ AWK を開発したのは、AT&T ベル研究所の Alfred Aho, Peter Weinberger, Brian Kernighan という研究者たちで、コンピュータ技術者/研究者で知らなければモグリと言われても仕方がないくらいの大御所なのですから!

閑話休題。「実用」プログラミング講座ということですから、決して Hello World を表示して終わりにしたりはしません。普段から頭を悩ませているであろう実際的なテーマを取り上げたいと思います。それは、Microsoft Excel でできなくもないけれど、Excel ではちょっと荷が重い、

デジタルストレージオシロ(DSO)で取得した波形データの分析

です。具体的には、

  • 1000万サンプルにも及ぶ波形データを CSV 形式で取得してみたけど、あまりにファイルが大きすぎて必要な信号(アップ/ダウンエッジやパルス信号など)を見つけられない
  • データのどこかに SPI(Serial Peripheral Interface Bus)信号があるのだけど、それを見つけてデータを確認したい。いや、デコードしたい!
  • ときどきデータ受信の化ける UART 信号を DSO で取得してみた。タイミングや波形に問題があるはずなんだけど、どうやって問題分析しよう

といったようなことです。ハード屋さんが普段ぶつかる問題ばかりではないでしょうか! (自画自賛)

このような問題を分析するのに、AWK 言語は最適な言語です。おそらく Aho, Weinberger, Kernighan さんたちも、まさかこんな用途に AWK が利用されるとは開発当時に思っていなかったはず。それほど AWK は有用で息の長いプログラミング言語なのです。

なお、Gnuplot というグラフ描画ツールもいずれ紹介したいと思います。AWK と共に使うと、CSV ファイルの信号プロットなどに便利に使えます。


第 1 回: デジタルストレージオシロの CSV ファイルを覗いてみる

デジタルストレージオシロ(DSO)には、取得した波形データをファイルに記録する機能があります。よほど古い機種でない限り、USB メモリなどにファイルを記録することができると思います。

ファイル形式としては、WFM 形式とか CSV 形式などがあると思いますが、ここでは CSV 形式のファイルを扱います。Microsoft Excel などの表計算ソフトでもよく使われるフォーマットです。DSO で CSV 形式を用いる欠点は、記録に時間がかかることです。なにしろファイルがテキスト形式で冗長なので、ファイルサイズが大きくなります。たとえば、3チャネルの 1000万サンプルのファイルですと、数百メガバイトになることも普通です。

CSV ファイルは単純なテキスト形式のフォーマットなので、Excel やテキストエディタなどで簡単に扱えて便利なのですが、DSO の出力である 1000万サンプル(1000万行)のファイルを Excel で扱うには困難があります。実際に Excel for Mac 2011 でファイルを開いてみましたが、20秒近く待たされたあげくに以下のような悲しいダイアログが表示されてしまいました。実際に読み取れたのは 1048576 行でした。(余談ですが \(2^{20}\) 行ですね。Excel の設計でしょうか。)

一方で、AWK 言語も CSV を容易に扱うことができるのですが、Excel と違って全てのデータをオンメモリに記憶するようなことはしないので、原理的にはどんな長いファイルでも取り扱うことができます。また余談ですが、これは 40年の前に生まれた AWK の歴史に関係があり、当時はメモリが非常に高価だったので、データを全てオンメモリで処理をするようなことは少なかったため、このような言語が重宝された、ということになります。

Excel では全てを取り込むことはできませんでしたが、参考までにファイルをちょっと覗いてみましょう。一番良いのは、次回紹介するテキストファイルビューア(less)などで閲覧する方法ですが、もし DOS コマンドを御存知であれば、次のようにしてみましょう。

まず、スタートメニューから cmd.exe を実行します。もし poi.csv というファイルが z:\yokoyama\tmp にあるとしたら、次のように more コマンドを実行します。(昔の DOS ユーザーでしたら旧知のコマンドかもしれませんね。)

すると次のようにファイルの先頭が表示されます。スペースキーを押すとスクロールします。Ctrl-C を押すと止まります。(このように、昔の DOS コマンドも意外と有用です。)

上のほうにいろいろと表示されていて、そこにも有用な情報はあるのですが、実際に見たいのは TIME,CH1,CH2,CH3 の次の行からです。ここに、信号のサンプル時刻、チャネル 1、チャネル 2、チャネル 3 の電位(ボルト)がずらずらと記録されている訳です。

上の例は、某 Tektronix 社のオシロですが、次に私が愛用している Rigol 社の DSO の例を見てみましょう。

こちらのオシロでは、左からサンプル番号、チャネル 1、チャネル 2、チャネル 3、というようになっています。時間軸はどうなんだというと、上に \(-9.0\times 10^{-3}\) 秒から始まって、\(2.0\times 10^{-7}\) 秒刻みということが分かります。


次回の予告と宿題

次回は、実際に上記のような CSV ファイルを AWK 言語で読み込む方法を学びましょう。その前に、Windows 用の AWK 言語処理系やファイルビューア(less)のインストールもしてみましょう。

皆様への宿題ですが、(次回にも説明したいと思いますが)御自分で Google などで調べて、Windows 上の AWK 処理系や less のインストールに挑戦してみてください。「Windows  AWK  インストール」などと検索すれば見つかることでしょう。

参考書

いわゆるバイブルは Aho、Weinberger、Kernighan の共著で、邦訳は足立高徳さんが出されています。私の頃はトッパンが出してましたが、流れ流れて現在は他の出版社が販売しているようです。訳は同一でしょうから、古書でも良いかと思います。

プログラミング言語 AWK  (アジソン ウェスレイ・トッパン情報科学シリーズ)

(次回に続く…と思う)