Monthly FB NEWS 月刊FBニュース 月刊FBニュースはアマチュア無線の電子WEBマガジン。ベテランから入門まで、楽しく役立つ情報が満載です。

ものづくりやろう!

第五回 GNURadioによる受信機の構成

JH3RGD 葭谷安正

はじめに

前回、前々回とGNURadioの解説を行ってきました。前回はGNURadioでバンドパスフィルタ(BPF: Band Pass Filter)を実現しました。今回はGNURadioと広帯域受信機ドングルを使用して「ラジオの製作」、ではなく「受信機ソフトの構成」に挑戦します。前回のBPFの知識が今回の受信機ソフトの構成でも一部登場します。

すでに広帯域受信機用の受信ソフトとしてHDSDRやCubicSDRなどこの「FB News」上でも過去に多くのソフトが紹介されています。ですからわざわざGNURadioを使ってソフトを作る必要はないかもしれません。しかし、アマチュア無線家の中にもメーカー製の無線機や受信機を持っているけれども、新たに電子部品を買ったり手持ちの部品を使って、無線機やラジオを組み立てるのが楽しいという人が少なからず居られますね。私も掠る(かする)程度ですがその部類に入るのですが、近頃は老眼が急速に進んでいます。このため、近距離から半田付けしたい箇所が見える距離まで離すと、半田ごてを握って両手を思いっきり伸ばしても半田付け箇所に届かないという情けない状態になっています。仕方なく半田ごてを握る回数を減らし、その分ソフトウェアで遊ばざるを得ないという状況です。

今回の受信機ソフトの構成では、FMラジオ、AMラジオ、CW受信機、SSB受信機のフローグラフ、動作画面の図の羅列になってしまいそうです。これらのフローグラフは数年前からGNURadioのホームページや他の書籍を参考にしてそのままGNURadioに打ち込んだり、一部を変更して作成してきたものです。これらのフローグラフを実行すると、音量調整ノブやチューニングノブのレイアウトがラジオ毎に異なっていたり、チューニングにノブを使用していたりスライダーを使用していたり等、統一性が無いと感じられるかもしれません。これは作成時期が年単位で異なっていることが大きな原因です。今回この原稿を作成するためパソコンからかつて作成したラジオのソフトを引っ張りだしてきました。ブロックの組み方はスマートではないかもしれませんが、一応動くことを確認してあります。もう少しパラメータを調整した方が良いものや別のブロックに置き換えてコンピュータへの負荷を減らした方が良い部分もありますがご容赦のほどを。興味のある方はフロー図に手を入れていただいて、より良いものにしていただければと思います。

※この記事で説明しているフローグラフはこのHPのここからダウンロードできます(圧縮ファイル)。実際に動かしていただき、皆さんの用途にあわせて変更して使用していただければ幸いです。なおダウンロードにあたってはFB Newsのご厚意でこのサイトからダウンロードしていただけますが、ダウンロードしていただいたソフトに関しての質問やご意見については、決してFB Newsに質問等されないようにお願いします。

使用物品

ソフトの構成には
(1) 広帯域受信機
(2) GNURadioがインストールされたパソコンを使用します。

(1)の「広帯域受信機(ドングル)」ですが、今回使用したものはRTL-SDRです。筆者が以前購入したRTL-SDRはHFのダイレクトサンプリングモード対応しているものです。RTL-SDRドングルは、本来デジタルTV信号をPCでデコードするために設計されたものですが、これを受信機として利用するわけです。ネット上にもたくさんの情報があふれていますので細部の動作説明は省略します。
ドングルの表に
「RTL-SDR.COM QUICKSTART SETUP V3 RTL2832U R820T2 ・・・」
との記載があります。HF帯の受信を考えておられる方は必ず「ダイレクトサンプリングモード」に対応している製品を使ってください。古いドングルの場合、ダイレクトサンプリングモードに対応しておらず、HF帯の受信ができませんので気を付けてください。

