GNU Radioについては、こちらでも少し紹介しています。ただ、日本語によるまとまった解説が、Webや雑誌を含め存在しないことを残念に思っていました。どこかで紹介や解説を書かせていただければなー、と思っていました。そんなところに、あのRFワールド誌からお声がけをいただき、O編集長のご尽力により、このような形で記事にしていただくことができました。
$ brew audit ttrftech/gnuradio/gnuradio ttrftech/gnuradio/gnuradio: * python modules have explicit framework links These python extension modules were linked directly to a Python framework binary. They should be linked with -undefined dynamic_lookup instead of -lpython or -framework Python. /usr/local/opt/gnuradio/lib/python2.7/site-packages/gnuradio/qtgui/_qtgui_swig.so Error: 1 problem in 1 formula
その過程でわかったのは、TLV320AIC3204はADCを192kHz動作させたとしても、チップの想定する仕様では、デシメーションフィルタの特性で帯域が制限されてしまうということでした。デシメーションフィルタはA,B,Cの3種類用意されており、192Hz動作ではCを選択することが想定されているようです。Cのフィルタは下記のように0.2 x fsの通過帯域しかなく、192kHzで動作させたとしても帯域は±38kHzが上限となってしまいます。
測定原理ですが、1フレーム1ms分のサンプル列の波形からRMS (Root Mean Square)を計算しており、これが電力に相当します。ADCで取得したサンプルから計算しますので、対象となるのは帯域内の成分だけです。48kHzでサンプリングしていますので、中心周波数から前後24kHzの内側にある成分のみが測定対象です。帯域外の成分は、ADC内のフィルタで除去されています。
/* acc += a1 * y[n-1] + a2 * y[n-2] */ acc = __SMLALD(a1, state_out, acc); /* FIX: compensate dc offset caused from bit shift operation */ acc += 1 << lShift; /* The result is converted from 3.29 to 1.31 if postShift = 1, and then saturation is applied */ /* Calc lower part of acc */ acc_l = acc & 0xffffffff; /* Calc upper part of acc */ acc_h = (acc >> 32) & 0xffffffff;
機材のセットアップですが、受信機にはいつものRTL2832UドングルをノートPC(Mac Book Pro)に接続しています。受信用ソフトウェアはdump1090をコマンドラインから使います。dump1090は受信したADS-Bメッセージをデコードした結果をTCPのポート30003で出力する機能があります。これを活用してロギングしてみることにします。 UNIX系のOSでは、nc(NetCat)というコマンドで、任意のホスト、ポートにTCP接続をし、受け取ったデータをそのまま標準出力に出すことができます。これをリダイレクトすることでファイルに記録できます。この出力フォーマットはCSVのテキスト形式ですので、データの処理は難しくありません。