極座標変調について  【2022.5.9】



 Teensy4.0のSDRを弄っていて、I/Q MODの構成法に満足できずに悶々としていたところ、以前からFace Bookでお世話になっている方のこのHPを見て、この変調法を理解して実際に作ってみたく思いました。その名は極座標変調といって、昨今話題のµSDXにも採用されています。

 詳細は、こちらのHPに纏っているので、そちらを参照してください。要するに、変調信号をI/Qに分離し、その位相成分と振幅成分を計算したうえで、被変調波であるキャリアをそれぞれ位相/振幅変調してあげれば、ダイレクトに目的のRF信号が生成できるというものです。考えてみれば、これは極めて合理的な変調方法で、バランスドモジュレータなんぞという、神経質なアナログ回路を用いなくてもSSBが生成できるので、旨く構成すれば、回路規模を大幅に低減できます。

 私の着目したのはその実現特性で、普通に作ってキャリアサプレッションもサイドバンドサプレッションも良好な値(-60dBC以下)が得られます。また、IMDも注意して作れば最終段で-40dBといったような普通に良好な値を得ることができます。これはQSEタイプのSD-TXに同じことをやろうとするとかなり難しいので、この点はかなり「そそられる」アドバンテージだと思います。

 µSDXもそういった点を考慮して、この変調方式を採用したのだと推測できます。ただ、µSDXの一番すごいところは、DSP処理に普通のAVRを用いてこの極座標変調を実現しているところで、限られた処理能力のなかで、良くもここまで構成できたものだと本当に驚いてしまいます。なので、その驚きの一部でもを自分でも実感したいので、こちらの情報を頼りに再現してみたいと思いました。もちろん、今後のSDR遊びにおいて「引き出し」が増えるだろうという期待も大きいです。

 前置きが長いですが、今回もツイッターでつぶやいていた内容を記憶メモとして残しておくことが主眼ですので、以降、詳細な説明は端折って、結果のみを書いておくことにします(お前のHPはいつもそうだな・・・と思われているかもしれませんが:大笑)。

 まずは、いろいろ実験しながら進めて行くのでそのプラットフォームを決めないといけません。下記の図で全体の構成図を示しておきます。以降、各処理について述べますが、ベースはこの全体構成があることを念頭においてください。なお、これは殆どオリジナルの回路構成と同一となります。





全体構成


 オリジナルの処理系ではTeensy3.6を採用されていますが、追試しようと考えていた頃は、半導体不足?のあおりを受けて、T3.6は全く市中在庫がありませんでした。なので、仕方なくクロックの遅いTeensy3.5を選ばざるを得ませんでした。





Teensy3.5の実験プラットフォーム(といった大げさなものでもないが)


 余談ですが、今、PJRCのサイトをみたら、Teensyシリーズのほぼ全品種がOut of Stockになっています。以前はT4.0は潤沢にあるよとアナウンスしてきたのが、ここにきて一気に蒸発しています。うーーん、去年の段階でT4とT4.1を早めに買い増ししておいて良かった。

 ところでT3.5のクロックは3.6の180MHzに対して120MHzですが、もし、処理能力が足りなくなったら、いろいろ工夫しないといけないかもしれません。まずは、信号を取り込む処理から始めて見ます。なお、サンプリング周波数を20kHzに取って、T3.5の内臓A/Dで50µS毎に信号をサンプルします。





三角波の取り込み


三角波をT3.5のA/Dに入力して、単にサンプル結果を内臓D/Aに吐き出させたのが上図です。以降の処理において、その処理コードは、オリジナルのHPからそのままデッドコピーさせていただいたことをお断りしておきます。様子をみると、この程度のサンプリング周波数では、A/D D/A共に問題無く動いています。A/Dの分解能は10ビット相当です。このTeensy3.5にはD/Aがついているので、処理した結果を吐き出すことで、デバッグが簡単になります。これはDSP初心者にはかなり助かります。何せ、実際の動作の結果を目で見て確認できるからです。





お決まりのヒルベルトフィルタでI/Q分離


 さて、ここからDSPの処理を始めます。入力された信号をヒルベルトフィルタに通過させて、I/Q分離させて見ます。このフィルタは±45度の位相差を生成するタイプとの事です。いつもみるような90度位相差のI/Q信号が生成されます。入力は1kHzで50µS毎のサンプルですから360度で20ポイントのサンプル数となって、随分とカクカクした波形になりますね(笑)。

 それはともかく、ヒルベルトフィルタは100次相当で、I/Q二本の処理になります。これはTeensy3シリーズでは結構時間の掛かる処理なので、このあとの処理にどれくらい余裕があるのか調べて見ます。