(2)の「GNURadioがインストールされたパソコン」ですが、Windows10にGNURadioがインストールされているものを想定しています。また、RTL-SDRを使用するためにはRTL-SDRのドライバがインストールされていなければGNURadioが認識してくれません。ドライバはzadigを使用してインストールします。また、記載していませんが、受信機ですからドングルにアンテナを接続する必要があります。アンテナは対応する周波数帯のアンテナを接続してください。私はFMアンテナの代わりに1メートル程度の銅線で受信を試みましたが、筆者の部屋では全く受信できませんでした。プログラムが悪いのではと疑いましたが、あと2メートルほど銅線を追加するとFM放送が入ってきました。それでは各種受信機のフローグラフを見ていきます。

FM受信機

□FM受信機フローグラフ
広帯域受信機ドングルを用いたGNURadioのサンプルとしてFM受信機がよく例示されています。この図1もそれらサンプルの一例です。フロー図は図1のように接続します。


図1 FM受信機フローグラフ

RTL-SDRのドングルをパソコンのUSB端子に挿入します。その後GNURadioを起動すると、GNURadioはRTL-SDRを自動認識しますからソフト側での設定は不要です。

プログラム動作時の画面を図2に示します。


図2 FM受信機動作画面

□動作概要
動作概要を図1の各ブロックに沿って簡単に説明します。

・「RTL-SDR Source」はRTL-SDRドングルの受信周波数やサンプリングレート他を設定します。受信周波数と記載しましたがイメージとしてはこの周波数を中心として一定帯域の信号が端子から出力されるという意味です。サンプリング周波数はこのドングルでは2.4MHzで使用することが多いですが、サンプリング周波数2.4MHzの時、「Frequency(Hz)」端子の周波数を中心に、(+)方向に1.2MHz、(-)方向に-1.2MHzの帯域の信号が抽出されます。ですから、この端子から出る信号は「Frequency(Hz)」端子に設定した信号が0Hzに変換されて出力されると考えることができます。受信したい周波数は「RTL-SDR Source」ブロック内の「CH0:Frequency(Hz):」に入れます。この例ではこの欄に数式「(1-Button)*freq1+Button*freq0」が入っていますが、「Chooser」の選択によってButtonに0か1が入るので結果としてfreq1の値かfreq0の値が選択されることになります。この例では、信号の周波数は「QT GUI Chooser」-「Id:freq1」または「QT GUI Range」-「Id:freq0」の値を設定します。「QT GUI Chooser」-「Id:freq1」または「QT GUI Range」-「Id:freq0」のいずれの周波数を選択するのかは、図2実行画面の最上段にあるラジオボタン「QT GUI Chooser」の「Chooser」、「Dial Tune」のいずれのButtonにチェックが入るのかで選択がきまります。「Chooser」にチェックが入ると「Id:freq1」の固定の周波数から選択でき、「Dial Tune」にチェックが入ると「Id:freq」のSlideバーで周波数が選択できるようになります。

・「Multiply Const」は定数を掛け算するブロックです。アナログ回路の増幅に相当する機能をデジタル信号処理で実現する手段として使っています。何倍に増幅するのかは、このボックスをダブルクリックして「Constant」欄に設定します。「Constant」欄にはRFGainと書かれていますが、これは「QT GUI Range」というブロックのIdと同じ名前ですので、このブロック内の値が使用されます。「QT GUI Range」の「Default Value」に実数(「Type:float」)の「1」がはいっていますので、この変数の初期値は1になります。

・「Multiply Const」から「QT GUI Sink」と「Low Pass Filter」に結線がありますので、「1」倍された信号が両方にながれていきます。

・「QT GUI Sink」は「RTL-SDR」の出力信号を周波数表示するためのスコープです。

・「Low Pass Filter」では指定された周波数(「Cutoff Freq」)以下の周波数の信号を通過します。

図1の値では、「CH0:Frequency(Hz):」には初期値として76.5MHz、「Low Pass Filter」の「Cutoff Freq」には「50kHz」がはいっていますので、「Low Pass Filter」出力端には76.550MHz以下の信号が出力されます。

・「WBFM Receiver」はFM変調信号を復調するためのブロックです。出力は復調されたオーディオ信号です。

・「FM Deemphasis」はFM復調で高域信号補正回路です。

□「Sample rate」、「decimation」について
図1のブロックの中で、ブロックを経るにしたがって「Sample rate」や「decimation」が変わっていくところがあります。この「Sample rate」と「decimation」の関係はどのようになっているのでしょうか。「Sample rate」は、1秒間に何回のデータを取り込むのかを示す数値です。「2.4M」と記載がありますので1秒間に2,400,000回のデータを取り込んでいます。「decimation」は、間引きを意味します。図1の設定では、1秒間にデータを2,400,000回取り込みますが、現実に必要なデータ数はこのうちの一部です。必要なエリアから必要な情報を取り込むことができれば残りのデータは不要ですので間引いておきます。この間引き率が数字で記載されます。図1のブロック中の「decimation」欄の値は5ですから2,400,000回のサンプリングデータのうち5分の1の480,000回分のデータを残して後は捨ててしまうといったイメージです。

□GUIレイアウト方法について
GNURadioを使用してフローグラフを作成するとき、様々な部品をレイアウト指定を行わないと部品がどこに配置されるのがわかりません。もし「図2 FM受信機動作画面」のように部品配置を行う場合は各ブロック内のGUI Hint欄に次の要領で配置情報を入力します。

部品の配置にはGUI部品の「GUI Hint」欄に4つの数値をコンマで区切って指定します。例えば、「QT GUI Sink」の「GUI Hint」欄には「1,1,3,3」と記載されています。数値の意味は、左から、「行、列、行スパン、列スパン」を表しています。

GNURadioのホームページには「GUI Hint」の記載要領が次のように記載されています。部品をレイアウトする場合、行、列、スパンについて次のような図3が記載されています。


