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

ものづくりやろう!

第四回 音声周波数帯信号のバンドパスフィルタの製作(2)

JH3RGD 葭谷安正

こちらの記事を印刷する(PDF 形式)

はじめに

前回に引き続き今回もGNURadioについて解説していきます。多少前回解説と重複しますがご容赦ください。

GNURadioは非常にたくさんの処理機能をもっていますが、この解説でGNURadioのすべてを解説することはできません(わたしの力量もすべてを解説できるほどありません)。またどんなことができるのかを一から説明していては学習効率が非常に悪くなってしまいます。そこで、この解説記事ではGNURadioのチュートリアルに記載されている簡単なフローグラフ例を使い、その中で使われているブロックの解説を中心に説明していきます。これを発展させた例を示してGNURadioの一部の機能を紹介していきたいと思います。

GNURadioというのは、前回の記事でも記載しましたように「ソフトウェア無線の信号処理系」のことです。もっと具体的にいうと、「高周波信号の発生、フィルタ、変調や復調、増幅などの信号処理、処理信号のオシロスコープ状の表示やFFT表示、ウォーターフォール表示などの信号表示機能をコンピュータ上で実現するソフトウェア」です。こんなにいろいろなことができるのですが無償で利用することができます。このGNURadioを使うためにはPython言語やC言語の知識、無線の知識プログラミングの知識や経験が必要となりますが、このままでは非常にハードルが高いソフトウェアです。私も尻込みします。しかしこのGNURadioをそのまま使うのではなく、あるツールを使うことでプログラミングが簡単にできるようになります。そのツールというのがGNURadioの機能をグラフィックユーザインターフェース(GUI)で提供し、プログラミングを補助してくれる[GNURadio Companion]、略して[GRC]です。GRCを使えば、GNURadioを使うのに必要なPython言語やC言語の知識は必要ありません。あらかじめGNURadioで準備されている機能ブロックをマウスを使って並べ、このブロックの間を結線することで信号処理の様々な機能を実現することができます。この解説では以下で[GNURadio]と記載していますが、正確にはGRCのことを指していると思ってください。

GRCを使って簡単な信号処理プログラムを作っていきましょう。ここで大切なことです。GNURadioを使えばさまざまな信号処理をパソコン上で行えますが、パソコンへのアナログ信号の読み込みや、GNURadioで処理された信号をパソコン外部に入出力するためには、GNURadioに対応したハードウェアが必要です。例えば、この解説記事の中でバンドパスフィルタをGNURadioで作成しますが、無線機から出力されたアナログ信号をGNURadioで処理するためにはデジタル信号に変換するためのハードウェアがパソコンに装備されていなければなりません。幸いほとんどのパソコンにはサウンドボードが実装されていますので、このサウンドボードを使って処理したいアナログ信号をデジタル信号に変換し、GNURadioで処理させることができます。サウンドボードは音声帯域周波数の信号を入出力することができますが、高周波信号の入出力はできません。GNURadioではAMやFMなどの高周波信号の変調やその復調などの処理もできます。しかしパソコン内部でGNURadioを使って変調処理を施した信号を電波として飛ばすためにはデジタル信号をアナログ信号に変換するハードウェア(D/A変換装置)や電力増幅器などのハードウェアが必要になってきます。その代表例が[HackRF One]や[USRP]他何種類かあるようです。これらのハードウェアのことをSDRフロントエンドと呼んでいます。無銭家の私にはどちらも少し値が張りますし縁がありませんでした。また、これを使って電波を飛ばすとなると技適に適合しているのかも考慮する必要があるのかもしれません。幸い、電波を発射せず受信だけに的を絞れば安価なドングルタイプの広帯域受信機のRTL-SDRがGNURadioで使えます。GNURadioの存在を初めて知ったころに、“ジャングル”でRTL-SDRを購入し、それをGNURadioのフロントエンドとして使ってみました。ネット上に掲載されている情報を参考にHF(コンバータが必要でした)、VHF、UHF帯の受信機を見よう見まねで作成しましたが、音が出てきたときには感激しました(中学生の頃、真空管の並四ラジオを作成したときほどは感激しませんでしたが Hi)。

