ESP32 Direct Conversion SD-TRX 【2023.11.27】 |
ESP32は使いやすいDSPプロセッサと言えるでしょう。今までに、ダブルコンバージョンタイプのSD-TRXとSINADプロセッサをESP32-S3を用いて作ってきました。ESP32の扱いに少し慣れたところで、突然思い立ったことがあります。それは、IFフィルタに使ったラダーフィルタの特性のせいか、どうも音質が満足できなかった7/CB2バンド機のIF以降をDSP化して、改善を図ろうというものでした。
まずは、というところで、実際にESP32を7M/CB機に搭載できるのか確認してみることにします。
ESP32-S3とAD/DAの所用面積を確認
これを見ると7/CB機のTX変調回路とRXIF、復調回路の部分の面積を見ると、ESP32-S3のDSPで交換できそうな感じがしていました。当時は一丁この機器のDSP化でもやったろかいなと思っていました。ま、あまり真面目に考えていなかった頃です。
まずはDSP部をなるべく小さく作ってみたのが上図です。以前のSDRでは不慮の回路変更にも余裕を持って作っていたので、ガラ空き状態ですが、今回は少し密度が上がりました。えいやっと配線して、SDRのプログラムを走らせて、自作のAudioq帯SGからのトーンを入力して、表示させてみたのが下図で、とりあえず動いていることを確認しました。
とりあえず動作確認
さて、これであとはソフトをブラッシュアップすれば簡単に一丁上がりと思っていたのですが、Throughプログラムを動かしてみて、下図のごとくノイズが発生していることが「わかって」しまいました。
Through時発生ノイズ
これを見ると、単に信号の出し入れをするだけのThroughプログラムで、無信号時、このレベルのノイズが出ていると、ちょっと心もとないなぁということで、いろいろ弄り回した結果、実験用電源由来のノイズであることがわかりました。30年モノ?の自作実験用電源から、これも20年モノ?の菊水の電源に変更したらかなり改善することができました。これが以下の図です。
ノイズの改善したThroughプログラムの出力スペクトラム(無信号時)
かなりの改善を認めたので、I/Q Mixerを引っ張り出してきました。
Teensy4.0時代のI/Q Mixer
これは、ちょうど一年半くらい前に弄っていた懐かしいTeensy4.0で使っていた74CBTLV3253を用いたI/Q Mixerです。Si5351のI/Qローカルを使わずに、D-FFを用いた1/4カウンタでI/Qローカルを生成する基板を3253と親亀子亀方式?で実装してあります。試しにこれを用いてSDRとして動作させてみたのが、下図の様子です。
復調の様子
当時のデータによると-100dBmインプット時復調SINAD=24dB@7MHzと書いてあります。ダイレクトコンバージョンの例では同入力レベルでSINADが28dB以上を実現しているので、最適化すれば感度は向上するはずです。まずは、トンデモノイズが無いことを確認することができました。
さて、DCタイプのSDRの場合に気をつけないとイケないのはイメージ受信です。これはIQ-DEMOの復調後のブランチ間偏差や、Q-Localの位相偏差が影響してきます。後者は、位相調整するための仕掛けが大げさになりすぎるので、前者のみを弄ってどの程度の抑圧ができるかについては以前にTeensy4.0やESP32-SD-TRXで見てあります。ほぼ-55dB程度というのが、「調整」得られる値の上限でした。ただ、経時変化で特性は変化するので、気が向いた時に調整をしたいのですが、手動で行うのは、面倒です。今回は簡単な手段で、イメージ受信の最小点をみて、その値に固定してしまうように考えてみます。
イメージ最小点を探っているところ
上図はあえてイメージ信号を受信して、I/Qの復調後のブランチ間偏差を変化させて、イメージ受信が最小になるようなポイントを探ります。検出するのは受信信号のRMSレベルで、この動画からはイメージ信号の復調レベルが-55dBの時点で最小になることがわかります。この探索法はI-CHのゲインを固定し、R-CHのゲインを微小変化させて、イメージ受信の最小点を探っていますが、もっと洗練された方法を用いれば(ステップ可変探索とか)、ずっと速く見つけ出すことが可能です。これがわかれば、R-CHのゲインを固定して終わります。
イメージ最小点
主信号受信レベル
省略できる調整用VR
上図の右端の2つの押しボタンのうち左側のボタンでスタートして、イメージ受信最小点を見つけて動作終了します。今回は手動でも自動でもイメージ比は45dBしか得られなかったので、ここについてはおいおい「つつい」ていくことになります。
さて、ここでローカルを作成しておきます。最初は、簡単にArduino Promini と小型のOLEDディスプレイでSi5351を動かす簡単なものにしようと思っていたのですが、さすがにProminiの8MHzクロックの速度では満足ができなくなったので、一気に特性向上を図ることを画策します。ここで使わせてもらったのが、JF3HZBさんのアナログ風ダイヤルです。
アナログ風ダイヤルの様子
このLCDを使ったアナログ風ダイヤルの完成度は高く、操作性(回転数検知型ステップ可変動作等)非常に魅力的な逸品になっています。今回はこの発振器をローカルに使わせて頂きました。大変に感謝ですね。これに、バンド切り替えSW(12接点)を加えて、オールバンド対応とし、実際にバンドチェンジをしているのが以下の動画です。
バンドチェンジの様子
さらには、ちょっと思うところがあって、5351以外にもSi570も搭載してしまいました。これは、DCで50MHzとかのバンドでI/Qローカルを作ろうとすると、1/4カウンターの入力周波数は200MHzにもなるので、この辺りの周波数をスプリアス少なく生成するのはSi5351では無理だと判断しました。せっかくですので、110MHzを発振した場合のSi570とSi5351のスプリアスの様子を残しておきます。
Si5351のスプリアス
SI570のスプリアス
Si5351はこの帯域では見えませんが、近傍のスプリアスが多いので、気持ちが悪くて、どうしてもSi570に触手が動いてしまいます。
<送信系についても・・・> 【2023.12.24】
さて、ローカルができたので、早速受信をしてみることにします。
Q-DEMに接続する
ダイレクトコンバージョンはRFアンプ無しでも十分クリアな受信ができるので、この点ではかなりお気に入りになっています。特に、残留ノイズの少ないのが印象的です。
さらに何かノイズが出ていてFT8とかの微小信号受信時の妨害がないか確認してみました。
FT8受信の様
(注):これはLSB受信しています。なので、DC付近のノイズが高域(右側)に出ていて誤解を招きそうですが、USBモードで周波数を合わせれば問題ありません
これを見ると、まぁ変な線スペクトルもなく受信できているようです。DC方式なので近傍ノイズの少ないSi570を使いましたが、まぁ、上記(注)を考えると、問題はなさそうです。
さて次はパワーアンプです。以前に、中型?LDMOS(Pd=294W!)を用いたアンプで遊んだ事がありました。これを引っ張り出すことにします。
LDMOSのFETチップ
上の写真を見ると、とってもそのドレイン損失からは想像もできない小型チップであることがわかります。これだと、かなり余裕があるので、多少手荒な事をやっても大丈夫じゃないかと思われます。規格表には出力VSWR=65でフルパワーかけても大丈夫とかの記述ふがあります。
実装の様子
この石は取付ネジがないですから、基板搭載には少々工夫が要ります。いろいろ考えたのですが、Lアングルを使って、上からヒートシンクに押し付けるようにしました。これで、なんとか実装することが出来ました。
回路図
回路図は上記です。出力側はインピーダンス比1:4の昇圧トランスを付与しています。FETが大きくて出力インピーダンスが低いのと、VDD=12Vの条件でなるべくパワーを出したいので、このようにしました。まずはこのF特性を見てみます。
周波数特性
これを見ると、青線がTG→INPUTですから、30dB以上のゲインがありました。流石にハイゲインのLDMOSだけのことはあります。ただ、入力側のSWRミスマッチなのか、F特にうねりが出てしまいました。その偏差は5dBにもなるので、ゲインの高いところで発振しないか心配でしたが、それはなんとか大丈夫のようでした。
IMDの様子
これは、PEP=5Wの時のIMD3の様子です。ゲインが30dBもあって、5WでIMD3は35dBも得られれば、まったく文句はありません。FETらしく高次のIMが少ない=妨害が広範囲に広がらないいい感じの特性です。LDMOSはゲインがあるのですが、あまりリニアリティが良くないイメージがあるので、ちょっとこの特性は意外でした。もっともアイドリングは200mAも流しているので、歪が良くなるのも当たり前かもしれません。
次は送信スプリアスの低減について考えていきます。DC方式ではQ-MIXの後はLCの帯域制限しかできませんから、かなり真面目にスプリアス対策をしないとイケません。まず気になるのは、DACのオーバーサンプルでも抑圧できないリークです。この時点ではFs=32kspsでしたから、使ったDACは8倍オーバーサンプルしているので、256kHz離れのスプリアスを見てみます。
8倍オーバーサンプル時のスプリアス
上図は24MHz帯にDCした場合の256kHz離れのスプリアスを見ています。46dBというとことですから、これでは旧法規でないと許されません(現行法規でも「当面の間」旧法規を準用するなら、これでも合法ですが)。なので、ここは抑圧しないと気が済みません(笑)。
このスプリアスはDAC出力に含まれますので、DACとQSD(直交変調器)の間にフィルターを入れることで改善できます。音声帯域の3kHzは通すが、256kHzはせいぜい30dBも減衰させられればOKです。但し、音声帯域の振幅/位相特性をI/Qチャネル間で偏差を生じないように気を付ける必要があります。
これが劣悪になると、DCですから、キャリア抑圧、サイド抑圧特性を劣化させてしまいます。なので、通過帯域に振幅/位相の影響を与えないようにカットオフ周波数を高く選ぶ必要があります。ここではバターワース特性ですが、カットオフ周波数を15kHz程度に取った12dB/octのLPFを2チャンネル作って挿入しました。この図のESP32の右側にあるOPA2個がそのフィルタです。これで、スプリアスを抑圧した様子を以下に示します。
改善されたスプリアスの様子
同上広帯域特性
このように綺麗なスペクトラムが実現できます。これは幸先のいい話です。実は、このあとはかなり「もだえ苦しむ」ことになるからです。
さて、次は送信のイメージスプリアス抑圧とキャリア抑圧です。これは何等かの方法でQ-MODの変調信号供給系と90°位相差のキャリア供給系のバランスを取って、キャリア/イメージを抑圧する手法を取ってみます。あまりスマートではなくて恐縮ですが、人力で行う調整ボリューム操作をCPUにやらせてしまうということです。
いろいろ文献を検索してみると、この問題を解析して改善している例もありましたが、実機にハードに落とし込むのはなかなか面倒そうです。なので、今回は受信機と狭帯域フィルタを用いて、実際にキャリア漏れ/送信イメージ成分を検出し、これを元にQ-MODの変調信号供給系とキャリア供給系を調整することを考えました。
上図は手書きですいませんが、DC-RX部を検出器に用いて、TXイメージ/スプリアスを検出/低減制御するための系統図です。手書きで落書きに近いものですが、このプロセスが上手くいったら綺麗に書き直そうと思います。
点線部は左からQ-DEM、ESP32-S CPU Q-MODで、下側にSi570/5351のローカルがあります。送信スプリアスを低減するためにはRXで送信スプリアスレベルを検出することになります。スプリアス抑圧制御が終わったら、通常の送受信系にリレーとかで繋ぎ変えることになります。
送信側で制御する部分の想定は(1)変調信号のレベル(2)Q-MODのキャリアサプレッション調整(3)キャリアレベルの3か所としました。このうち、(1)はESP32の内部で処理できます。(2)は以前にNJM2594のキャリア抑圧制御を実験したノウハウがあるので、それを用います。(3)はちょっと厄介で、最初は2つのNJM2594に供給されるローカル信号のレベルと位相を変化させてみようと思ったのですが、位相を制御するのはなかなかに面倒で、リーズナブルな規模での回路が成立しそうにないため、まずはレベルのみの制御でどこまでやれるか評価して、進めて行きたいと思います。
それでは、まずはスプリアスの様子を見ておくことにしましょう。周波数はHFハイバンドということで、
24MHzにおける近傍スプリアス
これを見ると、キャリアリーク、逆サイドバンドリーク、変調信号の高調波のリークとかが見られます。これらのうち、キャリア、逆サイドバンドを抑圧しようという試みです。変調信号の高調波は変調レベルを下げるしかなさそうですね。超絶手動調整をやればキャリア/逆サイドのリークは-60dB近くに抑圧できるのですが、これって、経時変化が大きいのですよ。今日調整しても明日は10dB位劣化することは当たり前にあります。なので、ここは、なんとか自動で調整してしまいたいモノです。
下の図は、先の送信信号を、「RXが飽和しないように40dB近く減衰させて、RXに供給する送信信号」の様子です。ATTを40dB近くかましているのでノイズフロアが上がっています。キャリア、逆サイドともにバランスを崩して劣化させてあります。
この2つのスプリアスを検出するのは、個別のスプリアスに毎に超狭帯域なRXフィルタを用意すれば完璧ですが、どうせ抑圧するのはこの2種類のスプリアスなので、一緒くたにして電力検出をすることにします。そのための検出RXのパスバンドは下図の点線の囲みで示したように約1kHzに設定することとします。
検出すべき帯域
スプリアス検出用RXフィルタの特性
上図はそれに対応できるように1kHz~2kHzまでの通過帯域を持ったBPFです。32kspsなので256タップでも十分な減衰特性が得られています。
こんな感じで、TXで1kHzの変調波をDSP内で生成し、複素BPFでI/Q分離したあと、Q-MODで変調したRF信号を受信し、電力レベルを検出したのが以下の図です。
RXのスプリアス検出特性
スペアナで測って-110dBm以上であれば、スプリアスは測定できることがわかりました。これは、RXで主信号を受信しながら、それと50dB以上も小さいスプリアス量を測定しなくてはイケない一方、あまり高いレベルの主信号をRXに供給すると、いかに狭帯域(Bw=1kHz)のフィルタリングを行っても、微小なスプリアスを正確に測定できにくくなるので、できる限り、主信号レベルを低くして(=TXからRXに繋がる経路にATTをしっかり入れる)おきたいからです。
上図は以上のような観点に従ってTRXとスプリアス測定・抑圧系を構成した様子です。ここでトライアンドエラーを行って、まえに書いた可変部分については、スプリアス低減に有意な箇所を絞り込むことが出来ました。先に提示した系統図のうち、(1)変調信号のレベルアンバランスと(2)Q-MODのキャリアサプレッション調整を手動である程度追い込んでいくと、その後のスプリアスは(3)キャリアレベルを弄れば、最小点に追い込めることがわかりました。なので、微妙に変化するスプリアスはこの(3)キャリアレベルを調整することにします。
キャリアレベルの振幅調整はローカル信号のI/Qそれぞれの経路中(1/4周波数のFFで分周されたあと、NJM2594に供給する間)にMOSFETのバッファを入れて、一方のバイアスを、ESP32-S3に外付けした12ビットDACからの制御信号で制御することで、利得可変を行っています。
上記の動画は、以上述べた方法でスプリアス(主にキャリアリーク)レベルを検出し、最小点を探り、見つかった最小点にDACの出力電圧を固定している様子です。
これを見ると、50dB以上のスプリアス抑圧がHFハイバンド(24MHz帯)で得られており、法規(対域外領域)は十分にクリアしていますので、まったく問題なく運用できるレベルです。
とここまで検討を重ねてきたのですが、ここにきて、JF3HZBさんが新たなSDRを開発したというので、これに興味が移ってしまいました。まずは、そちらを弄らせて戴くために、このプロジェクトは一旦休止します。下図のように、ここまでの検討を「動態保存」しておき、来るべき再開に備えようと思います。
箱入り娘状態になったESP32ダイレクトコンバージョンSDR
一応、セットに纏めることは諦めてはおらず、下記のように、パネルレイアウトを楽しんでみたりしています(笑)。