gnuradio

Uncategorized
この記事は約9分で読めます。

GNU Radio は、ソフトウェアで無線機を構築するためのオープンソースフレームワークです。

通常の無線機では、フィルタ、復調器、FFTなどを専用ハードウェアで実現していますが、GNU Radioではそれらをソフトウェアの部品(ブロック)として組み合わせて作ります。

(最初に電波を拾うアンテナと信号をデジタル化する ‘HackRF One’ などのデバイスのみはハードとして必要です)

インストール

下記にてインストールします。

install gnuradio

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

which gnuradio

起動

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

gnuradio-companion

組み立て例

chatGPTの助けを借りて(そして散々嘘を教えられながら)それでもやっと完成した組み立て例を記録しておきます。

途中で嘘はつかれたけど、chatGPT先生には感謝です。

まずこれが起動直後の画面です。

flow graph

このフレーム(フローグラフ)の中に、 ‘Options’ と ‘Variable’ の2つのブロックが並んでいます。ここで基本設定を行います。

事前設定

Options

まずは左の ‘Options’ ブロックをダブルクリックすると、設定ダイアログが開きます。

options

‘Options’ の ‘Title’ 欄に今回のセッション名を適当に入力します。(ここでは仮に ‘grc01’ と入力しています)

入力内容はOptionsブロック表示の ‘Title’ 表示に反映されます。

‘Realtime Scheduling’は ‘On’ が良いようです。

ちなみに左上の ‘File’ メニューの ‘Save’ から保存ファイル名が設定できます。(拡張子は ‘.grc’ です)この名称は最上部に表示される名称にも反映されます。

Variable

変数を定義するブロックです。

全く変数を使わない場合(他ブロックの全部の値を数値で埋める場合)はこの定義は不要ですが、一般的には、定義しておくことが多いようです。
ここの数値を変更するだけで全てのブロックの設定が変更出来るから

sample rateの定義

右の ‘Variable’ ブロックをダブルクリックします。

variable config

“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つ

IDValue説明
samp_rate2e6サンプルレート
fm_stationターゲットの周波数地元のFM放送の周波数
bb_rate240e3ベースバンドレート:’WBFM Recieve’ に入力するレート
variables

ラジオの組み立て

この画面(フローグラフ)の中で “受信機” を組み立てていきます。

まずは “出来上がり図” から:以下の組み立てと設定で自宅ではFMラジオ放送が聞けました。

FM radio

いやーここまで組み立てるのに苦労しました。Chat GPTにこの図(フローグラフ)を何回も見て貰いながら、修正を重ねた結果です。

ブロックの探し方

ブロックは右列にズラッと並んでいます。

目的のブロックをこの列から見つけて、フローグラフ内にドラッグ&ドロップするのですが、ブロックの種類が非常に多くて、簡単には見つけにくいです。

そこで右上の検索マークから検索窓を開き、目的のブロック名を(一部でも)入力すると、容易に見つかります。

search

GUI画面が横方向に十分な長さが無いと、検索マークが隠れてしまうので注意

以下の6つのブロックは図のように接続されています

  ① → ② → ③
     ↓
     ④ → ⑤ → ⑥

① Osmocom Source

このブロックではHackRFからのIQ信号を取得します

目的のFM局の周波数を中心周波数として、その±1MHzの(つまり2MHz幅の)信号を受信します。

下記の例では、中心周波数が88.3MHzでその±1MHz(幅2MHz)で、87.3〜89.3MHzの周波数を取得(サンプリング)します。

設定例

osmocom source
項目説明
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 GainLNA周波数変換前弱い電波の検知による受信感度改善強い電波が側にあると飽和・相互変調・ゴースト信号の発生
IF GainVGA周波数変換後・A/D変換前FFT表示を見やすくできるノイズも増幅してしまう
BB GainA/D変換後FFT表示を見やすくできるノイズも増幅してしまう

② Frequency Xlating FIR Filter

受信信号をベースバンド(OHz)に移動し、不要な帯域をカットします。

設定例

frequency xlationg fir filter
項目説明
Center Frequency0中心周波数の設定
Sample Ratesamp_rate変数 ‘samp_rate’ (2e6を代入済)
Decimation1ここではサンプリング周波数を下げない
Tapsfirdes.low_pass(1.0, samp_late, 100e3, 20e3)pythonに挿入するコードのようです。100e3(100khz)がフィルターのカットオフ値

③ QT GUI Frequency Sink

QT波のスペクトラムをリアルタイム表示します

設定例

QT GUI frequency sink

④ Rational Resampler

サンプルレートを2MHzから250kHzに変換します。(8:1の変換)

‘HackRF One’ で取得した2MHzの帯域の信号を、FM放送の信号帯域に合わせて250kHzに変換します。

設定例

rational resampler

⑤ WBFM Recieve

FM復調します。(WBFM = Wide Band FM:多分)

入力レートはbb_rate(240kHz)、音声出力は48kHzとなります。

設定例

wbfm recieve

⑥ Audio Sink

音声をスピーカーへ出力します

設定例

audio sink

ブロック同士の繋ぎ方

繋ぎたい接続口2箇所を順にクリックします。

青(IQ信号)は青同士で接続、オレンジ(音声信号)はオレンジ同士で接続します。

接続されたブロックの離し方

接続線をクリックして選択します。(青色に変わります)

次に “Delete” キー、もしくは右クリック→Deleteで接続線が消えます。

設定が完了すると、全てのブロック内の文字が黒文字となります。
赤文字が残っているうちは未だ設定(または接続)が不完全です。

アマチュア無線技士3級の試験ではラジオの部品の組み立て順を強制的に勉強させられましたが、それだけの内容では知識量が全然足りない世界です。

受信開始

上部の “▶︎” ボタンをクリックすると、受信が始まり、音声が聞こえて下図のようなスペクトラムウインドウが立ち上がります。

spectrum window
gnuradio

この形はFM放送受信の形としては優秀なもののようです。

まとめ

GNU radioの組立は多数のブロックによる無数の組み合わせがあり、gqrxに比べて多機能であると思われます。

但し自由度が高く多機能な分だけ、専門知識が必要かなという感じでした。

もうちょっと雑音が減ればいいなあと思いますが、どのような調整が必要なのか分かりません。

あるいはそもそもアンテナの位置が悪いのか。

ラジオの組み立てが得意な人は扱いやすいでしょうが、試験勉強知識だけの私にはラジオの組み立てはハードルが高いです。

でも ‘gqrx‘ の時には全体が1つの塊になっているため訳もわからず設定していた値が、 ‘gnuradio’ では各部品に分解された状態でそれぞれで設定されているのを見て、何となくですがその意味が分かるようになりました。

ヘルプ

help

<PR>

コメント

タイトルとURLをコピーしました