GNURadioの起動、開発環境

GNURadioの起動はパソコンの[スタートボタン]を押して、図1のよう[GNURadio Companion]を選択、クリックします。


図1 [GNURadio companion]を選択

コンソール上を処理が流れ、その後図2のようにウィンドウが表示されます。


図2 起動時のウィンドウ: オープニング画面

ウィンドウの各部の役割を記載します。
(1) ツールバー
ツールバーは、ファイルのリードやセーブ、フローグラフからPythonコードを出力(生成ボタン)したり、プログラム実行、停止などの操作を実行します。

(2) ワークスペース
ワークスペースは、私たちが信号を処理するのに必要なソフトウェアを作成するために、ライブラリからブロックをもってきて並べ、それらのパラメータを変更してブロックを線で結び、処理の流れを表現するためのエリアです。このエリアに書いた図をフローグラフといいます。フローグラフを書いた後、ツールバーの生成ボタンを押すと、パラメータの不足や処理上のエラーがなければその処理を実行するためのPython言語のコードが自動生成されます。プログラムの実行するためには、ツールバー上のプログラム実行ボタンを押すことで処理プログラムが動きます。ライブラリ上のブロックをワークスペースに置くためには、ライブラリからブロックを探し、そのブロックの名前をクリックしてワークスペースにドラッグするか、または名前をダブルクリックしてワークスペースに自動的に配置します。

(3) ライブラリ
ライブラリには、GRCにインストールされているたくさんの機能がブロックとして格納されています。GNURadioでフローグラフを書くためにはどんな部品がなんという名前でライブラリに入っているのかを知る必要があります。初めて触るときはまったくわかりませんが、GNURadioのチュートリアルの例を自分で入力するとだんだんとわかってきます。しかしあまり使わないブロックや初めて使うブロックはどこにあるのかわかりません。このようなときはライブラリエリアの上にある虫眼鏡のアイコンをクリックするかCtrl + fを入力すると、キーワードを入力エリアが開きますので、キーワード入力することでそのキーワードに関係するブロックが表示されます(図3 ライブラリの検索)。


図3 ライブラリの検索

部品を見つけるときに覚えておくと比較的早く部品を見つけることができる単語は[Source]と[Sink]です。信号発生器などの信号源は出力端子のみを持っていますが、このようなブロックは[Source]というカテゴリに属します。電気回路のブロック図で普通左端に書かれることが多い装置ですね。一方、オシロスコープなど出力装置や表示装置、外部端子への出力などは[Sink]と検索エリアに入力すると見つけることができます。電気回路のブロック図で普通右端に書かれることが多い計測器類が[Sink]に相当しますね。試しに、検索エリアに[Source]と入力しました。図4のように20件程見つかりました。この中に[Audio Source]というのが見えます。コンピュータに音声信号を入力するときに音声入力端子を使用しますが、この[Audio Source]をワークスペースエリアに配置し、使用するデバイス名などのパラメータ設定することで具体的な入力端子を指定することができます。


図4 Sourceブロックの検索結果

(4) ターミナルエリア
ターミナルエリアはファイルパス情報やエラー情報などが表示される部分です。この部分を操作することはありません。

(5) 変数エリア
変数エリアでは、ワークスペースに置かれた変数ブロックの値や変数名の変更、削除などをこの場所で行うことができます。ワークスペース上に置いた変数ブロックをダブルクリックして変更することもできます。

それでは以下の例をもとにGNURadioで信号処理のプログラムを作成しましょう。

フローグラフ例1

GNURadio内での信号発生とその表示



