理乃美

ソフトとハードと論理の覚え書き

GNURadioでAM変調

2021-01-24 11:02:20 | RF

Jetson nano上でGNURadio 3.7を使って実験した記録。今回は、AM変調。

GNURadioでのAM変調はとてもシンプル。最大振幅でも過変調にならないようオーディオ信号を半分にしてキャリア成分に相当する定数 0.5 を加え、複素信号に変換するだけ。アナログ回路だと、トロ活に「DBMでAM変調できることはあまり知られていませんが...」(*1)と紹介されている方法に相当する。

Flow graphは次のとおり。なお、44.1KHzサンプリングのオーディオ信号をPlutoSDR Sinkに渡す2.205MHzサンプリングに Rational Resamplerで変換しなければならないが、Complexの変換よりFloatでの変換の方が処理が軽いだろうと考えてここに置いている。

アナログ回路の場合、DSB信号を作ってそこにキャリアを加える方法もある。キャリアが0Hzだから、DSBを作ったあとに定数を足しこむ順番になる。Flow graphにすると次のとおり。

アナログ回路だと両手法でだいぶ実装が異なるが、GRC上で実現する分にはブロックの順序が入れ替わった程度の違いでしかない。

AM 送受信の全体のflow graphはこのとおり。上半分はAM変調波を作ってPlutoSDR Sinkに流し込める複素信号を作る部分。下半分はPlutoSDR Sourceからの複素信号からAMの復調をする部分で、左下で正弦波をかけている部分はTx Rxでのチューニングのずれを模擬している。

AMの復調は、複素信号の絶対値を取ったあとキャリアによる直流成分をローカットフィルタで取り除く方法にした。こうやって、flow graphのロジックが正しいこと、実時間で動作可能なことを確かめてからPlutoを使った実験にうつった。図の最下部のログに aU とうのがいくつか並んでいる。これが、オーディオ信号の出力に対して処理が追い付かずにアンダーランが起きた記録。それぞれのブロックの初期化やらなにやらで処理が渋滞するのだろうか、フローをスタートさせた直後が少しアンダーランが発生するのは致し方ないようだ。

 

1)  山村英穂, 改訂新版 定本 トロイダル・コア活用百科, p285, 2006 CQ出版株式会社, ISBN4-7898-3067-5

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

GNURadioでSSB変調 - フィルター方式

2021-01-24 00:10:37 | RF

Jetson nanoでGNU Radio 3.7 を用いて実験した記録。今回は、フィルタを使ったLSBの生成実験。

アナログ回路では、DBMでDSBを生成したあとXtalフィルタでUSB/LSBだけを通して取り出す、というのが定番。これをGRCで行う。

ただ、アナログ回路のSSBジェネレータだと、例えば搬送波9MHzのDSBを作り9MHzで通過帯域幅 3KHzのXtalフィルタに通すが、それをそのままGNURadioのフィルタで実現しようとしたってできない。その代わり、数値計算なら低い周波数でもOKなので、搬送波 0 HzのDSBを作り複素係数のバンドパスフィルタを通して -3KHz~-100HzのLSBを取り出す、といった芸当ができる。

Hilber フィルタモジュールを使ってSSBを生成したときの、サンプルレートを下げたメリットの経験も反映して作り直したflow graphがこちら。二つあるバンドパスフィルタの2つ目が黄色なのは、バイパスする設定になっているため。

44.1KHzサンプリングの疑似音声ファイルを100-2.7KHzのバンドパスフィルタに通したものをソースに、フィルタでLSBを取り出した結果のFFTはこちら。

実用的には十分と思うが、さらにバンドパスフィルタを2段重ねにするとこうなる。

なお、実験した全体のflow graphは以下のとおり。上側は LSBを生成してPluto Sinkへ流し込める複素信号を生成する部分。下側はPluto Sourceからの複素信号からダイレクトコンバージョンでオーディオ信号を得る受信部で、左下の正弦波をかけている部分は送信側と受信側の周波数がすこしずれることを模擬している。

 