図3 GUI Hintの記載例
(「https://wiki.gnuradio.org/index.php/GUI_Hint」より)

行、列は0から始まる番号であり、スパンは各ツールが配置されるエリアのサイズを指定しています。数値の指定方法に従ってGUI Hintを設定してみましたが、なかなか思ったイメージ通りにはなりませんでした。

□FM受信機の構成(2)
FM受信機をもっとシンプルに構成する例がhttps://wiki.gnuradio.org/index.php/FM_Demodに掲載されています。図2で使用しているブロックと若干異なりますが非常にシンプルです。この解説で使用したドングルと上のURLに記載されているフローグラフでは使用しているドングル、動作サンプルレートが異なりますのでそのままでは動きませんでした。動作するように変更したフローが図4です。

「RT-SDR Source」ブロックから出力された信号をすぐに10分の1に間引いています。その後「FM Demod」ブロックでFM信号を復調しています。復調後さらにDecimationで5分の1に間引いてSample rateを「Audio Sink」のSample rateに合わせて渡します。「Audio Sink」の先につながっているハードウェアはサウンドボードですので、D/A変換されて音声出力となっています。RT-SDRが面倒な信号処理を行うとともにブロックでも高度な信号処理機能を持っているとは言え、ブロックを何個か並べるだけで放送波が受信、復調されて音声が出てきてしまうのですから驚きです。


図4 FM受信機フロー図(2)

7MHz CW受信機

□ダイレクトサンプリングモードについて
CW受信機を含め、以後で記載する回路はすべてHF帯を例にあげています。RTL-SDRドングルをHF帯で使用する場合、ダイレクトサンプリングモードに設定する必要があります。機種によってダイレクトサンプリングモードにする周波数帯が異なるかもしれませんが、私の持っているドングルの一つには、「100kHz~30MHz」がダイレクトサンプリングモードと記載があります。

設定の具体的方法は、「RTL-SDR Source」ブロックの「Device Arguments」欄に必ず「direct_samp=2」と入れます。複数のドングルを接続する場合はすでにこの欄に「rtl=0」や「rtl=1」と入れてどのドングルかを指定する必要があるので、その場合は「 rtl=0 , direct_samp = 2 」という具合に区切って記載してください。「direct_samp」を記載しないとHF帯を受信できませんのでくれぐれもお忘れなく。

□7MHz CWレシーバフロー図と周波数シフト
図5にCW受信機のフローグラフを記載しましたが、この中の「Frequency Xlating FIR Filter」ブロックについて説明します。


図5 7MHz CWレシーバフロー図


図6 7MHz CWレシーバ実行画面

「Frequency Xlating FIR Filter」ブロックはつぎのような処理をおこないます。
(1) 入力信号の周波数を変換します(ずらします)。どれだけずらすのかというと「Center Frequency」欄に記載された周波数分オフセットをかけます。
(2) 周波数をずらせた信号にDecimationを実行し、出力します。

周波数変換ですが、図5の「Frequency Xlating FIR Filter」ブロックの前後主要ブロックを抜粋して説明します(図7)。「RTL-SDR Source」ブロックの出力は図7では7.025MHzを中心にサンプルレートの半分の帯域の信号成分が含まれています。FFT分析すると7.025MHzを中心周波数として分布しているわけです。ドングルの内部で周波数変換が施され、ドングル出力からは7.025MHz成分が0MHzに変換されて出ているというイメージです。ドングルの出力信号は0Hz成分が7.025MHzなんだと認識している必要があります。「Frequency Xlating FIR Filter」は受け取った信号を700Hzシフトして出力しますので、結果的に「7.025MHzの周波数成分が700Hzにシフトされる(ほかの周波数成分も700Hzシフトされる)」、また同じことですが、「(7.025MHz-700Hz)の信号成分が中心周波数0Hzに変換されるように周波数シフトされる」、「「Frequency Xlating FIR Filter」出力の700Hzの信号はもともと7.025MHzの信号成分」ということになります。ですから、繰り返しになりますが、だれかが7.025MHzでモールス通信をおこなっているとき、ドングルをこの周波数に合わせると、GNURadioのフローグラフのパラメータが図7のように設定されていれば、「Frequency Xlating FIR Filter」出力から700Hzの信号が出力され、それはもともと7.025MHzの信号なわけです。

つぎに「Decimation」欄がありますが、すでに説明したようにこの結果は帯域を減少させます。Decimationが10と設定されると、データを10分の1に間引くわけですが周波数軸上で 0Hzを中心に分布する信号成分の0Hzから全データの10分の1の信号成分が残され(出力され)、それ以外が間引かれます(捨てられます)。帯域が狭くなりますが、処理しなければならないデータ数も10分の1になるため、不要な信号を除去することができ、コンピュータの処理も軽くなります。

「Taps」については、FIRフィルタというデジタルフィルタのタップ係数を設定する欄です。ここには、Sample_rate, decimation transitionなどの名前で定義された数値を使って、
関数 firdes.low_pass(1,Samp_rate,Samp_rate/(2*decimation), transition)
と入力するとタップ係数を計算するようです(入出力値がfloat かcomplexかで関数が少し異なります)。何種類か数値を入れて試しましたが、当方が設定を間違っているのか原因かわかりませんが、ソフトがフリーズしたり音飛びが発生して思ったとおりに動きませんでした。このため他の文献に記載のある10や20という数値を入れてみました。一応動いていますが、気持ちの悪い方は調べてお使いください。


図7 「Frequency Xlating FIR Filter」動作説明用フローグラフ

DecimationのイメージはGNURadioのホームページにこの概念のイメージ図があります。図8が、周波数成分を見た場合の「frequency translation(周波数変換)」、「Decimation(間引き)」のイメージ図です。図8最上部の図が受信信号の周波数分析結果だと仮定します。図8の上から2番目の図は1番目の図の信号を左方向(周波数が低くなる方向)にずらしたものです。ずらしたというよりも回転させたというイメージであることがこの図でわかります。また、上から4番目の図がDecimationのイメージをあらわしています。注目する信号成分を中心部に移動させるために周波数シフトを行い、中心から外遠い部分を取り去ってしまうことで全体の処理しなければならない信号数を減少させているわけです。


図8 周波数移動(Frequency translation)、間引き(decimation)のイメージ図

「Frequency Xlating FIR Filter」ブロック前後での周波数やサンプリングレート、データ数の関係についてはつぎのようになります。
(1) 入力信号の中心周波数が「Center Frequency」欄に入力された数値の周波数に変換される。
(2) Deimationが設定されている場合はデータの数が減少する。
これをSample Rateで見ると
(ブロック出力のSampe Rate)
=(ブロックへの入力Sample Rate数)÷(Decimation欄の設定値)
フローグラフを作成するときにブロックを経過するに従いSample rateが変わっていくことに注意してください。

なお、「RTL-SDR Source」のSample rateは2.4MHzですが、最終ブロックの「Audio Sink」のSample rateは24kHz(製品によりますが、16kHzや32kHz、48kHzも選べます)です。いくつかの処理ブロックを経由しますが、最終的に2.4MHzを24kHzまで落とさないと音が出せませんので途中DecimationしてSample rateを低減していかなければなりません。この数値が一致しないとデータあふれや不足が起きて、スピーカーからボコボコという音が出たり、GNURadioのターミナルエリアに〇がたくさん並んだりします。そのような症状がでたときにはSample rateの不一致を疑ってください。

AM受信機

□AM受信機構成例(1)
FM受信機の構成とほぼ同じです。フロー図と動作画面をしめします。


図9 AM受信機フロー図


図10 AM受信機動作画面

なお、参考文献(1)には図9の構成とは別の構成方法が例示されています。詳しい説明は省略しますが、その理由はDCオフセットの問題があり、復調処理ができなくなってしまうとのことです。図9のフローグラフはとりあえず動いていますのでアマチュア無線家としてはOKかもしれませんが、問題があるとのことですので注意してご使用ください。

7MHz SSBレシーバ

GNURadioのHPにはたくさんの情報が記載されていますが、その中にSSB受信機の構成例を見ることができます。それらの構成例を参考にして作成したのが下図のフローグラフです。動作事例とともに掲載しておきます。


図11 SSB受信機フローグラフ

「(https://wiki.gnuradio.org/index.php/Simulation_example:_Single_Sideband_transceiver」より)

図11のフローグラフは他の回路と比較してブロックの数が多く、面倒な処理をしているようにみえますが、SDR技術を素直にフローにした構成方法です。もっと簡単な方法として、高橋知宏氏が記載されている構成例(1)はシンプルでわかりやすいものでしたので、高橋氏の構成例で作成してみました(図12、図13)。


図12 7MHz SSBレシーバフロー図


図13 7MHz SSBレシーバ動作画面

図13の動作画面はローパスフィルタの出力段の信号を「QT GUI Frequency Sink」で観測した図です。この出力の周波数は周波数変換されて本来の受信周波数とはことなるのですが、元の周波数との対応をつけて観測しています。7MHzまではLSBですので、14MHz以上の周波数信号の復調方法の変更のためにパラメータを変更する必要があるとおもいます。

GNURadioでの受信機構成例いかがでしょうか。この記事ではGNURadioの機能のごく一部しか説明できませんでしたが、まだまだ多くの機能を有しているようです。半田ごてで実際の回路を作成するのも楽しいですが、ソフトウェアをさわるのも別の楽しみがあります(これはソフトじゃないでしょうという声も聞こえてきそうですが・・・)

ハード、ソフトを問わず、「ものづくりやろう!」

参考文献

今回も参考文献として下記出版物,HPを参照させていただきました。
(1) 高橋 知宏:「GRCで広がるSDRの世界」,RFワールドNo44,pp7~pp91, CQ出版社, 2018.
(2) rapidnack, GNURadio電子工作 Vol.1 AM送信・受信編 Kindle版
(3) rapidnack, GNURadio電子工作 Vol.2 Embedded Python Block編 Kindle版

ものづくりやろう! バックナンバー

2021年10月号トップへ戻る

次号は 11月 1日(月) に公開予定

サイトのご利用について

©2021 月刊FBニュース編集部 All Rights Reserved. 発行元: 月刊FBニュース編集部