[処理概要]: GNURadio内で1kHzの正弦波を発生させ、発生させた信号をそのままGNURadio内のオシロスコープで表示させます。
(1) 外部からの入力: なし
(2) 外部への出力: なし
(3) ソフトウェアでの処理:
a. GNURadioで1kHzの正弦波信号を発生
b. GNURadioで発生したa.の信号をオシロスコープのような表示ブロックを使用して表示



この例はパソコン外部からの入力や外部への出力のない、GNURadio内で完結した処理です。

[作成手順]
(1) GNURadioを起動
図5のように[スタート]-[GNURadio Companion]を押して起動します。


図5 起動時画面

過去にGNURadioを起動したことがあれば図5のようには表示されず、最後に編集したフローグラフが表示されることがあります。

(2) ブロック配置: 起動時画面(図5)のワークスペースに[Signal Source]と[QT GUI Time Sink]の2つのブロックを配置します。GNURadioを起動時に2個のブロックが自動的に設定されています。1つは、[Options]ブロック、もう1つは[variable]ブロック(変数ブロック)です。[Options]ブロックのタイトルの色が赤色になっていることに注意してください。後ほど記載しますが、パラメータが不足(またはエラー)していることを表しています。具体的には[id]番号をいれなければなりません。

この例で作成したい内容は、GNURadio内部で1kHzの信号を発生させその信号をそのままオシロスコープに表示するわけです。信号発生に必要な1つめのブロックは信号発生器です。図5の右にあるライブラリエリアからシグナルジェネレーターを持ってきます。シグナルジェネレーターはどこにあるのかわからない場合は、ライブラリエリア上部にある虫眼鏡印をクリックして[Signal]と入れて検索します。この単語を含むブロックが出てきますのでその中から選びます。今回は[Waveform Generators] 内の[Signal Source]ブロックを選択します。たくさんのブロックがありますので、どのブロックがどういう働きをするのかを分かるまでは一体どれを使えばいいのか分からなくなると思いますが、それは徐々に学んでください。

ブロックを並べて置いていきます。もし位置を変更したい場合にはそのブロックをクリックして移動したい位置までドラッグします。


図6 ブロックの配置

(3) 結線: [Signal Source]ブロックの右端out端子と[QT GUI Time Sink]ブロックの左端in端子を順番にクリックすると結線されます。結線を間違ったときは、削除したい結線をクリックすると青色になって編集状態になりますので、キーボードの[Delete]ボタンを押します。

(4) パラメータ設定: この例ではすでに設定されている値(default値)をそのまま使用します。

出来上がったフローグラフを図7に示します。


図7 ブロック結線

(5) フローグラフの保存: 出来上がったフローグラフを保存します。
[File]-[Save As]を選び,ファイル名を入力します。ファイル名の拡張子は[grc]です。格納場所に[c:\]などを選択すると左下の[ターミナル]エリアに"Error: Cannot save: C:\Ex01.grc"とセーブできない旨のエラーメッセージが出て書き込めていないことがあります。確認しておいてください。

(6) 実行: [Generate]ボタンを押すとフローグラフからPythonのコードを作成します。
図7のフローグラフを作成後[Generate]ボタンを押すと[ターミナル]エリアにエラーメッセージが発生しています。

エラーの内容を日本語に翻訳すると以下のような内容です。
「警告: このフローグラフにはフロー制御がない可能性があります。オーディオまたはRFハードウェアブロックが見つかりません。CPUの過負荷を回避するために、フローグラフにMisc-> Throttleブロックを追加します。」

[Throttle]ブロックを入れたほうがいいですよ、との警告です。GNURadioのマニュアルで[Throttle]を調べてみると、
「スロットルブロックは、フローグラフにレート制限ブロック(通常はハードウェア(SDR、スピーカ、マイクなど))が含まれていない場合にのみ使用する必要があります。サンプルのレートを正確に制御することは意図されておらず、効果的でもありません。これは、サンプルクロックに関連付けられたソースまたはシンクによって制御する必要があります。例えば、USRPまたはオーディオカード。Throttle Blockは通常は、ハードウェア以外のソースブロック(Signal Sourceなど)の出力に直接接続され、そのソースブロックがサンプルを作成する速度を制限します。」

