GNU Radioを使った無線信号処理の基本

本稿では、GNU Radioを使用し、無線信号処理の基本についてみていきます。

# GNU Radioとは
「**GNU Radio**」は、デジタルとアナログの信号処理を扱うオープンソースな開発キットです。 RTL-SDR、HackRF、USRPなど幅広いSDR ハードウェアをサポートしており、データを処理するために使用できる膨大な種類の無線処理ブロックとアプリケーションを含んでいます。

# 環境情報
今回、GNU Radioを使って無線信号処理を行うための環境は次のとおりです。

OS：Ubuntu 20.04

```
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```

# GNU Radioのインストール

- GNU Radio本体
- 開発環境

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install gnuradio
$ sudo apt install git cmake build-essential
```

# GNU Radio Companionの起動

ターミナルから`gnuradio-companion`コマンドを実行します。GNU Radioのグ​​ラフィカルツールである「GNU Radio Companion（GRC）」を起動します。

```
$ gnuradio-companion
```

この画面で重要な3つのコンポーネントを確認します。
![Screenshot from 2020-04-18 16-41-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/7f824d91-4a6a-f0dd-0f95-b718d7de5d4c.png)

1. **Workspace**: オプションと変数からなるブロックで表示される空白の領域
2. **Blocks**: 右側のリスト、ラジオの作成に使用できるさまざまな処理ブロック
3. **Reports**: 画面下部、出力、デバッグ、およびエラーメッセージが表示される

# 波形を生成して出力する
## COS（正弦）波を生成して波形表示を行う

GRCを使用してワークフローを構築するには、ブロックペインからワークスペース領域にブロックをドラッグアンドドロップします。
ここでは、「COS（正弦）波」を生成し、波形表示を行います。

1. `Signal Source`ブロックを配置する。`Waveform Generators`セクション内に当該ブロックがあります。`Ctrl + F`キーにて、`Signal Source`キーワードにて検索して確認することもできます。
配置したブロックの文字列が赤で表示されていることに注目してください。これは、ブロックからの出力(この場合は信号源から出るコサイン波形)が別のブロックに未接続であることを意味しています。
    ![Screenshot from 2020-04-18 17-05-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/5e6ff51a-b2f0-6ec6-2136-d0ed9a65611b.png)

2. `Throttle`ブロックを追加する。`Throttle`ブロックは、GNU Radioが過剰なシステムリソース消費するのを防ぐためにすべてのフローグラフで使用するものです。
3. 信号の受け皿として`QT GUI Time Sink`ブロックを追加します。
    <img width="708" alt="スクリーンショット 2020-04-18 23.15.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/a1cc8bdf-3069-090f-5c5b-7a24afa9d552.png">

4. それぞれのブロックを接続する。ブロックの`out`と、接続したいブロックの`in`をクリックすることで接続可能です。
5. `Signal Source`ブロックのプロパティを表示します。ブロックをダブルクリックしてください。プロパティでは、ブロックに関するさまざまな値を設定できます。ここでは、[Frequency]の値を`100`に設定します。
    ![Screenshot from 2020-04-18 23-19-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b620f172-9bd1-f55a-5315-3896202ddf78.png)
6. メニューの[Run] > [Execute]または`F6`キーにて実行する。`Top Block`ウインドウに波形が表示されます。
    ![Screenshot from 2020-04-18 23-23-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b1269346-40e3-c8fb-ff65-c0964c0588bf.png)

## COS（正弦）波を一つだけ表示する
1. 全てのブロックにおいて、[Output Type]を`Complex`から`Float`に変更する。
    <img width="813" alt="スクリーンショット 2020-04-18 23.35.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b7db441a-6aef-b1b6-04cf-e2259dc463c5.png">

## 異なる周波数の波を表示する
1. `Signal Source`ブロックを追加し、ブロックのプロパティを表示する。[Output Type]を`Float`、[Frequency]の値を`150`に設定する。

    <img width="510" alt="スクリーンショット 2020-04-19 5.51.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/57b79940-5567-52b5-674e-2543ed0ce359.png">
2. `Throttle`ブロックを追加する。ブロックのプロパティを表示する。[Output Type]を`Float`に設定する。
3. 既存の`QT GUI Time Sink`ブロックのプロパティを表示する。[Number of Inputs]の値を`2`に設定します。
    <img width="510" alt="スクリーンショット 2020-04-19 5.55.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/1a69a6a2-e02b-cc30-ad92-e8701409dedf.png">
4. それぞれのブロックを接続し、メニューの[Run] > [Execute]または`F6`キーにて実行する。
    ![Screenshot from 2020-04-19 06-02-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/2ce26979-2e3c-115e-dec6-5e944492f250.png)


# 参考情報
- GNU Radio Tutorials, https://wiki.gnuradio.org/index.php/Tutorials
- Software Defined Radio with HackRF, https://greatscottgadgets.com/sdr/
- トランジスタ技術編集部「RFワールド No.44　GRCで広がるSDRの世界」
- コロラド大学ボールダー校「ECEN 4652/5002 - Communications Lab」, http://ecee.colorado.edu/~mathys/ecen4652/labs.html
- GNURadioサテライト入門, http://www.asahi-net.or.jp/~ei7m-wkt/numb1044.htm
- katagaitai CTF勉強会#11 - Misc(hw), https://www.slideshare.net/ysk256/katagaitaictf11-misc-ysk-90319192