クロックが120MHzの場合の処理時間


 この図はTeensy3.5の標準的なクロックである120MHzを採用した場合の処理の様子です。赤紫の階段状波形は前の図のヒルベルトフィルタを通過した信号で、階段の幅は50µSです。一方、黄色はHレベルの間が処理時間を示しています。DSP処理は50μSのサンプル間隔の間に全て終了しなければなりませんが、ヒルベルトフィルタの処理だけで、34µSと70%近くの時間を消費してしまっています。このあとの位相、振幅の計算、位相(変化)情報の書込み、振幅情報の出力と続く処理を考えると、心もとないですね。

 処理時間がかかって、サンプリング間隔内に信号処理が完了しない最悪の場合は、ヒルベルトフィルタ(要はFIR)の高速化(処理最適化)で逃げようと思っていますが、いけるところまでオリジナルの処理を踏襲することにします。

 まずは位相変化情報(要は周波数になります)をDDSに書き込むのに掛かる時間を測ってみることにします。





AD9851書き込み時間


 上図はノイジーですがAD9851への周波数書き込み時間を測っています。黄色はデータで赤紫はStrobe信号です。このAD9851の書き込みのライブラリはオリジナルサイトの指示通り、GitHubから持ってきていますが、別に難しくないので、自作も可能でしょう。これもオリジナルサイトのアイデアですが、digitalWriteでポートを動作させるのですが、これをdigitalWriteFastに書き換えています。これにより、1周波数の書き込みあたり7µS掛かることが解ります。先のクロック120MHzでは周波数を書き込む時間を確保すると、残りは数µSしかなく、処理の完遂に自信が持てなくなります。

 そこで、奥の手を繰り出すことにしましょう。そう、オーバークロックです。なんと、Teensyduinoには掟破りのオーバークロック機能が備わっているのです。この機能によって、タイミング関係が変化する部分も補正されるので、Serial通信やタイミングに関わる命令も全て補正されるようなので、動作に不安がありません。

 で、120MHzから48MHzアップ(40%増速)の168MHzを選んで動作させてみます。





オーバークロック時のヒルベルトフィルタの動作


 この図は先の100次のヒルベルトフィルタを2本動かした場合の様子を示します。オーバークロックによって、処理時間は34µSから25.6µSと25%の増速ができました。クロックアップの40%増しに比べて、改善量が少ないですが、ま、残り時間が24µSとなって、先のDDS書き込みも高速化されることを考えると、残った処理に対して余裕が出来ました。





T3.5とAD9851の様子


 これは、DDSを接続して、まずは位相変化分(要は周波数)の変調する最小構成です。位相は

θ=arctan(I 、Q)

 で求められます。これが50µS毎にサンプリングされるので、Tsをサンプリング間隔(=50µS)として

F=Δθ/(Ts・2π)=(arctan(In+1 , Qn+1)-arctan(In , Qn))/(Ts・2π)

 なる周波数をサンプリング毎に書き込めば、位相変化を周波数として表現できることになります。もちろん、これはキャリア周波数Fcに加算されてDDSに書き込むことになりますね。そうそう、この場合、キャリアに加算でUSB、減算でLSBを発生させられるのは感覚的にも良くわかります。

 このようにして、入力信号の2-トーン(若干のレベル偏差あり)をA/D変換して、I/Q分離して、上記の演算を行ってDDSに書き込んで、その出力信号のスペクトラムを見たのが以下の図です。





位相変化分で変調したスペクトラム


 このスペクトラムはSSB-2トーンの持つ振幅情報が全て欠落していて一定振幅の見た目はキャリアと同じ波形で、位相変化(周波数)変調のみ受けている形になりますね。要は真っ当なSSB-2トーン信号をリミッターに通過させるとこんな感じになって、めちゃくちゃスペクトラムが広がります。さすがにこれを復調すると歪が多く、もとよりこれでは送信することはできません。

 ということで、この信号に振幅変調を掛けることになります。I/Q信号の振幅は√(In^2+Qn^2)ですから、単純にこれを計算して、先の位相変化(周波数)変調信号に乗算してあげればいいわけです。この手段はいくつか考えられますが、まずは、オリジナル通り、PWM信号でスイッチングFETのドレインを振ってAM変調を掛けることにしてみます。