とのことです。要は、[Throttle]ブロックを入れて信号の流れが指定されたレート(32k: 1秒間に32kのデータを流す)で流れるようにすればCPUに過負荷がかからないとのことです。警告メッセージにしたがって[Throttle]を入れたものが図8です。


図8 完成したフローグラフ

ファイルセーブ後、[Generate]ボタンを押すとPythonのコードがセーブされ、[ターミナル]エリアにはPythonのコードの出力先情報が表示されます。

Generating: 'D:\\GRC\\Ex01.py'

さらに,[Execute]ボタンを押すと

Executing: C:\Program Files\GNURadio-3.8\tools\python3\python.exe -u D:\GRC\Ex01.py
gr::pagesize: no info; setting pagesize = 4096

>>> Done (return code 1)

と実行した旨の表示がされました。なお、Pythonのコードが出力されるとそのコードをPythonプログラムから実行することもできます。実行結果は図9のように、信号波形が表示されます。


図9 実行結果

実行の停止は、[Execute]ボタンの右にある[Kill]ボタンを押すことで実行しているプログラムを停止させることができます。

[実行結果について]
フローグラフ例1の実行結果(図9)を見てみましょう。このブロックは、GNURadio内で1kHzの正弦波を発生させ、発生させた信号をそのままGNURadio内のオシロスコープで表示させる処理です。1kHzの正弦波を1つしか発生させていないのに図9では正弦波が2つ見えます。これは作成したブロックの信号をすべて複素数として処理したためです。フローグラフの[Signal Source]ブロックをダブルクリックしてパラメータがどのように設定されているのかを確認します。図10のように[Output Type]が[complex]になっています。これを[float]に変更します。ほかの[Throttle]ブロック、[QT GUI Time Sink]ブロックについても[Type]パラメータを[float]に変更します。


図10 パラメータ設定内容

パラメータ変更後,再度実行すると図11のように正弦波が一つになります。


図11 実行結果(データタイプ floatの場合)

[エラーについて]
・ブロックタイトルの色によるエラー箇所の表示
結線前と結線後のブロックタイトルの色に変化があります。結線前はブロック内の文字がどちらも赤色になっています。一方、結線後は両ブロック名とも黒色に変わっています。これは、赤色のときはそのブロックに対してのパラメータ設定や結線などがまだ不足している時、エラーの時です。同時に[ツールバー]上の[エラー表示ボタン]も赤色になっています。しかし結線が行われるとブロックタイトルは黒色になりますが、[エラー表示ボタン]は赤色のままです。


(a)結線前


(b)結線後
図12 ブロックの結線の前後

どこにエラーがあるのかというと、図13のように左上部にある[Options]ブロックのブロックタイトル文字が赤字になっています。このブロックをダブルクリックして、その中の赤字になっているパラメータ[id]に(図14参照)、例えば[Ex01]と入力するとエラーが消えて赤字の[id]が黒字になります。このように単純なエラーはブロックのタイトル文字の色を見ることで判別できます。


図13 [Options]ブロックのエラー


図14 パラメータ[id]がエラー箇所

[データタイプ不一致によるエラー]
エラーの原因として、データタイプの不一致もよく起こります。信号処理の分野では複素数[complex]や実数[float]が使われますが、GNURadioで使用されている処理ブロックのdefault値が複素数や実数が混在しており、ブロックの入出力のデータタイプが異なることに気づかずに接続してエラーが発生することがあります。このような場合矢印の色が赤にかわっていますので、色を頼りにエラー箇所を見つけてください。図15は上記例の[Throttle]ブロックのデータタイプを[complex]タイプに変換した場合のエラー状況を示しています。矢印が赤色になっています。ツールバーにある[エラー表示ボタン]も色濃くなっているので、[エラー表示ボタン]をクリックすると下図のように[Errors and Warnings]ウィンドウが表示されエラー箇所が表示されます。[Throttle]ブロックを中心に入出力側にある2つのブロックでサイズが整合していないとのメッセージがでています。これらの情報を頼りにエラー修正を行っていきます。


