GNURadio introduction to Satellites



● (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 (日本アマチュア衛星通信協会)


トップ へ戻る.
前のページ へ戻る.
次のページ へ移る.
ホームページ(目次) へ戻る.