PCでラジオ -SDRで遊ぼう-

#### 参考
[Rtl-sdr - rtl-sdr - Open Source Mobile Communications](https://osmocom.org/projects/rtl-sdr/wiki)
[Quick Start Guide](https://www.rtl-sdr.com/rtl-sdr-quick-start-guide/)
[Soapy SDR plugin for RTL-SDR](https://github.com/pothosware/SoapyRTLSDR/wiki)
[Build Linux](https://github.com/cjcliffe/CubicSDR/wiki/Build-Linux)
[BuildGuide](https://github.com/pothosware/SoapySDR/wiki/BuildGuide)


#### SDRとは
SDRは高性能なADCとPCを組み合わせたソフトウェアによるラジオです
SDRの基本的なことはこちらから
[MacでのソフトウェアラジオはCubicSDRが簡単＆スムーズかも♪](https://k-tai.watch.impress.co.jp/docs/column/stapaapple/1318303.html)
[Macを万能受信機へとグレードアップしてゆく!!!](https://k-tai.watch.impress.co.jp/docs/column/stapaapple/1316911.html)
[ソフトウェアラジオの自作！dsPICで計算した音を聴く](https://電子うさぎ.com/archives/11558)

海外の実際のSDRを体験できるサイト
[Wide-band WebSDR in Enschede, the Netherlands](http://websdr.ewi.utwente.nl:8901/)

SDRはかなり気になっていたんですがちょっとお値段張るので躊躇していたところ某店で安売りされているのを見て衝動買いしました
この記事はLinuxでSDRをやってみたいという人向けのメモ的なものです

なお高周波回路では信号が反射してしまうのを防ぐためインピーダンスマッチングをする必要があります
主にラジオ向けの受信機では同軸ケーブルとアンテナは通常は特性インピーダンス50Ωになることが想定されていますので同封されていなければ条件にあうものを準備してください
(秋葉原やアマゾンにあります)
またプラグ形状はSMAやMCXなどがあり当然変換アダプターも存在するので必要があればこちらも用意する必要があります

#### ドライバー
RTL-SDRっぽいUSBトングを買うとR820T2やR860と書かれていると思います
実機をセットしてみて
```sh
sudo lsusb
```
を実行したときに
```Realtek Semiconductor Corp. RTL2838 DVB-T```
が表示されればアタリです

RTL2832U向けのドライバーをインストールします
```sh
git clone https://github.com/osmocom/rtl-sdr.git
cd rtl-sdr
mkdir build
cd build
cmake .. -DINSTALL_UDEV_RULES=ON
make -j 4
sudo make install
sudo ldconfig
```

今回はnon-rootユーザーから使いたいのでudevもinstallします

#### SoapySDR
操作にはクロスプラットフォームのCubicSDRを使用します

トラブルになりやすいGUI関連のライブラリーに触れなくてはならない, SoapySDRを/usr/localではなく/usr/lib64にinstallしなくてはならない等, 多少面倒くさいので出来合いのものを使った方がビルドが安定します
(必要ならパッケージのアップデートで壊れない様にバージョンフィックスや再ビルドをした方がよいかも(?))

Fedora
```sh
sudo dnf install CubicSDR SoapySDR-devel
```

SoapySDRはさまざまな環境に対応するためすべてをまとめるSoapySDR本体の下にデバイスに対応する各モジュールがあるという構造になっているようです
これがCubicSDRのようなGUIソフトに読み込まれて動作するという方式です
RTL-SDRに使うモジュールがあるのでそれを用います
```sh
git clone https://github.com/pothosware/SoapyRTLSDR.git
cd SoapyRTLSDR
mkdir build
cd build
cmake ..
make
sudo make install
```

実機をセットしてテストします
そのままだと
```
Error probing device: Unable to open RTL-SDR device
```
と怒られてしまうのでドライバーの上書きを行います
```sh
sudo rmmod dvb_usb_rtl28xxu
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee --append /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf
SoapySDRUtil --probe="driver=rtlsdr"
```

出力は例えばこのようになります
```
######################################################
##     Soapy SDR -- the SDR abstraction library     ##
######################################################

Probe device driver=rtlsdr
Found Rafael Micro R820T tuner
[INFO] Opening Generic RTL2832U OEM :: 00000001...
Found Rafael Micro R820T tuner

----------------------------------------------------
-- Device identification
----------------------------------------------------
  driver=RTLSDR
  hardware=R820T
  index=0
  origin=https://github.com/pothosware/SoapyRTLSDR

----------------------------------------------------
-- Peripheral summary
----------------------------------------------------
  Channels: 1 Rx, 0 Tx
  Timestamps: YES
  Time sources: sw_ticks
  Other Settings:
     * Direct Sampling - RTL-SDR Direct Sampling Mode
       [key=direct_samp, default=0, type=string, options=(0, 1, 2)]
     * Offset Tune - RTL-SDR Offset Tuning Mode
       [key=offset_tune, default=false, type=bool]
     * I/Q Swap - RTL-SDR I/Q Swap Mode
       [key=iq_swap, default=false, type=bool]
     * Digital AGC - RTL-SDR digital AGC Mode
       [key=digital_agc, default=false, type=bool]
     * Test Mode - RTL-SDR Test Mode
       [key=testmode, default=false, type=bool]
     * Bias Tee - RTL-SDR Blog V.3 Bias-Tee Mode
       [key=biastee, default=false, type=bool]

----------------------------------------------------
-- RX Channel 0
----------------------------------------------------
  Full-duplex: NO
  Supports AGC: YES
  Stream formats: CS8, CS16, CF32
  Native format: CS8 [full-scale=128]
  Stream args:
     * Buffer Size - Number of bytes per buffer, multiples of 512 only.
       [key=bufflen, units=bytes, default=262144, type=int]
     * Ring buffers - Number of buffers in the ring.
       [key=buffers, units=buffers, default=15, type=int]
     * Async buffers - Number of async usb buffers (advanced).
       [key=asyncBuffs, units=buffers, default=0, type=int]
  Antennas: RX
  Full gain range: [0, 49.6] dB
    TUNER gain range: [0, 49.6] dB
  Full freq range: [23.999, 1764] MHz
    RF freq range: [24, 1764] MHz
    CORR freq range: [-0.001, 0.001] MHz
  Sample rates: [0.225001, 0.3], [0.900001, 3.2] MSps
  Filter bandwidths: [0, 8] MHz
  ```

#### 実験
それではFMラジオを聞いてみましょう
日本では基本的に70-100MHzの周波数帯に収まっています
[全国民放FM局・ワイドFM局一覧](https://www.soumu.go.jp/menu_seisaku/ictseisaku/housou_suishin/fm-list.html)

![](https://storage.googleapis.com/white-wordcloud/Screenshot-SDR.png)

(残念ながら高周波回路と低周波回路は本質的に異なるのでAMラジオの方は自分のものでは受信できませんでした)
(専用の回路とダイレクトサンプリングと組み合わせて低周波も検知できるトングもあるようです)

それでは, よいSDRライフを