図15 結線色によるエラー箇所の確認

それでは次の例に移りましょう。

フローグラフ例2

音声信号をマイクから入力し、その信号をGNURadioのオシロスコープ上に表示するとともにスピーカに出力する。また、信号の増幅機能を持たせる。



[処理概要]
(1) 外部からの入力:マイク入力 -> サウンドデバイス
(2) 外部への出力:サウンドデバイス -> スピーカ
(3) ソフトウェアでの処理:
a.入力した信号を増幅
b.増幅した信号をGNURadio上のオシロスコープに表示



前回の記事では,下図16のような処理フローを紹介しました。


図16 “Audio Source”と“Audio Sink”の結線

今から作成するフローグラフ例2は、図16の機能を少し拡張したフローグラフになります。

[パラメータ設定]
必要なブロックを並べたフローが図17です。結線が赤色ですので、設定にエラーがあります。 [Audio Source]と[Audio Sink]ブロックの端子色が橙色であるのに対して、[Multiply Const]と[QT GUI Time Sink]ブロックの端子色は青色です。これは[Audio Source]と[Audio Sink]のデータタイプが[float]であるのに対し、[Multiply Const]と[QT GUI Time Sink]ブロックのデータタイプが[complex]になっているためです。[Multiply Const]と[QT GUI Time Sink]ブロックをそれぞれダブルクリックして[IO Type]や[Type]を[float]に設定するとエラーが消えました。


図17 フローグラフ(結線まで)

次に[Audio Source]のパラメータ設定をみましょう。[Audio Source]や[Audio Sink]ボックスのパラメータ設定をすることでどのようなことがおきているのでしょうか。パソコンのサウンドボードにマイクを接続し、そのマイクからパソコン経由でGNURadioにデータを取り込む状態を想定してください。図18はGNURadioとパソコン、周辺装置の結線状況を表した概念図です。


図18 GNURadioと周辺装置との関係

周辺装置はパソコンのUSB端子などを通じて接続され、パソコンのOSがこれらの機器を認識し、必要に応じてドライバソフトを設定します。GNURadioの[Audio Source]や[Audio Sink]ボックスは、図18のようにパソコンに接続された装置とのデータ受け渡しをします。どの装置とデータの受け渡しを行うのかを明確に指示する必要があります。そのために[Device name]などのパラメータを設定しています。サウンドボードと連携させるためのボックスが[Audio Source]や[Audio Sink]です。[Audio Source]のパラメータ設定を行うためには、ブロックをダブルクリックします。図19のようにパラメータ設定画面が開きます。


図19 Audio Source パラメータ設定画面

図19では、[Device Name]が空欄になっています。ここに何を入れればいいのでしょうか。図19の上部右端に見える[Documentation]タブを押すと[Audio Source]の説明文があり次のように記述があります。
Leave the device name blank to choose default audio device. ALSA users with audio trouble may try setting the device name to plughw:0,0(デフォルトのオーディオデバイスを選択するには、デバイス名を空白のままにします。オーディオに問題のあるALSAユーザーは、デバイス名をplughw:0,0に設定してみてください。)

デフォルトのデバイスを使用する場合はデバイス名を空白のままにするそうです。複数のオーディオデバイスがパソコンに接続されている場合は、接続したいデバイスをデフォルトデバイスに設定しておけば、あとは[Device Name]を空白にしておいてもよいのです。[Audio Source]ブロックを複数配置して、複数端子から音声入力を取り込みたい場合などは、デフォルトデバイスは1つしか指定できませんのでデバイス名で指定せざるを得ません。デバイス名で記述する場合は、[Documentation]に記載されている説明のように[plughw:0,0]などと入れてみましたが、WindowsのGNURadioでは認識してくれませんでした。いろいろ試した結果、日本語で書かれているデバイス名をWindows上の設定で半角英数字に設定しなおし、その名前を[Device Name]に入れることで動作しました。デバイス名が“マイク”などの全角文字や漢字にするとだめでした。

筆者の環境下でサウンドデバイスをUSB端子に接続すると、入力デバイス名として[マイク(5- USB Audio Device)]という名前になっていました。図20のように、[デバイスのプロパティ]からデバイス名を、例えば[Mic (5- USB Audio Device)]と変更し、変更したデバイス名をダブルコーテーションで囲って[Device Name]に記載しました。なお、[Device Name]欄にデバイス名を記載するときは、スペースも含めて変更した名前を一字一句異なることなく記載してください(筆者はデバイス名の中にあった空白を省略して試した結果、日曜日の午後半日を無駄に過ごしてしまいました)。



図20 デバイス名の変更

[ブロックのパラメータ]
[Audio Source]と[Audio Sink]のパラメータを下図21、図22のように設定しました。(細かいことですが、文字[ Mic ]とかっこ[ ( ]の間に空白があります。この空白を省略するとマイクから音声を取り込むことができませんでした)


図21 [Audio Source]の設定


図22 [Audio Sink]の設定

[実行結果]
サウンドデバイスの入力側にマイクを接続し、出力側にイヤホンを接続しました。その後、[Execute]ボタンを押してプログラムを実行し、マイクに向かって声を出すと、USBに挿したイヤホンから少し遅れて私の声が聞こえるとともに、パソコン画面上には図23のような波形が表示されます。また、図23の上部にある[Vol]をスライドすることで音量調節ができました。


図23 実行結果

[[Variable]ブロックについて]
[Variable]ブロックは変数を定義するために使います。プログラム言語などでは変数に値を代入した、代入された変数を使って参照したりします。例えば、i , k を変数とすると
i = 1
k = i + 3

と記述することで変数 i には 1 が、変数 k には 4 が入ります。GNURadioでは変数の定義はブロックで行います。変数が多くなるとワークスペースに変数ブロックがたくさん並んでいきますが仕方がありません。図17上の[Variable]ブロックをダブルクリックすると次のようにプロパティボックスが出てきます。


図24 [Variable]ブロックのパラメータ設定値

これはプログラミング言語で言えば
samp_rate = 32000
という変数への代入と同じ意味です。参照の仕方ですが、図17の[QT GUI Time Sink]ブロックをダブルクリックすると、Type欄に[Sample Rate]という文字があり、その右に[samp_rate]の文字が入っています。


図25 [QT GUI Time Sink]ブロックのパラメータ設定値

この[samp_rate]は「Variable]ブロック内で定義されている変数に相当しており、[samp_rate]と記載すると32000がType[Sample Rate]に入ります。このように多くのブロックで共通の値を設定する必要がある場合は[Variable]ブロックに変数名と値を定義し、その使用は変数名を記載することで参照できます。[Variable]ブロックで定義された変数とその値はGRCウィンドウ下部にある[変数]エリアに表示され、またこのエリアで変更することもできます。

[Sample Rate について]

サンプリングとは、アナログ信号をデジタル信号に変換(AD変換)することで、日本語では標本化と呼びます。1秒あたりのサンプル数をサンプルレート、サンプリングレート、サンプリング周波数などと言います。1秒間に行うAD変換を表すため単位にはHz(ヘルツ)が用いられます。ナイキストのサンプリング定理というのがありますが、これによるとサンプルレートは標本化対象信号の信号帯域幅の2倍以上の周波数が適切とされています。大部分の人は20000Hz(20kHz)以上の周波数は聞こえませんので、その2倍の40000Hz(40kHz)以上でサンプリングしてデジタル化すれば、その信号をアナログ信号に再変換しても元の信号が復元されます。音楽CDのサンプルレートが44.1kHzであるのもこのあたりに理由があります。

