GNU Radio は、ソフトウェアで無線機を構築するためのオープンソースフレームワークです。
通常の無線機では、フィルタ、復調器、FFTなどを専用ハードウェアで実現していますが、GNU Radioではそれらをソフトウェアの部品(ブロック)として組み合わせて作ります。
(最初に電波を拾うアンテナと信号をデジタル化する ‘HackRF One’ などのデバイスのみはハードとして必要です)
インストール
下記にてインストールします。
sudo apt update
sudo apt install gnuradio

インストール後に存在を確かめるコマンド

起動
下記コマンドでGUIが起動します。
gnuradio-companion

組み立て例
chatGPTの助けを借りて(そして散々嘘を教えられながら)それでもやっと完成した組み立て例を記録しておきます。
途中で嘘はつかれたけど、chatGPT先生には感謝です。
まずこれが起動直後の画面です。

このフレーム(フローグラフ)の中に、 ‘Options’ と ‘Variable’ の2つのブロックが並んでいます。ここで基本設定を行います。
事前設定
Options
まずは左の ‘Options’ ブロックをダブルクリックすると、設定ダイアログが開きます。

‘Options’ の ‘Title’ 欄に今回のセッション名を適当に入力します。(ここでは仮に ‘grc01’ と入力しています)
入力内容はOptionsブロック表示の ‘Title’ 表示に反映されます。
‘Realtime Scheduling’は ‘On’ が良いようです。
ちなみに左上の ‘File’ メニューの ‘Save’ から保存ファイル名が設定できます。(拡張子は ‘.grc’ です)この名称は最上部に表示される名称にも反映されます。
Variable
変数を定義するブロックです。
全く変数を使わない場合(他ブロックの全部の値を数値で埋める場合)はこの定義は不要ですが、一般的には、定義しておくことが多いようです。
ここの数値を変更するだけで全てのブロックの設定が変更出来るから
sample rateの定義
右の ‘Variable’ ブロックをダブルクリックします。

“ID” を’samp_rate’, “Value” を ‘2e6’ に設定します。
これにより、’samp_rate’ という変数に、2e6という数値が代入されました。
この ‘2e6’ とは、2✖️10の6乗という意味です。すなわち ‘2,000,000’ であり、つまり2MHzであり、これがHackRF Oneでのサンプルレート設定に相当します。
参考:たとえば150kHzであれば、 ‘150e3’ と表記します。
サンプルレートとは取得する周波数幅のことです。
例えば中心周波数が88.3MHzのFM放送局は、その±1MHzの87.3〜89.3MHzの周波数を使って放送しています。
HackRF Oneの信号からはその幅2MHz分の周波数を取得(サンプリング)します。
この2MHzがサンプルレートです。
これから、この ‘samp_rate’ という変数が、多くのブロックの設定値に使用されています。
その他の変数の定義
‘Variable’ ブロックを右列から新たにドラッグ&ドロップしてきて同様に変数を定義します。合計で下表の3つ
| ID | Value | 説明 |
|---|---|---|
| samp_rate | 2e6 | サンプルレート |
| fm_station | ターゲットの周波数 | 地元のFM放送の周波数 |
| bb_rate | 240e3 | ベースバンドレート:’WBFM Recieve’ に入力するレート |

ラジオの組み立て
この画面(フローグラフ)の中で “受信機” を組み立てていきます。
まずは “出来上がり図” から:以下の組み立てと設定で自宅ではFMラジオ放送が聞けました。

いやーここまで組み立てるのに苦労しました。Chat GPTにこの図(フローグラフ)を何回も見て貰いながら、修正を重ねた結果です。
ブロックの探し方
ブロックは右列にズラッと並んでいます。
目的のブロックをこの列から見つけて、フローグラフ内にドラッグ&ドロップするのですが、ブロックの種類が非常に多くて、簡単には見つけにくいです。
そこで右上の検索マークから検索窓を開き、目的のブロック名を(一部でも)入力すると、容易に見つかります。

GUI画面が横方向に十分な長さが無いと、検索マークが隠れてしまうので注意
以下の6つのブロックは図のように接続されています
① → ② → ③
↓
④ → ⑤ → ⑥
① Osmocom Source
このブロックではHackRFからのIQ信号を取得します
目的のFM局の周波数を中心周波数として、その±1MHzの(つまり2MHz幅の)信号を受信します。
下記の例では、中心周波数が88.3MHzでその±1MHz(幅2MHz)で、87.3〜89.3MHzの周波数を取得(サンプリング)します。
設定例