PWMでドレイン変調を行う構成


 上図はDDSの出力信号を矩形に整形する74HC00と終段FET、並びにLPF(上の基板)とFETをドレイン変調させるためのPWMから電流制御するための変換回路とPWMクロック抑圧のLPF(下の基板)です。これらはオリジナル回路と殆ど変わっていません。ただ、DDSから矩形波に変換するときの74HC00入力にDCバイアスのオフセットを掛けたり、FETのGate電圧を上げるためにVddを6~7Vまで変化させる細工が施されていますが。

 言い忘れましたが、FETの動作は効率重視のEクラスです。いまや、非線形動作の代表例のようになっているようですね。80%以上の電力効率が得られますから、非線形でいいパワーアンプには持ってこいなおでしょう。

 Eクラスの動作にはLPFが大切と聞きました。なので、まずは、LPF単体の特性を測ってみます。これも定数はオリジナルサイトを参照していますが、第二高調波を抑圧するディップ点の微調整を実施した以外はそのまま使っています。





E-クラス用LPFの様子



 上記の構成で先の位相変調信号を振幅変調した結果が以下の通りとなります。





極座標変調による2-トーンSSB波形(時間軸)


 赤紫が2トーンのAudio信号をI/Q分離後、√(In^2+Qn^2)を計算した振幅成分になります。これで先のこの図に振幅変調を掛けた形が黄色い波形で極座標変調された2-ト―ン信号の時間波形です。これは、このHPでも良く見かける波形ですね。このスペクトル波形は以下のようになります。





極座標変調による2-トーンSSB波形(周波数軸)


 これを見ると、大きく広がっていた高調波成分が抑圧されて、とりあえずSSBのスペクトラムに近づいて来ます。IMD3は-40dB程度と、まぁ、SSBとしては良好な部類ですが、ちょっと高調波のレベルの収束傾向がなだらかで、これは気になるところです。

 なお、この出力は先の時間波形でわかるとおり、PEPで5.7Wとなっています。入力は12V0.29Aなので効率は82%というところでしょうか?効率がかなり良好なのはこのEクラス動作の素晴らしいところですね。





キャリア/逆サイドサプレッション

 上図はシングルトーンの様子です。2-トーンのように位相が180度一気に飛んでしまうことがないので、サイドバンドの広がりはまったくありません。真ん中のキャリアはLSBに対して-67dBも減衰しています。逆サイドバンドに関しては-70dB以下と申し分ない特性になります。以前、実験していたQSEに比べて、かなり良好な特性であるということができますね。この点は極座標変調方式の大きなメリットということができます。





実験系の全景


 最後に実験系を以下に示しておきます。今後、何かあった際に極座標変調の検討を継続することがあるかもしれないので、そうなったらいつでも再開できるようにしておきます。これで、SDRの「引き出し」が一つ増えた気がして楽しいですね。(続く)

 

<DDSの振幅変調機能を用いた極座標変調> 【2022.5.27】

 いやー、前回の極座標変調のネタはアクセスが激減でした。みなさん、SDRの「動作」の中身には関心が薄いようで、SDRといったら、綺麗な基板と見栄えのするディスプレイがないと、見る気はせんわ!といったところでしょうか?そうなると今回は更に閲覧が減ることを覚悟しておきますか(苦笑)。ま、ここはPWZのメモページですからそんなことを書いても詮無いことですけど(笑)。

 実は、極座標変調の動作を理解したいと思って、一連の実験をやっていたのですが、やっている途中でちょっとアイデアがひらめいたのです。それは、私のお気に入り?のDDSである、AD995Xの振幅変調機能を使って振幅成分の再生ができないかな?ということです。AD995XはAM変調を掛けることが容易にできるので、これでPWMによるEクラスアンプを振幅変調する方式を代替できないかと思いついたのです。

 しかしながら、この考え方はとっくに実験された後だったことが解りました。JF3HZBさんのブログにまじ、そのまま掲載されていました。これを見つけた時は、「うーーん、この程度の事は、先人がとっくに実験してしまっているのだなぁ」とちょいと気落ちしたのですが、ま、どんな特性になるのだろうかと興味が尽きなかったので、PWZ流に実現して、その特性を探ることにしました。

 ということで、以下に実験系を示します。