最近販売されているサウンドボードはサンプルレートが32kHzや44.1kHz,48kHzに可変できますが、[Audio Source]ブロックのサンプルレートには前記数値を含め、複数のサンプルレートを選ぶことができます。サンプルレートが高ければ高いほど高品質になりますが、データ量も比例して増えます。そのため、手持ちのパソコンが古い場合やストレージ容量によってはサンプルレートを調整する必要があります。

GNURadioでは処理内容によってはブロックを経て信号が処理されると途中でサンプルレートを異なる値にしなければならないことがあります。このような場合信号処理の文献を紐解く必要があります。また、サンプルレートの設定がまちがっているためエラーが発生することもありますので、気をつけておいてください。

さて、前回の解説で予告していましたバンドパスフィルタ(BPF)を作成していきます。最初に、「フローグラフ例3」でBPFの動作性能を確認するため、外部信号をいきなり取り込むのではなく、GNURadio内部で2つの周波数の信号を発生させ、その加算信号をBPFを通過させ調整をおこないます。その後、「フローグラフ例4」で、「フローグラフ例3」で作成したフローグラフの入力部分を[Audio Source]で置き換えて外部信号のBPFを実現します。

フローグラフ例3

内部発生信号からの特定周波数成分の抽出(バンドパスフィルタ)



[処理概要]
(1) 外部からの入力信号: なし
(2) 外部への出力信号: サウンドボード経由スピーカやイヤホンへの出力
(3) ソフトウェアでの処理:
a. 内部生成合成信号の周波数成分表示(FFT表示)
b. バンドパスフィルタ(BPF)による特定周波数信号の抽出 c. BPF通過した信号の周波数成分表示(FFT表示) BPFの通過周波数を次のようにします (CW信号の分離を想定していますので、バンド幅を狭く設定できるようにしてあります) 中心周波数 : 700Hz(固定) 低域カットオフ周波数: 650Hz(可変:500Hz~690Hz) 広域カットオフ周波数: 750Hz(可変:710Hz~900Hz)



作成したバンドパスフィルタのフローグラフを図26に示します。


図26 BPF(内部信号合成)

[フローグラフ説明]
・信号合成
左から2列目に3つの[Signal Source]を配置しました。それぞれの周波数は上から、700Hz(固定)、650Hz(可変)、750Hz(可変)です。これらはすべてデータタイプを[float]で指定しました。これら3つの信号を[Add]ブロックに入力することで合成信号(信号電圧の時間毎の加算値)を作成することができます。

・周波数を可変方法([QT GUI Range]ブロックの利用)
2つのブロックの周波数を可変するため[Signal Source]の左側に配置した[QT GUI Range]で周波数を可変できるようにしました。


図27 QT GUI Rangeのプロパティ

変数の値を[F600variable]とし、デフォルト値を650Hzとしました。可変範囲を500Hzから690Hz、増減数が10Hzとなるように設定しました。周波数を可変するために[Widget]でカウンタとスライダを選び、マウスで周波数を変化できるようにしました。650Hzの発信機(3つある[Signal Source]の上から2番目のブロック)の周波数をスライダで変化させるためには、このブロックの[Frequency]プロパティに[F600variable] (“[“,”]”は入れません)と入力します。750Hzの発信機についても同様です。

・バンドパスフィルタの配置([Band Pass Filter]ブロックの利用)GNURadioにはLow Pass Filter、High Pass Filter、Band Pass Filterなどのブロックが準備されていますので、ライブラリから探してワークスペースに置きます。中心周波数を700Hzとしてカットオフ周波数を設定します。700Hzの±50Hzをカットオフ周波数に設定しました(Low Cutoff Freq:650、High Cutoff Freq:750)。

[BPF出力のFFT表示]BPFの性能を確認するため、BPF通過後の信号の周波数成分を確認するためFFT表示用ブロックを挿入しました。図26の右端にある[QT GUI Sink]ブロックが挿入したブロックです。

[実行結果]
結果をFFTで表示してみました。650Hz、700Hz、750Hzの信号がみえています。