| 項目 | 値 | 説明 |
|---|---|---|
| Device Arguments: | hackrf=0 | 信号を取得するデバイス |
| Center Frequency: | fm_station | ターゲットの周波数(地元のFM放送局周波数に設定) |
| Sample Rate: | samp_rate | 変数 ‘samp_rate’ には、基本設定➡️Variableにて2e6(2MHz)を代入済 |
| RF Gain: | 16 | 下記参照 |
| IF Gain: | 32 | 下記参照 |
| BB Gain: | 20 | 下記参照 |
3つのGain(=増幅器・アンプ)の違い
アンプの位置が違います
アンテナ
⬇️ RF信号
RF Gain(LNA)
⬇️
周波数変換器(MIxer)
⬇️
IF Gain(VGA)
⬇️
A/D変換器
⬇️ IQ信号
BB Gain
⬇️
FM復調器
| 項目 | 別名 | 増幅器の位置 | 利点 | 欠点 |
|---|---|---|---|---|
| RF Gain | LNA | 周波数変換前 | 弱い電波の検知による受信感度改善 | 強い電波が側にあると飽和・相互変調・ゴースト信号の発生 |
| IF Gain | VGA | 周波数変換後・A/D変換前 | FFT表示を見やすくできる | ノイズも増幅してしまう |
| BB Gain | A/D変換後 | FFT表示を見やすくできる | ノイズも増幅してしまう |
② Frequency Xlating FIR Filter
受信信号をベースバンド(OHz)に移動し、不要な帯域をカットします。
設定例

| 項目 | 値 | 説明 |
|---|---|---|
| Center Frequency | 0 | 中心周波数の設定 |
| Sample Rate | samp_rate | 変数 ‘samp_rate’ (2e6を代入済) |
| Decimation | 1 | ここではサンプリング周波数を下げない |
| Taps | firdes.low_pass(1.0, samp_late, 100e3, 20e3) | pythonに挿入するコードのようです。100e3(100khz)がフィルターのカットオフ値 |
③ QT GUI Frequency Sink
QT波のスペクトラムをリアルタイム表示します
設定例

④ Rational Resampler
サンプルレートを2MHzから250kHzに変換します。(8:1の変換)
‘HackRF One’ で取得した2MHzの帯域の信号を、FM放送の信号帯域に合わせて250kHzに変換します。
設定例

⑤ WBFM Recieve
FM復調します。(WBFM = Wide Band FM:多分)
入力レートはbb_rate(240kHz)、音声出力は48kHzとなります。
設定例

⑥ Audio Sink
音声をスピーカーへ出力します
設定例

ブロック同士の繋ぎ方
繋ぎたい接続口2箇所を順にクリックします。
青(IQ信号)は青同士で接続、オレンジ(音声信号)はオレンジ同士で接続します。
接続されたブロックの離し方
接続線をクリックして選択します。(青色に変わります)
次に “Delete” キー、もしくは右クリック→Deleteで接続線が消えます。
設定が完了すると、全てのブロック内の文字が黒文字となります。
赤文字が残っているうちは未だ設定(または接続)が不完全です。
アマチュア無線技士3級の試験ではラジオの部品の組み立て順を強制的に勉強させられましたが、それだけの内容では知識量が全然足りない世界です。
受信開始
上部の “▶︎” ボタンをクリックすると、受信が始まり、音声が聞こえて下図のようなスペクトラムウインドウが立ち上がります。


この形はFM放送受信の形としては優秀なもののようです。
まとめ
GNU radioの組立は多数のブロックによる無数の組み合わせがあり、gqrxに比べて多機能であると思われます。
但し自由度が高く多機能な分だけ、専門知識が必要かなという感じでした。
もうちょっと雑音が減ればいいなあと思いますが、どのような調整が必要なのか分かりません。
あるいはそもそもアンテナの位置が悪いのか。
ラジオの組み立てが得意な人は扱いやすいでしょうが、試験勉強知識だけの私にはラジオの組み立てはハードルが高いです。
でも ‘gqrx‘ の時には全体が1つの塊になっているため訳もわからず設定していた値が、 ‘gnuradio’ では各部品に分解された状態でそれぞれで設定されているのを見て、何となくですがその意味が分かるようになりました。
ヘルプ

<PR>

コメント