DDSの振幅変調機能を用いた極座標変調の実験系


 といっても、今までAD9851につながっていた4本の制御線を以前に基板を作ったAD9952モジュールに接続しただけです。周波数データと振幅データはいずれもシリアル信号でAD9952に転送します。まず周波数データですが、私の作ったEF_AD995x.h/cppというファイルでdigitalWrireFast命令を使って周波数を書き込むのに11μS、振幅データの書き込みに6μSで合計17µS掛かることになりました。書き込み以外の処理は以前のAD9851を使った場合の25µSと同等ですから、トータルで42µSとなんとかサンプリング間隔の50µS以内に処理を終えることが出来そうです。以前と同じように、Teensy3.5のOverclock(168MHz)で対処できるはずです。





AD9952の振幅のステップ変化




AD9952の出力信号をサインウェーブでAM変調


 上図はさっそくAD9952を振幅変調した様子です。上段は8%の振幅と100%の振幅の繰り返しです。しっかり変調が掛かっていますね。下段は正弦波でAM変調した結果です。要は50µS毎に正弦波をサンプリングしてその振幅情報をAD8852に吐き出しているだけです。このスペクトラムは以下の通りとなります。





AD9952DDSによるAM変調のスペクトラム


 この図は先の100%AM変調信号のスペクトラムで、キャリアとサイドバンドは-6dBなので、100%変調となりますね。サイドバンドの高調波成分は比較的少な目ですが、なぜか5倍の成分が若干大き目なのは少し気になるところです。

 さて、このように基本的なところが確認できたので、SSBを生成するために2-Tone信号の位相変化成分で変調した信号に対して2-Toneの振幅成分を計算して、これをDDSに転送して振幅変調します。冒頭のブロック図のうち、√(I^2+Q^2)によって位相変化成分で変調された定振幅の信号に振幅変化を再現させることになります。





SSB 2-tone波形の様子


 上図は先に述べた処理を行って、SSBを生成した様子です。AD9952DDSから吐き出された信号は50µS毎にサンプリングされるので、その振幅成分が階段状になります。これは、AD9952DDSの振幅変調処理において、D/Aのオーバーサンプル処理も、フィルタリング処理も行っていないので、当然のことながら、RFスペクトラムには「Fs折り返し」のスプリアスが出てしまいます。この場合、ナイキスト周波数(25kHz)で折り返される信号成分を見たのが以下の図です。





AD9952DDSによる振幅変調を行った場合の折り返しのスペクトラム



 これを見ると、ゼロ次ホールドによる減衰が少しあるため、主波に対して-35dBくらいのスプリアスになっています。この帯域はRFのパッシブBPFでは抑圧できませんので、なんらかのディジタルorアナログ処理が必要になります。これには、Audio CORDECのようにDDSに書き込むデータをオーバーサンプルして、スプリアスを遠ざけることで、さらにきついゼロ次ホールド効果を見舞わせて、あと15dB程度を稼ぐ方法です。ただ、DDSへの書き込みスピードは、先に述べたように、オーバーサンプルできるような余裕は全くないので、この方法は採用できません。


 この実験の先駆者であるJF3HZB上保さんもこの点を指摘されていて、高速書き込みのDDSならスプリアスの低減が可能であることをコメントされています。しかしながら、今回の私の実験では、手元にあるAD9952を簡単に料理してどこまでいけるか見たのであって、このSSB生成手段は確認のみに留めておこうと思います。





シングルトーンのスペクトラム


 最後にシングルトーンのスペクトラムも示しておきます。キャリアは7.1MHzでLSB変調です。キャリア抑圧が-62.5dBで逆サイドは見えません。LSBの二次の高調波は-62.5dBで見えますね。シングルトーンだと、位相変化のジャンプがないので、SSB2-toneのような多くのサイドバンドが見えません。スペクトラムのきれいな様子は、以前のAD9851DDSとFETによるE-クラスアンプにPWMで変調を掛ける検討と同じですね。

 ここまで一通りDDSによる振幅変調の方法を書いてきました。前回の稿と合わせて、極座標変調を理解するためにいろいろ実験した結果のメモに過ぎませんが、DSP処理の引き出しが一つ増えた感じがして、基本的には満足しています。