● (No.1044) GNURadio introduction to Satellites (2019年5月8日) ------------------------------------------------------------- SDR+GNURadio に関する grc_study.zip (by JI1SZP) に含まれる、study.grc に 沿って演習を行っていく。これは、先日 京都で開催された JAMSATシンポジウム (2019, 3/16-3/17) において発表された内容で、JAMSAT Newsletter, #293 にも 詳しく紹介されている。(下段の Reference 参照) [演習9-1]以降は、JE9PEL/1 が [演習6-1] に関連した演習として追加した。 [演習1-1] COS(コサイン)波を生成して波形表示を行う まずは、'Signal Source' と 'QT GUI Time Sink' の二つのブロックを配置し、 COS(コサイン)波を生成して波形表示を行う という基本レシピを作る演習から。 最新の 'GNURadio Companion Ver3.7.13.5' 上で、study_1_1.grc を実行した。 Core -> Variables -> Variable ID: samp_rate, Value: 32000 Core -> Waveform Generators -> Signal Source Right click ->Properties Output Type: Complex, Sample Rate: samp_rate Waveform: Cosine, Frequency: 100 Core -> Instrumentation -> QT -> QT GUI Time Sink Right click ->Properties Output Type: Complex, Sample Rate: samp_rate [演習1-2] COS(コサイン)波を一つだけにする 最初に解凍した grc_study フォルダ内にある study_1_1.grc ~ study_7_1.grc をオリジナルの日付のままにしておきたいので、今、手を加えた grcファイルを 別のファイル名 (sutudy_1_0.grc) として保存した。 Signal Source -> Right click ->Properties -> Output Type -> Float QT GUI Time Sink -> Right click ->Properties -> Output Type -> Float File -> Save As -> Name: sutudy_1_0.grc -> Save [演習1-3] 'Signal Source' をもう一つ追加し違う波形も表示する Signal Source -> Right click ->Properties -> Frequency: 150 Signal Source -> Right click ->Properties -> Output Type -> Float QT GUI Time Sink -> Right click ->Properties -> Number of Inputs: 2 QT GUI Time Sink -> Right click ->Properties -> Output Type -> Float Save the current flow graph as (sutudy_1_0.grc) [演習2-1] 'SDR Source' の出力を、FFT, Waterfall に表示する オリジナル.grc では、'Pluto SDR Source', 'Pluto SDR Sink' ブロックを追加 するようになっているが、自局は廉価な SDR を使っているので この両ブロック とも無い。そこで、代わりに前段に 'RTL-SDR Source' を配置した。また、将来 に備えて、周波数とボリュームのスライドバーを設置した。この段階では、まだ 音声は出ない。'RTL-SDR Source' では、自局 SDR の特性の 'Freq.Corr.(ppm)' および 'RF Gain' の値を設定した。 Variable -> ID: samp_rate, Value: 2084000 QT GUI Range -> ID: freq0, Type: Float, Default Value: 144.660e6 Start: 144.000e6, Stop: 146.000e6, Step: 1e3 QT GUI Range -> ID: vol, Type: Float, Start: 0.1, Stop: 10, Step: 1 RTL-SDR Source -> Sample Rate: samp_rate, Frequency: freq0 ppm: 64, RF gain: 49 QT GUI Sink -> Center Frequency: 144.660e6, Bandwidth: 2000 File -> Save As -> Name: sutudy_2_0.grc -> Save [演習2-2] 'SDR Sink' に入力したものを表示する Pluto SDR は送信もできる SDR なので、演習2-2 で'Pluto SDR Sink' を配置し て送信実験をしている。自局 SDR は受信しかできない廉価な SDR なので、この 演習はできない。代わりに、演習1 と融合して 'Signal Source' から 'QT GUI_ Time Sink' へ COS波を入れて表示する実験をしてみた。 [演習3-1] 固定中心周波数を変動化して表示する Variable -> ID: center_freq, Value: center_freq_val QT GUI Range -> ID: center_freq_val, Lavel: center_freq Type: Float, Default Value: 144.660e6 Start: 144e6, Stop: 146e6, Step: 100 RTL-SDR Source -> Sample Rate: samp_rate Frequency: int(center_freq) QT GUI Sink -> Center Frequency: 144.660e6 Bandwidth: samp_rate File -> Save As -> Name: sutudy_3_0.grc -> Save [演習4-1] SDR受信波をファイルに保存するために 'File Sink' を追加する File Sink -> ID: iq_data.wav File -> Save As -> Name: sutudy_4_0.grc -> Save 実行すると、Homeフォルダに wavファイルが保存される。 [演習4-2] 保存した IQファイルを読み込む File Source -> File: iq_data.wav, Repeat: No QT GUI Sink: Center Frequency: 144.660e6 Bandwidth: samp_rate [演習4-3] 処理時間を実時間に同期させる Throttle -> Sample Rate: 2084000 QT GUI Sink -> Bandwidth: 2084000 実行すると、読み込んだ IQファイルが動的に表示される [演習5-1] LPF を入れて波形を表示する 演習3-1 で作成したフローグラフに、アナログ処理器 LPF(ローパスフィルター) を付ける。内部的にはデジタル処理している。SDR が扱う信号は複素信号なので 正負両方の成分を持っていて、LPF を挟むことで正負対象の信号の特性が得られ、 目的信号だけを取り出すことができる。 Low Pass Filter -> Cutoff Freq: 640000 Transition Width: 120000 File -> Save As -> Name: sutudy_5_0.grc -> Save [演習6-1] GMSK9600 を SDR で受信してデコードする この演習6-1 のフローグラフは、次のようにして出来上がっている。 まず、'QT GUI Range' の Default Value' を、APRS 9600周波数の 144.640 MHz に変更し、続けて 'Low Pass Filter', 'QT GUI Sink' の設定を変更し、最後に 'GMSK Demod', 'File Sink' を追加した。 Variable -> ID: samp_rate, Value: 2084000 Variable -> ID: center_freq, Value: center_freq_val QT GUI Range -> Label: center_freq, Default Vallue: 144.640e6 Low Pass Filter -> Decimation -> samp_rate/9600/2, Sample Rate: samp_rate Cutoff Freq: 9600/2, Transition Width: 600 QT GUI Sink -> Center Frequncy: 144.640e6, Bandwidth: 9600*2 GMSK Demod -> Connect after 'Low Pass Filter' File Sink -> File: GMSK_demod.hex, Input Type: Byte 演習6-1 のフローグラフを実行すると、Homeフォルダに 'GMSK_demod.hex' とし て自動的に生成される。Terminal を起動して、'$ hexdump -C GMSK_demod.hex' を入力して実行すると、保存した 'GMSK_demod.hex' が 16進数でダンプされる。 確認すると、中身が全て Null データだった。これが懸案事項であり、まだ解決 していない。恐らく ブロック内の細かい設定の問題であると思う。なお、LINUX における 'hexdump' コマンドには、次のようなオプションがある。 -b ... 1バイトごとに 8進数で表示 -c ... 1バイトことに アスキー文字で表示 -d ... 2バイトごとに 10進数で表示 -o ... 2バイトごとに 8進数で表示 -C ... 1バイトごとに 16進数で表示し、右側にアスキー文字も表示 (補足) > cutoff周波数を 9600 に変更したらデコードできた! by JH4XSY/1 > [演習6-1 GMSK9600 を受信してデータ化する] > こちらですが、現在、1bit が 1byte として出力されるようになっています。 > そのため、1byte にするためには、8byte分をくっつけて、1byte にし直す > 必要があります。さらに、AX.25 9600 をひも解くために、NRZI などかける > 必要があります。 by JI1SZP > [演習6.1] に関連して、JE9PEL/1 が [演習9-1] 以降に演習形式で追加する。 [演習7-1] APRS1200 受信器を作成する 作成に必要な、'gr-bruninga’および 'gr-ax25'をダウンロードし、次の手順で ビルド(コンパイル)して、GNURadio に登録する。これを先に済ませないと この 演習7-1の中のブロックは赤字で表示され、study_7_1.grcファイルは動作しない。 $ git clone https://github.com/tkuester/gr-bruninga $ cd gr-bruninga $ mkdir build $ cd build $ cmake -DCMAKE_INSTALL_PREFIX=/usr .. $ make -j8 $ sudo -s # make install # sudo ldconfig # cd ~/gr-bruninga/grc # cp *.* /usr/local/share/gnuradio/grc/blocks # exit $ git clone https://github.com/dl1ksv/gr-ax25 $ cd gr-ax25 $ mkdir build $ cd build $ cmake -DCMAKE_INSTALL_PREFIX=/usr .. $ make $ sudo -s # make install # sudo ldconfig # cd ~/gr-ax25/grc # cp *.* /usr/local/share/gnuradio/grc/blocks # exit $ cd $ gnuradio-companion [演習7-2] APRS1200 を SDR で受信してデコードする 演習7-1 で作成したフローグラフを起動し、実際に SDR + GQRX で受信した信号 をデコードして、'afsk_demod.bin' というファイル名で保存した。 目的信号は 'No CRC Error' と表示され、この他にもたくさんの信号がデコードされている。 'Audio Source' がマイク(ステレオミキサー)入力、'Audio Sink' がスピーカー 出力の働きをしている。 [演習8-1] gr-satellites をビルド(コンパイル)する $ sudo -s # git clone https://github.com/daniestevez/gr-satellites # cd gr-satellites # mkdir build # cd build # cmake .. # make # sudo make install # sudo ldconfig # exit [演習9-1] gr-ax25, gr-kiss, gr-display, gr-ec をコンパイルする gr-ax25, gr-kiss の二つは簡単にコンパイルできたが、 gr-display, gr-ec の コンパイルは試行錯誤して時間が掛かった。 by JE9PEL/1 (補足) takuzirra 氏よりコメント gr-display は私もコンパイルエラーになりました。 gr-dispay の github master が、GNURadio 3.8用になっているので、 branch のボタンを押して、tag の方で 3.7 にしました。 それでコンパイルは通りました。(3.7を使用しているので) branch だとこのリンクのようになるようです。 http://github.com/dl1ksv/gr-display/tree/v3.7 (上でインストールして動作したかどうか忘れてしまったのですが、) その後、エラーが出て動作できてないことがあったので、 > ImportError: dynamic module does not define init function (init_display_swig) (使用している python のバージョンが 2.7系だったので) CMakeLists.txt で、find_package(PythonLibs) から > find_package(PythonLibs 2.7 REQUIRED) と書き換えて、再度インストールしたところ動作しました。 http://github.com/dl1ksv/gr-display/issues/5 [演習10-1] GMSK9600 のフローグラフを改良する #1 この演習のフローグラフは、JH4XSY/1局の以前の記事を参考にした。Variable の samp_rate が 96k では動作しなかったので、大胆に 1000000(1M) に設定したら 動作した。音声が聞こえないので様子がわからない。 by JE9PEL/1 'Low Pass Filter' の後ろに、'WX GUI FFT Sink' ブロックを入れたら、右図の ように新たに "FFT Plot" 画面がポップアップした。かなり見通しが良くなった。 後で Homeフォルダを見ると、指定した gmsk_test.dat, gmsk_log.txt の二つの ファイルが出来上がっていたが、hexdump コマンドでもエディタで開いても化け 文字の嵐であった。"GNURadio Companion" の左下のメッセージ画面には、 > error: printing layer 2 repeater subfields is not yet implemented (エラー:レイヤー2レピーター・サブフィールドの印字はまだ実装されていない) というメッセージも見えていた。まだ無音の状態で、フローグラフは改善の余地 が多々ありそうだ。 [演習10-2] GMSK9600 のフローグラフを改良する #2 Generate Options: WX GUI → QT GUI に変更した。関連して、WX GUI FFT Sink を、QT GUI Sink に変更した。 Audio Sink を接続して、音声も出るようにした。 初めて GNURadio上で、本来の GMSK9600信号音が聞けて気分が良い。中心周波数 の変動化も行った。これから、もう少し細かい設定を行っていく。 by JE9PEL/1 http://dl.dropbox.com/s/afv8cufrqo4bivz/study_10_0.grc [演習11-1] AFSK1200 のフローグラフを改良する #1 CQ ham radio No.876 (Jun 2019) P.120-125 を参考に、これをさらに改良する。 http://github.com/handiko/gr-APRS まず、HierBlock内の AFSK_Demod.grc および APRS_Rx.grc を開き、実行する。 これで、GNURadio の項目に、APRS モジュール が追加される。 Misc内の Python Block モジュールをワークスペースにドラッグし、Properties 'Open in Editor' をクリックして、gr-APRS/gr-APRS-master/Module/epb.py の 全てのコードをコピペして保存する。 HierBlock内の AFSK_Demod.grc, APRS_Rx.grc のフローグラフを再確認する。 次に、AFSK_Demod, APRS_Rx を含む APRS_WAV.grc を起動し、Wav File Source に サンプルwav のパスを正しく指定して、wav をデコードできるか実験する。 http://dl.dropbox.com/s/bfprip2bh7n9lwx/APRS_WAV_mod.grc Terminal で、'telnet localhost 52001' とすると、次図のように サンプルwav が綺麗に全てデコードした。 [演習11-2] AFSK1200 のフローグラフを改良する #2 APRS_AFSK1200信号を、完璧に受信デコードすることができた。その手順を示す。 まず、自局所有の RTL-SDR Sourceブロックに差し替える。続くRotatorブロック は、オフセットチューニング用の周波数シフトブロックなので、無くてもよいが 一応、Phase Increment=0 に設定した。その代わりに、RTL-SDR Source _ Freq. Corr.(ppm)=dev_ppm つまり、Variable dev_ppm=65 と、ここで SDR の周波数の ずれを調整している。そして、Variable freq=144.660e6 と周波数を設定した。 さらに Audio Sink を、FFT Filter の後ろに設置して音声が聞けるようにした。 http://dl.dropbox.com/s/urinewfgk8fp5g6/APRS_RX_RTL_mod.grc QT GUI によるスペクトラム・リアルタイム表示の様子。 GNURadio 左下メッセージ画面に表示される Message Debug Print と、Terminal 画面にはデコード結果が同時に表示されるが、どちらも間延びしていて読み辛い。 Terminal画面で 'telnet localhost 52001' と入力すると、同時にリアルタイム で同じ内容が表示されて、通常のように読み易い。これは、Socket PDUブロック における TCP Server Port=52001 の設定による。デコードにはこちらがお勧め。 (Reference) grc_study.zip SDR_GNURadio.pdf SDR_GNURadio.pptx JAMSAT report, W5NYV Michelle Thompson RFワールド#44 「GRCで広がるSDRの世界」 (CQ出版社) JAMSAT Newsletter #293 (日本アマチュア衛星通信協会)
トップ へ戻る.
前のページ へ戻る.
次のページ へ移る.
ホームページ(目次) へ戻る.