GNURadio

整流回路とオペアンプ増幅回路でWi-Fi電波を可視化してみるなんてのを見て、フムフムと頷いているオイラーが居る。

電波の入り口のアンテナは、ハーフ・ラムダのダイポールアンテナ。どうせなら、八木アンテナにしてゲインを稼ぐのが良いかも。

次はダイオードを2個使った、倍電圧整流回路。ダイオードは順方向電圧が小さいショットキータイプの物がいいんだけど、既にディスコンらしい。オイラーが現役の頃は普通に手に入ったんだけどね。時代の趨勢か。

最後はオペアンプを非反転増幅回路にして、1000倍の増幅度を得ている。どんな微弱な電波も捉えてやるぞと言う、気構え十分な回路構成。

これで、見事にWifiルーターや、電子レンジ、(最近だとIHIの炊飯器とか、家の中に仕掛けてあるかも知れない盗聴器でもOKかな)から、出る電波を捉えて、LEDを光らせる事が出来るとの事。小学生向けの電子工作にちょうど良いだろう。

小学生じゃないオイラーは、ipadで実験。Wi-Fiミレルを、突っ込むだけの、お手軽実験。

こんなのが有ると、家の外に電波が漏れてないか、確認したくなるよね。電波が漏れてたら、ガムテープで塞いでしまいたい、今日この頃。

でも、屋外でipadを持ってウロウロしてたら、怪しい人と思われて通報されそう。どうするか? 背中にのぼりを立てて、堂々と宣言するのさ。『安全確保の為、漏洩電波の調査中です。XX電波監理局・委託者』ああ、電監は余計だな。

本当に怪しい人はipadなんか使わないで、スマホをさりげなく持って、歩きスマホで済ませちゃいますよ。そう言えば5月の連休の時だったかに公園で、スマホを持った人(若い人からお年寄りまで)の軍団をみたけど、どういう集団?

ポケモンGoの集団かしら? 人気が落ち目になったんで、こういう田舎の公園でもサービスしてんかな?何やってんですかって、職質すればよかったな。

Install GNUradio

GNU Radio(本家)

GNU Radioに関する調査

rtl_tcpとVirtualBoxを使ってGNURadioからRTL-SDRを使う1つの方法

GNU RadioでFMラジオ受信機を作ってみる

ソフトウエアラジオ

ぐだぐだとURLを並べていてもしょうがない && Debianを入れたDISKがいっぱい余っていて可哀そうという理由で、入れてみた。色々なサイトを見ていると、ソースから真面目にコンパイル して入れるってのが流行のようだけど、オイラーはそんな元気がない。さくっと、apt install gnuradioしちゃった。山のように関連品が来たのは、見なかった事にする。

Cフラフラ語で書かれた部品をPythonで配線するって方法。システム側が管理するPythonとオイラーが勝手に入れたanacondaが喧嘩しないか? アナコンダの方が強そうだけど。

取り合えず起動してみる。

debian:tmp$ gnuradio-companion
<<< Welcome to GNU Radio Companion 3.7.10 >>>

Block paths:
        /usr/share/gnuradio/grc/blocks

ほー、本拠地が出て来た。

debian:tmp$ cd /usr/share/gnuradio/
debian:gnuradio$ ls
examples  fec  grc  modtool  themes
debian:gnuradio$ ls examples/
analog  channels  fcd          hf_radio  noaa     uhd
atsc    ctrlport  fec          metadata  qt-gui   vocoder
audio   digital   filter       mp-sched  tags     volk_benchmark
blocks  dtv       hf_explorer  network   trellis  zeromq

examplesが有るんで、簡単そうなオーディオを見てみる。

debian:gnuradio$ cd examples/audio/
debian:audio$ ls
audio_copy.py      dial_tone_daemon.py   multi_tone.py
audio_copy.pyc     dial_tone_daemon.pyc  multi_tone.pyc
audio_fft.py       dial_tone.grc         noise.py
audio_fft.pyc      dial_tone.py          noise.pyc
audio_play.py      dial_tone.pyc         spectrum_inversion.py
audio_play.pyc     dial_tone_wav.py      spectrum_inversion.pyc
audio_to_file.py   dial_tone_wav.pyc     test_resampler.py
audio_to_file.pyc  mono_tone.py          test_resampler.pyc
cvsd_sweep.grc     mono_tone.pyc

