Computer & RF Technology

GNURadioとSoft66で7MHz SSBのアマチュア無線を受信する(BPF方式編)

RTL2832Uドングルが不調のため、他のフロントエンドをgnuradioで試してみます。ちょっと懐かしいSoft66を棚から引っ張りだしてきました。

Soft66は7MHz帯受信用で、PCのサウンド入力に接続して使います。以前はWindows用のSDRソフトで使用していました。今回はもちろんMacでgnuradioです。サンプリング周波数が高いと帯域の点で有利なので、96kHzに対応したUSBサウンドアダプタ(Roland UA-1G)を使います。

アンテナは以前に作ってあったものを既設のTVアンテナの横に括り付けました。釣り竿を使い、ペットボトルに巻いたローディングコイルが間に入ったVCHアンテナと呼ばれているものです。下のほうにグランドエレメントが横に寝かせてあります。

フローグラフはこんな感じで組み立てました。ステレオ2chのオーディオ入力を複素信号として取り込んでから、Frequency Xlating FIR Filterで目的の周波数にチューニングします。そしてBand Pass Filterに通しますが、目的の信号はLSBのためにマイナスの周波数で-2.8k〜-200HzをBPFのパスバンドとします。そしてAGCをかけてから、信号の実部を取り出して音声信号とします。(クリックで拡大します)

動作させるとこんな感じです。スライダーが二つあるのは周波数の粗調整と微調整用です。下がバンドのスペクトル。上はフィルタ後のIFのスペクトルです。フィルタの形が見えています。中心が0Hzで、下側の負の周波数がパスバンドになっているのがわかります。

https://youtu.be/7ELtWNZ__p8

気がついたポイントをメモします。

  • BPFで負の周波数を扱うためには、複素数係数(Complex Taps)を選択する必要があります。デフォルトでは実係数(Real Taps)が選択されており、そのままだと実行時に下のようなエラーが表示されてしまいます。一般にGNURadioはパラメータが誤っていたり不足していたりすると実行開始することができない(ボタンがディセーブルになる)のですが、このケースでは残念ながら実行後にエラーとなってしまいます。しかも表示されるメッセージでは原因を推測することができません。ググってみるとMLやBBSなどで解決に至っていないケースが多かったようです。
Traceback (most recent call last):
  File "/Users/takahasi/Projects/gnuradio-trial/ssb\_bpf\_audio.py", line 214, intb = ssb\_bpf\_audio()
  File "/Users/takahasi/Projects/gnuradio-trial/ssb\_bpf\_audio.py", line 131, in \_\_init\_\_
    1, samp\_rate, -2800, -100, 100, firdes.WIN\_HAMMING, 6.76))
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gnuradio/gr/gnuradio\_core\_general.py", line 3893, in band\_pass
    return \_gnuradio\_core\_general.firdes\_band\_pass(\*args, \*\*kwargs)
IndexError: gr\_firdes check failed: 0 < fa
  • Frequency Xlating FIR FilterでTapsの欄が空欄だと、実行時に下記のエラーになりました。適当に10と入れてみて動作しているようですが、FIRでの周波数移動にタップ数がどの程度が適切なのか判っていません。
Traceback (most recent call last):
  File "/Users/takahasi/Projects/gnuradio-trial/ssb\_bpf\_audio.py", line 215, in 
    tb.Run(True)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/grc\_gnuradio/wxgui/top\_block\_gui.py", line 76, in Run
    self.start()
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gnuradio/gr/top\_block.py", line 97, in start
    self.\_tb.start(max\_noutput\_items)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gnuradio/gr/gnuradio\_core\_runtime.py", line 1438, in start
    return \_gnuradio\_core\_runtime.gr\_top\_block\_sptr\_start(self, max\_noutput\_items)
RuntimeError: gr\_buffer\_add\_reader: nzero\_preload must be >= 0
  • サウンド入力のLRとAudio Sourceのチャネル順序が異なり、I/Qが入れ替わっていたことに気がつかなかったため、バンド全体の周波数の向きと、LSB/USBが入れ替わっていておかしいことにしばらく気がつきませんでした。
  • SSBは微妙なチューニングの調整が必要ですが、スライダーを動かしてから音が変化するまで1秒近くの遅れがあり、調整がしにくいです。
  • コンディション的なものなのかはわかりませんが、夜中は北朝鮮の放送しか聞こえません。朝になるとバンド内で賑やかに交信されているのを聞くことができました。

フローグラフのサンプルファイルを下記にリンク貼って置きます。

SSBの復調はいろいろな方式が可能なはずですので、何回かこのシリーズを続けたいと思います。

comments powered by Disqus