図28 BPF実行結果(Low Cutoff Freq:650Hz、High Cutoff Freq:750Hz)

700Hzの信号と、ほかの650Hz、750Hzの信号とのレベル差は6dB程度です。またカットオフ周波数を680Hz,720Hzに設定すると、650Hz、750Hzの信号とのレベル差は68dB程度に改善されました。


図29 BPF実行結果(Low Cutoff Freq:680Hz、High Cutoff Freq:720Hz)

次に、BPFへの入力レベルとBPF通過後の出力レベルを比較してみました。[Add]ブロックの出力に[QT GUI Sink]ブロックを接続しFFT表示した結果、BPF通過前と通過後で700Hz信号のレベルが20dB程度減衰していることがFFT表示で確認できました(図30)。


図30 BPF減衰特性(上図: BPF入力信号、下図: BPF出力信号)

フローグラフ例3を少し変形して外部入力信号のBPFを作成してみます。

フローグラフ例4



外部入力信号からの特定周波数成分の抽出(バンドパスフィルタ)

[処理概要]
(1) 外部からの入力信号: サウンドボード経由、オーディオケーブルによる無線機の音声周波数帯域のアナログ電気信号
(2) 外部への出力信号: サウンドボード経由スピーカやイヤホンへの出力
(3) ソフトウェアでの処理:
a. 入力信号の周波数成分表示(FFT表示)
b. バンドパスフィルタ(BPF)による特定周波数信号の抽出 c. BPF通過した信号の周波数成分表示(FFT表示)



この機能を持つフローグラフは、例3のフローグラフの入力部を[Audio Source]ブロックで置き換えることで実現できます。図31が外部信号を入力するフローグラフです。


図31 BPF(外部入力、外部出力)

無線機のPHONES端子にオーディオケーブルを接続し、パソコンのオーディオデバイスに接続してCW信号を取り込んでみました。耳計測ではBPFの効果が実感できますが定量的計測をおこないませんでした。周波数の近接したモールス通信を見つけて効果の実機評価を行おうとしましたがなかなか見つけることができませんでした。実機評価は今後の課題としたいとおもいます。

GNURadioの情報入手先(サイト)

GNURadioの情報は今ではネット上にたくさん掲載されています。自分の目的に合わせて検索結果からチョイスするのが早いかもしれません。次のURLはGNURadioの総本山です。英語で書かれているのでちょっと大変ですが、ブラウザで日本語に翻訳すれば少し訳がおかしいところもありますがニュアンスはつかめるとおもいます。



・GNURadioの情報サイトのトップ
https://www.gnuradio.org/
・GNURadioのドキュメント
https://wiki.gnuradio.org/index.php/Main_Page
・GNURadioのチュートリアル(図32)
(Tutorial:アプリケーションソフトなどの基本的な操作方法を覚えるための教材のこと)
https://wiki.gnuradio.org/index.php/Tutorials



チュートリアルにはGNURadioやSDR、DSPやGNURadioの使い方などがしめされています。英語版ですが、このチュートリアルを日本語に翻訳して参考にされることをおすすめします。

チュートリアルの中に、「これらのチュートリアルは単にガイドとして意図されており、何かを学ぶための最良の方法はそれを試すことです。」と書かれています。もしGNURadioに興味が湧きましたらぜひ動かしてみてください。


図32 GNURadioチュートリアル(Chrome上で日本語に翻訳したもの)

今回はここまでで終わらせていただきます。

【参考文献】
(1) 高橋 知宏, GRCで広がるSDRの世界, CQ出版, 東京, 2018.
(2) rapidnack, GNURadio電子工作 Vol.1 AM送信・受信編 Kindle版
(3) rapidnack, GNURadio電子工作 Vol.2 Embedded Python Block編 Kindle版
3冊ともフローグラフを作成するのに非常に参考になりました。

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

2021年9月号トップへ戻る

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

サイトのご利用について

©2024 月刊FBニュース編集部 All Rights Reserved.