コンパニオンから、ここを開いてみたら、dial_tone.grcってのとcvsd_sweep.grcってのが 見えた。トーンの方を選ぶと、350と440Hzの発信器と弱いノイズ源が足されて、オーディオ出力に出ていってる。ピポパの電話機の音を作ってるんだな。 走らせると、xtermがなんたらかんたらって言って、警告が出て来た。

で、もう一方のcvsdの方を選んで走らせると、何やらFFTの窓が開いて、FFTしてた。

dial_tone.grcを開いて、正体を確かめてみる。

<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
  <timestamp>Sat Jul 12 14:32:31 2014</timestamp>
  <block>
    <key>options</key>
    <param>
      <key>id</key>
      <value>dial_tone</value>
    </param>
      :

オイラーの大嫌いなXMLになってた。これが部品名かな。次は、pythonの例。どれでもいいんだけど、dial_tone.pyを見てみる。

        sample_rate = int(options.sample_rate)
        ampl = 0.1

        src0 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 350, ampl)
        src1 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 440, ampl)
        dst = audio.sink(sample_rate, options.audio_output)
        self.connect(src0, (dst, 0))
        self.connect(src1, (dst, 1))

発信器が有って、それが出力に接続されるって事だな。 ああ、/tmpの下に、dial_tone.pyなんてのが出来ている。実行時に作成されたやつか。 どうでもいいけど、例に何の説明も無いとは、どういう事よ。それとも、じっと配線図を眺めて、機能を想像せいと言う事?

文句を言っていても進歩が無いので、もう少し詳細に観察。Runメニューから実行すると、下記のようなメッセージが左下の窓に出て来る。

Executing /usr/bin/python -u /tmp/dial_tone.py

-uオプションは、stdin/out/errをバッファリングしないで垂れ流せってオプション。それを除いても、普通に/tmpの下にあるスクリプトを実行せいって事だ。実行したら音が出てもよさそう。

と思っていたら、LXDEのメニューで音がしないようにミュートしてた。音が鳴るように解除したら、無事にトーンが聞こえた。雑音を大きくしても、トーンはちゃんと判別出来るな。まだ、オイラーの脳内フィルターはちゃんと機能してるな。

そして、もう一方のやつを実行すると、宇宙的な不思議なスィープ音が聞こえた。ブロックダイアグラムにVCOなんてのが見える。これって、与える電圧によって発振周波数が変わる発信器の事じゃない。と言う事は、与える電圧をランプ波にすれば、低音から高音まで連続的に聞こえるんだな。一種の周波数変調器か。納得しました。

このgnuradio-companionはやはり有名らしく、LXDEのPrograminngの項にGRCって名前で登録されてた。有名なアプリなのね。で、コンパニオンさんが居ないと、実行出来ないの?って言う、当然の疑問が出て来る。

/tmpの下に出来てるpythonスクリプトの冒頭を見ると

debian:tmp$ head dial_tone.py
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
##################################################
# GNU Radio Python Flow Graph
# Title: Dial Tone
# Author: Example
# Description: example flow graph
# Generated: Tue May 22 16:06:18 2018
##################################################

こんな風になってたぞ。注目は1行目。python2を探して、それを起動っていう事。今の所(DebianのPythonが古い為)、anacondaのpython3系とはちゃんと棲み分けできてる。 先走りしてるウブだと、喧嘩しちゃうんじゃなかろうか。ちゃんとフルパスでPythonを指定して欲しいと思うぞ。

で、このスクリプトを単独で走らせても、全く問題なく走る。コンパニオンさんて、研究者と言うか、実験者の事なのね。色々実験して、その結果が/tmpの下に残るって事だ。

doc gnuradio

マニュアル類は無いかと、探してみると

debian:gnuradio$ pwd
/usr/share/doc/gnuradio
debian:gnuradio$ ls README*
README           README.dtv     README.gl       README.signal_flow
README.analog    README.dvbs2   README.gsm      README.txt
README.audio     README.dvbt    README.howto    README.TXT
README.blocks    README.dvbt2   README.karn     README.uhd
README.channels  README.fcd     README.md       README.vocoder
README.Debian    README.fec     README.modtool  README.zeromq
README.digital   README.fft     README.plot.gz
README.doxyxml   README.filter  README.qtgui

README.xxxってのが、その入り口みたい。一つ例を挙げる。

debian:gnuradio$ cat README.fcd
This is the gr-fcd package. It contains a source block for the
FunCube Dongle hardware.