疑似音声信号は、CQ出版社のサイトからRFワールド誌 No42の記事関連ファイルとしてダウンロードできるtest_signal.wav ファイルを使用。(https://www.rf-world.jp/bn/RFW42/RFW42P.shtml)

 

 

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

GNURadioでSSB変調 - Hilbert変換

2021-01-23 23:05:00 | RF

Jetson nano に GNURaido 3.7 の組み合わせで実験した記録。

SSB変調の方法はいくつかあるが、今回は Hilbert フィルタブロックを使う方法の実験。アナログ回路でいうとPSN方式とやっていることは同じ。

ヒルベルト変換で複素信号の虚部が実部から位相が90°遅れた値を取るようにすることでUSBを生成している。また、虚部の符号を逆にすればLSBにになる。

Flow graphで書くとこうなる。

では、実際に生成される信号はどうだろうか。

サンプルレートはオーディオデバイスで標準的な44.1KHzを使用。疑似音声データに100Hz - 2.7kHzのバンドパスフィルタをかけたものをソースにして、LSBを生成し、FFTで見てみる。

Hilbert変換のタップ数をデフォルトの65から200に増やして試した結果がこちら。

低域に逆サイドの漏れが見られる。もちろん、タップ数がデフォルトの65だと話にならない。タップ数を520に増やした結果はこちら。

かなり改善されたが、もともと帯域を100Hzからと欲張っているので低域の漏れがまだちょっとという感じ。だが、タップ数を増やせば必要な計算量が増える訳で、むやみに増やして良いものではない。

ここで落ち着いて考えてみる。サンプルレートは44.1KHz. つまり、20KHzのオーディオ帯域があって、それ全体をヒルベルト変換している。でも実際に必要なオーディオ帯域は3KHz. それ以上の部分は、存在しない信号を無駄に変換計算している事になる。なら、サンプルレートを下げれば無駄が減って性能が上がるだろう。そこで、サンプルレートを1/5 の 8.82 KHzに下げて実験してみた。

疑似音声データに100Hz - 2.7kHzのバンドパスフィルタをかけた44.1KHzサンプリングの音声信号をRational Resampler で 8.82 KHzサンプリングの信号にして200タップのHilbertに通した結果がこちら。

逆サイドへの漏れが断然良い。タップ数が520だとこうなる。

ということで出来上がった全体のflow graphがこちら。上側が音声信号をHilbert変換してPlutoSDR Sinkに入力できる複素信号を作る部分。下側は、PlutSDR Sourceからの複素信号をダイレクトコンバージョンでオーディオ信号にする受信部分で、左下で正弦波をかけている部分は送信機と受信機の周波数ずれを模擬している。こうやって実験しておけば、GRC側の不具合、例えば処理が重くて実時間に追いつかない、などを先に見つけることができる。

 

疑似音声信号は、CQ出版社のサイトからRFワールド誌 No42の記事関連ファイルとしてダウンロードできるtest_signal.wav ファイルを使用。(https://www.rf-world.jp/bn/RFW42/RFW42P.shtml)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PlutoSDR: アナログRF変調波形の観測

2021-01-22 23:34:55 | RF

ADALM-PLUTOとGNU Radio 3.7の組み合わせで、実験をしている。今回は、出力波形をスペクトラムアナライザで見る実験の記録。

GCRでDSB/AM/SSB変調のフローグラフを組み、疑似音声信号をPlutoSDRから送信し、その信号をスペクトラムアナライザで観察した。

周波数は、438.500000 MHz. 実際のところは 438.4971 MHz 付近。PLUTOの周波数基準はただの表面実装のクリスタルモジュールなのでこんなものだろう。

まずは、DSB.

RBW 30Hzで観察したスペクトラムとGRCでPlutoSDRに流し込んだIQ信号のスペクトラムは次のとおり。(スペアナのセンター周波数があっていないのはご愛敬 )

お次は、AM変調

DSBと比較してみると、搬送波にエネルギーを取られている分、左右に広がっている音声信号を運んでいる成分のパワーが落ちているのが見て取れる

ちなみに、フローグラフは以下のとおり。最大音量(±1.0)で100%変調となる設定。

次は、Single SIde Band (LSB)。

SSBの生成方法は複数あるが、まずは DSBを生成したのちフィルタで片側を切り出す方法。アナログ回路なら一番普通の方法だろうか。

使ったフローグラフとPlutSDRに送り込んだ信号のFFTは次のとおり。二つ目のバンドパスフィルタは黄色表示(バイパスされている)ことに注意。GRCでの表示だけを見ると逆サイドへの漏れひどいように見えるが実際に送出されるRF信号はそんなに悪いのだろうか?

ちなみに、フィルタを2段重ねにするとこうなる。GRC上は大きく違うが、PLUTOから送出される信号としてはどうなんだろう?

次は、ヒルベルト変換を用いたSSBの生成。最もSDRらしいSSB生成方法かもしれない。アナログのPSN方式に相当する。

プローグラフとPlutoSDRに送り込まれる信号は次のとおり。

 

なお測定条件の詳細は以下のとおり。

疑似音声信号は、CQ出版社のサイトからRFワールド誌 No42の記事関連ファイルとしてダウンロードできるtest_signal.wav ファイルを使用。(https://www.rf-world.jp/bn/RFW42/RFW42P.shtml) これに、100Hz - 2.7KHz のバンドパスフィルタをかけたものをソースとした。WAVファイルのサンプリング周波数が44.1KHzなので、フローグラムでもサンプリング周波数に44.1KHzを使用した。

搬送波の周波数は、ADALM-PLUTOが正式サポートする帯域の中でアマチュア無線の実験研究用のバンド内である438.5MHzとした。ADALM-PLUTOに搭載のクリスタルモジュールの誤差により、実際の搬送波は 438.4971 MHz付近。

適当なカップラーを持たないため、PLUTOのTxに自作のダミーロードを接続しそこから漏れる電波をスペアナ(Annritsu MS2602A)の入力端子に変換アダプタを介して直付けしたホイップアンテナで受信する方法を取った。そのため、信号強度の絶対値にあまり意味はなく、再現性も乏しいことに注意。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

GNURadio 3.7でPlutoSDR - セルフ送受の実験

2021-01-11 01:03:03 | RF

ADALM-PLUTOは、送信と受信が同時にできる。それであれば、自分で送信した電波を自分で受信すれば1台で通信実験が完結して便利だと考えたのだが、けっこうハマった。

実験の方法としては、TX/RXともにアンテナを接続し(*1)無線で行う方法と、TX/RXを同軸ケーブルで繋いでおこなう方法があるが、方法によって現象が異なった。

変調方式は、AM。

無線の場合、TX/RXのLOを同一周波数にすると単一のトーンを乗せたときにぶわぁぶわぁという信号の強弱変化が起こる。アナウンス音声だと何か了解度が悪い。TX/RXのLOを少しずらすと、AMにLOの周波数差のビートが載る。

有線の場合、TX/RXのLOを同一周波数にするとアナウンス音声でもぶわぁぶわぁという信号の強弱変化が起こる。TX/RXのLOを少しずらすと、問題なし。

想像するに、RXのLOがTXの干渉を受けているのだろう。

ということで、TX/RXを直結し、TX/RXのLOを異なる周波数にする構成で実験するのが良さそうだ。

 

*1 正確には、TXにダミーロード、RXにホイップアンテナを接続。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする