GNU Radio
女房が、笹だんご を買ってきた。自分では甘いものを控えている積もりなんだけど、こういう和菓子系は つい手が出ちゃうんだな。渋茶で美味しく頂きました。
何と言っても、笹の香りがいいよね。昔の人は偉いよ。香り付け、エコで環境に優しくて何処にも有る素材だもの。 食べ終わって余った笹の葉は、東京 あたりだと上野動物園に居る、力力君とか真真ちゃんの所へ持って行って、食べて貰えばいいぞ。 だめかな? 彼らは生の葉しか食べないのかな? それとも、枝が大好物?
笹を縛っている蔓もエコだな。上手に縛ってあるなあ。これ、昔の人の知恵? チマキも三角にまとめた 葉を上手に縛ってる。この縛りは中国伝来かな?
ふと、縛り繋がりでロープワークなんてのを思い出した。HAM手帳にもチラッと載ってたな。ちょいと、 ロープワークを調べてみた。
余り上げてもしょうがないので、これぐらいにしておくけど、基本を幾つか知っておくと役に立ちそう。 引越しの時にどこからともなく出てきた、ザイルと言うかロープがあるんで、練習してみようかな。 アンテナのステーを張る時に役立ちそうだ。
FunCube Dongle
と、ある衛星屋(Jamsat)さんに、FunCube Dongleなんてのを、教えて貰った。 USBポートに突っ込んで使う、受信器だ。世の中、進歩したねぇ。SDRだねぇ。おいらも欲しくなったよ。
でも、売り切れみたい。それに、購入は海の向こうからなんで、支払いはPayPalとか。おいらに取っては 2重苦だな。次回売り出しを見つけてエントリー出来ても、支払いはPayPalなんて、おいらできんよ。 Ruby会議のチケットは買い方が分からない為、いつもあの人に用意してもらっていたもんなあ。
こんな所で、自分の身に降り掛かってくるとは、自業自得だな。
GNU Radio
そんな訳なんで、以前ちょっと調べておいた Gnu Radioを試してみる。 試してみるって簡単に言うけど、こちらもやはりそれなりの ハードウェアが必要になるからなあ。まあ、LP0926とか言う、 900 MHz to 2.6 GHz Log Periodic PCB Antenna なら、ひょっとして自作出来るかも知れんけど。 なんせ、プリント板だけで、出来てますからね。
ハード無しでも、ソースを見るぐらいな事はしたいね。 本家のページで、Debianへの入れ方が 指南されたので、うぶにも入れてみた。こういう時、Debian = うぶ って、等式が成り立ってるから 嬉しいね。(あっ、両陣営から石が投げられましたよ。)
インストールを実行すると、まあ、いろんな物が入ってくる事。300MぐらいDisk容量が増加しますですってさ。 おいら、Qt4とか、wxなんてGUI系はいらないんだけど、それに何故かMySQL関係も入ってきたな。DBなんて 何の関係があるのだろう。番組表でもDBにしまっておこうって魂胆かねぇ?
sakae@ubuntu:/usr/share/gnuradio/examples/hf_radio$ wc *py 41 130 1251 input.py 17 58 437 output.py 304 911 9074 radio.py 48 243 1714 ssbagc.py 97 315 3160 ssbdemod.py 1 4 20 startup.py 295 1030 12474 ui.py 803 2691 28130 合計
細かい事は省略するけど、これだけの行数で、LSB,USB,AMの受信機が出来上がっている。勿論、AGC付きだ。 受信機の体裁は、wxと言うGUIモジュールを使って実現してる。GUIの常で細かい事をパラパラと設定してる けど、本質な部分は、400行ぐらいじゃなかろうか。
勿論、信号処理の部分(FFTとかディジタルフィルター等)は、Pythonじゃ遅くて実現出来ないので、C++ で 書かれている。その懇切丁寧な説明が、/usr/share/doc/gnuradio-doc/html の中に3000余りのファイルと して収められていた。全く、どういう人達が開発してるんだろう? 凄い馬力だ事!!!
matplotlib and scipy
折角、GNU Radio を入れてはみたんだけど、正直、あまり楽しめなかった。でも、うぶにどんなPython モジュールが入ったかと調べていたら、おいらの知らない面白そうなのが入っていた。
Pythonだけでグラフを書いちゃう matplotlibと、numpyを便利に使う為のラッパー scipyだ。特に、 matplotlibの表現力は、今まで使っていたgnuplotに 勝るとも劣らずって印象を受けたよ。これはもう試してみる鹿。Windows上にも入れてあげたよ。 そうそう、おまけでwxPythonも、入れといた。
matplotlibの説明書はdocの所からPDFで落とせる。が、800ページもあって、どこから手を付けていいやら。 Rubyと違って、ドキュメントが充実しすぎているのも罪ですな。(と、あらぬ文句を付けてみる) やっぱり、 速成栽培 が、嬉しいよね。
ASCIIデータの読み込み・描画
なんて言うのが紹介されてたので、やってみた。AA30.logの冒頭部分にあるヘッダーを削って、データだけが カンマ区切りで並んだファイルを用意した。
>>> from pylab import * >>> f,r,x = loadtxt('exp-data.txt',delimiter=',',unpack=True) >>> f array([ 6.9 , 6.904, 6.908, 6.912, 6.916, 6.92 , 6.924, 6.928, 6.932, 6.936, 6.94 , 6.944, 6.948, 6.952, 6.956, 6.96 , 6.964, 6.968, 6.972, 6.976, 6.98 , 6.984, 6.988, 6.992, 6.996, 7. , 7.004, 7.008, 7.012, 7.016, 7.02 , 7.024, 7.028, 7.032, 7.036, 7.04 , 7.044, 7.048, 7.052, 7.056, 7.06 , 7.064, 7.068, 7.072, 7.076, 7.08 , 7.084, 7.088, 7.092, 7.096, 7.1 , 7.104, 7.108, 7.112, 7.116, 7.12 , 7.124, 7.128, 7.132, 7.136, 7.14 , 7.144, 7.148, 7.152, 7.156, 7.16 , 7.164, 7.168, 7.172, 7.176, 7.18 , 7.184, 7.188, 7.192, 7.196, 7.2 , 7.204, 7.208, 7.212, 7.216, 7.22 , 7.224, 7.228, 7.232, 7.236, 7.24 , 7.244, 7.248, 7.252, 7.256, 7.26 , 7.264, 7.268, 7.272, 7.276, 7.28 , 7.284, 7.288, 7.292, 7.296, 7.3 ]) >>> r array([ 60.95, 59.06, 57.29, 56.07, 55.1 , 54.18, 52.91, 51.56, 50.71, 49.78, 48.77, 47.56, 47.05, 46.28, 45.4 , 44.24, 43.54, 42.68, 42.19, 41.58, 41.03, 40.13, 39.37, 38.91, 38.85, 38.04, 37.54, 37.15, 36.76, 36.31, 35.7 , 35.14, 35.12, 34.61, 34.58, 34.05, 33.54, 33.25, 32.98, 32.75, 32.54, 32.33, 31.98, 31.82, 31.6 , 31.48, 31.08, 31.27, 30.83, 30.58, 30.48, 30.55, 30.27, 30.21, 29.96, 29.79, 29.78, 29.82, 29.56, 29.47, 29.32, 29.25, 29.34, 29.27, 29.4 , 29.16, 29.24, 29.06, 29.12, 28.92, 29.06, 29.29, 29.13, 29.29, 29.37, 29.44, 29.41, 29.42, 29.69, 29.67, 29.71, 29.71, 30.13, 30.13, 30.25, 30.42, 30.77, 30.4 , 30.74, 30.88, 31.17, 31.32, 31.76, 31.92, 31.58, 32.07, 32.37, 32.76, 32.72, 33.25, 33.46]) >>> x array([-38.11, -37.61, -36.43, -35.69, -34.34, -33.56, -32.64, -31.39, -30.32, -29.68, -28.62, -27.92, -27.15, -25.88, -24.68, -23.93, -22.85, -21.84, -20.8 , -20.13, -19.32, -18.31, -17.29, -16.34, -15.42, -14.78, -13.81, -13.36, -12.38, -11.34, -10.68, -9.61, -8.81, -7.71, -7.1 , -6.14, -5.33, -4.33, -3.85, -2.92, -2.32, -1.47, -0.73, -0.09, 1.17, 1.69, 2.44, 3.51, 4.33, 4.93, 5.72, 6.8 , 7.42, 8.08, 8.92, 9.47, 10.28, 10.85, 11.65, 12.51, 13.32, 14.36, 14.94, 15.95, 16.69, 17.37, 18.26, 19.04, 19.82, 20.51, 21.35, 22. , 22.72, 23.63, 24.3 , 25.44, 25.99, 26.76, 27.58, 28.25, 29.28, 30. , 30.51, 31.45, 32.18, 33.03, 34.08, 34.85, 35.26, 36.1 , 36.75, 37.68, 38.4 , 39.23, 40. , 40.89, 41.55, 42.21, 43.26, 44.18, 44.82]) >>> z = sqrt(r **2 + x **2) >>> z array([ 71.88375755, 70.01853826, 67.89174471, 66.46518638, 64.9249228 , 63.73182878, 62.16781885, 60.36361238, 59.08304748, 57.95645607, 56.54747828, 55.14961469, 54.32149667, 53.02464333, 51.67458176, 50.29734088, 49.17167986, 47.94338328, 47.03866601, 46.19646415, 45.35111134, 44.1097835 , 42.99931395, 42.20170257, 41.79831217, 40.81041534, 39.99959625, 39.47926164, 38.78868392, 38.03960699, 37.26328488, 36.43036783, 36.20815516, 35.45837278, 35.30136541, 34.59916328, 33.96086719, 33.53075305, 33.2039591 , 32.87991636, 32.62259953, 32.36340217, 31.98833068, 31.82012728, 31.62165239, 31.52533108, 31.17563151, 31.46637888, 31.13258422, 30.97484948, 31.01207507, 31.29764368, 31.16615632, 31.27188034, 31.2596865 , 31.2589987 , 31.50439334, 31.73255269, 31.77288309, 32.01532446, 32.20380102, 32.58484464, 32.92475057, 33.33369766, 33.80704217, 33.94145695, 34.4732534 , 34.74198037, 35.22508765, 35.45456952, 36.05975735, 36.63200923, 36.94259466, 37.633509 , 38.11937696, 38.90896041, 39.24828913, 39.76976238, 40.52348085, 40.96793136, 41.7133372 , 42.22184387, 42.87979711, 43.55363819, 44.16576615, 44.90386732, 45.91556708, 46.24589171, 46.77836252, 47.50562493, 48.18849863, 48.99719176, 49.83229475, 50.57548121, 50.96367726, 51.96611396, 52.67085912, 53.43128016, 54.24044616, 55.29407654, 55.93213745]) >>> plot(f,r) [<matplotlib.lines.Line2D object at 0x03F87950>] >>> plot(f,x) [<matplotlib.lines.Line2D object at 0x029FB450>] >>> plot(f,z) [<matplotlib.lines.Line2D object at 0x037FDFD0>] >>> show()
たったこれだけの操作で、X軸が周波数、Y軸がインピーダンスのグラフを表示してくれた。
左下にアイコンが出てくるが、このうちの十字アイコンを左クリックすると pan/zoomと表示される。 そのままマウスをグラフ上へ持って行き、左クリックでドラッグすると、移動が、右クリックでドラッグすると 拡大・縮小が出来る。もう一度、アイコンの所で、クリックすると、この機能は停止。
十字アイコンの右にあるのは、任意位置での拡大アイコン。このアイコンをクリックしてZoomとなった所で、 マウスをグラフの所へ持って行って、クリックしたままエリアを指定すると、拡大される。拡大した部分を 更に拡大なんてのが出来たりして面白い。
こうして、幾つも拡大すると、前の画面に戻りたいなんてのが出てくる。そういう時は、左右アイコンを 使えば可能。そして、フロッピーアイコンは、言わずと知れた保存アイコン。pngあたりで保存しとけばいいかな。 こういう拡大機能なんて、某以来、久しぶりにみたよ。EXCELと違って親切だな。あれ? この機能はRとか に有ったかな。最近、すっかりRにはご無沙汰だからなあ。でも、上のセッションで分かるけど、気分は Rのオペレーションと一緒だな。
pydoc on Windows
こうして、巨大なモジュールを使うようになると、man風に資料を読みたくなる。Pythonのセッションから helpを呼び出して見ればいいんだけど、モジュールによっては、表示まで時間がかかっていらいらする。 良く使うのは、catman(相当)をやっときたいね。
所が、WindowsのPyhonには、pydoc相当が入っていないんだ。やっぱり、Windowsな人にはmanなんて不要の 長物で使わないから、付いていないのかな。ぐぐったら、pydoc.batなんてのを見つけたので、ありがたく 使わせていただく。
@echo off rem ------------------------ rem * Windows用pydoc rem 1. このファイルを%PYTHONHOME%にコピーする。 rem 2. %PYTHONHOME%を環境変数に登録する。 rem rem Linuxと同様にコマンドを使用できる。 rem ------------------------ set BAT_DIR=%~d0%~p0 python "%BAT_DIR%/lib/pydoc.py" %1 %2
使い方は
C:\homes\WORK>pydoc numpy > numpy.man
後はemacs numpu.man とかすれば良い。
Help on package numpy: NAME numpy FILE c:\python27\lib\site-packages\numpy\__init__.py DESCRIPTION NumPy ===== Provides 1. An array object of arbitrary homogeneous items 2. Fast mathematical operations over arrays 3. Linear Algebra, Fourier Transforms, Random Number Generation :
C:Python27\Tools\Scripts\pydocgui.pyw こういうのも有るのね。知らん勝った。暇潰しに、 firefoxでブラブラするにはいいな。