The Python namespace is in gnuradio.fcd, which would be normally
imported as:

    from gnuradio import fcd

See the Doxygen documentation for details about the blocks available
in this package. A quick listing of the details can be found in Python
after importing by using:

    help(fcd)

マニュアルの見方が出て来た。味方になってくれるかどうか?

debian:gnuradio$ python2.7
Python 2.7.13 (default, Nov 24 2017, 17:33:09)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from gnuradio import fcd
>>> help(fcd)
Help on package gnuradio.fcd in gnuradio:

NAME
    gnuradio.fcd - Provides a source block for the FunCube Dongle hardware.

FILE
    /usr/lib/python2.7/dist-packages/gnuradio/fcd/__init__.py

PACKAGE CONTENTS
    _fcd_swig
    fcd_swig

FUNCTIONS
    source_c_sptr_swigregister(...)

    source_c_swigregister(...)

とからしい。まどろこっいな。つらつらと見て行くと、uhdってのがハードとの橋渡しをしてくれるみたい。膨大な資料が出てくる。

で、コンパニオンさんのhelpで、色付きの端子の説明が出てくる。各モジュールのデータ形式は決まっているっぽい。

pd

過去に似たようなコンセプトのやつををやったと思い出したぞ。

Pure Data Japan こんな協会が設立されてた。

懐かしくなって、pdパッケージを入れちゃたぞ。

Pure Data(本家)を見ると、iOSにも入りそうな事が書いてあったので、行ってみたら、MACユーザー限定っぽい。残念。(そんなに間口を拡げてどうすると)

関連で、 SDRはどう作る? なんてのが見つかった。Ch5ぐらいまで有ったので、見ておくと吉。

anacondaと喧嘩する?

GnuRadioの最終出力がpythonスクリプトって事は、pythonのdebug環境が有ったらいいな。 ああ、debug環境なんて言う大層なものじゃなくて、python2の貧弱なreplを補うだけでいい。 そうなるとipythonだな。

apt-cacheで探すと、

ipython - Enhanced interactive Python 2 shell
ipython3 - Enhanced interactive Python 3 shell

こんなのが出て来る。当然、2系のやつを入れたよ。が、ipythonを起動すると、anacondaに入っているpython3が起動してくる。あれ? ひょっとしてanaconda側のipythonを起動してるのかな? そう思って、/usr/bin/ipythonと指定しても、やはり3系が上がってくる。

anacondaを入れた時、.bashrcに

# added by Anaconda3 installer
export PATH="/home/sakae/anaconda3/bin:$PATH"

こんな痕跡を残していったんだ。この妖術に惑わされて、/usr/bin/ipythonを起動しても、3系が動いちゃうという現象になったんだな。

これはもう、破滅の第一段階だな。anacondaには冬眠してもらおう。PATHから外して、知らんふりを決め込む事にしたよ。どうしてもanacondaを起動する必要が出たら、絶対PATHで指定するなり、テンポラリィーでPATHを通せば済む話ですから。

begin GNURadio

Tutorials Write Python Applications

いきなり、上記から見始めたけど、いいのかな? まあ、ページの中ほどにモジュールの簡易的な説明が有ったぞ。

uhd_cal_rx_iq_balance  uhd_fft           uhd_images_downloader  uhd_siggen
uhd_cal_tx_dc_offset   uhd_find_devices  uhd_rx_cfile           uhd_siggen_gui
uhd_cal_tx_iq_balance  uhd_image_loader  uhd_rx_nogui           uhd_usrp_probe

それから、ドングルと言うか、ハードに対するユーティリティが、上記のように用意されてるのね。

  <connection>
    <source_block_id>analog_sig_source_x_0</source_block_id>
    <sink_block_id>blocks_throttle_1</sink_block_id>
    <source_key>0</source_key>
    <sink_key>0</sink_key>
  </connection>
  <connection>
    <source_block_id>analog_sig_source_x_1</source_block_id>
    <sink_block_id>blocks_throttle_0</sink_block_id>
    <source_key>0</source_key>
    <sink_key>0</sink_key>
  </connection>
  <connection>
    <source_block_id>blocks_multiply_xx_0</source_block_id>
    <sink_block_id>qtgui_freq_sink_x_0</sink_block_id>
    <source_key>0</source_key>
    <sink_key>0</sink_key>
  </connection>
  <connection>
    <source_block_id>blocks_throttle_0</source_block_id>
    <sink_block_id>blocks_multiply_xx_0</sink_block_id>
    <source_key>0</source_key>
    <sink_key>1</sink_key>
  </connection>
  <connection>
    <source_block_id>blocks_throttle_1</source_block_id>
    <sink_block_id>blocks_multiply_xx_0</sink_block_id>
    <source_key>0</source_key>
    <sink_key>0</sink_key>
  </connection>

4KHzと5KHzのCOS波をMIXする回路のネットリスト。足し算じゃなくて掛け算するとミキサーになる。(オーディオ界でミキサーと言うと、複数の音源を一つに足し合わせる意味だけど、無線界では、掛け算の意味で使う)酷試にも出て来るけど、ミキサーの出力はどうなりますか? 和の9KHzと差の1KHzが出て来るのはいいんだけど、元の波形も出て来ると思ってたぞ。

それから、発信器とミキサーの間に、misc/throttleという絞り弁を入れておく事。こうしないと(多分)スペアナの演算が間に合わなくて正しい表示をしてくれない。それから、信号は全てfloat32にしてる。

発信器の一つをCOS波からノコギリ波にすると、色々な所にスプリアス(?)が出て来て、面白いぞ。

高周波の積

積和の公式

KIT数学ナビゲーション SDにも紹介されてた、なかなか良いページだな。

サンプリングがデフォで32000/sなんだけど、これってFFTする時に都合が悪くないか?2のべき乗のデータ数のはずなんだけどな。ああ、いいのか、32768個データが揃った所でFFTすれば何の問題も無いって事だな。

Gqrx SDR

GunRadioは実験基盤。普通の人は、製品になったラジオを使いたいはず。 定番は、 Gqrx SDR みたい。(Unix系だとね)FreeBSDにも、

Gqrx is an experimental software defined radio receiver implemented using GNU
Radio and the Qt GUI toolkit. Currently it supports the following devices:

 - Funcube Dongle Pro and Pro+
 - RTL2832U-based DVB-T dongles (rtlsdr via USB and TCP)
 - OsmoSDR
 - USRP
 - HackRF Jawbreaker
 - Nuand bladeRF
 - RFspace SDR-IQ, SDR-IP and NetSDR
 - Airspy
 - any other device supported by the gr-osmosdr library

Gqrx can operate as a traditional AM/FM/SSB receiver with audio output or as
an FFT-only instrument.

こんな紹介が有った。ラズパイ3でもぎりぎり使えるみたい。

RTL-SDR with Gqrx

何もドングルを刺していない状態で、取り合えず起動するかどうかだけ確かめてみた。

debian:~$ gqrx
linux; GNU C++ version 6.3.0 20170221; Boost_106200; UHD_003.009.005-0-unknown

Controlport disabled
No user supplied config file. Using "default.conf"
gr-osmosdr 0.1.4 (0.1.4) gnuradio 3.7.10
built-in source types: file osmosdr fcd rtl rtl_tcp uhd miri hackrf bladerf rfspace airspy soapy redpitaya
FM demod gain: 1.52789
IQ DCR alpha: 1.04166e-05
Using audio backend: auto
BookmarksFile is /home/sakae/.config/gqrx/bookmarks.csv
getDeviceList : Available input devices:
    0 : "RFSPACE SDR-IQ Receiver"
    1 : "RFSPACE SDR-IP Receiver"
    2 : "RFSPACE NetSDR Receiver"
    3 : "RFSPACE Cloud-IQ Receiver"
    4 : "RTL-SDR Spectrum Server"
    5 : "Red Pitaya Transceiver Server"
    6 : "Complex Sampled (IQ) File"
Loading configuration from: "default.conf"
Configuration file: "/home/sakae/.config/gqrx/default.conf"
gr-osmosdr 0.1.4 (0.1.4) gnuradio 3.7.10
built-in source types: file osmosdr fcd rtl rtl_tcp uhd miri hackrf bladerf rfspace airspy soapy redpitaya
/path/to/your/file: No such file or directory

同然の事ながら、エラーですよ。でも、それらしい受信機の形状は出てきたな。

etc

ソフトウェア無線(SDR)技術の最新動向と将来展望

DVB-Tワンセグチューナーを追加で買う

KG-ACARS HFDL VDL MCAに感謝 受信方法 受信記録のブログPlus RTL-SDR

Sdr FMステレオ復調を実装

ディジタルFMステレオ・チューナの製作 ―― 雑誌の付属基板でここまでできる

受信機のデジタル信号処理