Computer & RF Technology

NanoVNAの校正処理をPythonで試してみる

今回はネットワークアナライザに付きものの校正の中身を紹介します。動作の確認の意味も含めて、実際にNanoVNAで観測した結果を、Pythonによる校正処理を試してみます。

100MHzのLPFをDUTにして、〜300MHzの範囲で周波数をスキャンしながら、反射信号と通過信号として得られた振幅をプロットすると下記のようになりました。縦軸は対数としています。ここまでは前回までに紹介した状態です。

通過特性が100MHz付近でカットオフしていることと、反射信号が100MHzを越えるとほぼ全反射になっていること、100MHz以下の通過帯域で反射のリプルがあることがわかります。全体的にはそれらしい特性が得られていますが、右肩下がりになっていることが気になります。さらに縦軸の位置も大きくずれています。これは反射と通過の感度が違っているためです(反射側は抵抗ブリッジを介しているので感度が大きく下がります)。

logmagという関数は複素数の振幅を取って対数でプロットしています。周波数特性が右肩下がりになっているのは、周波数が高いとミキサ(SA612)の感度が下がってくることが原因です。これを校正処理で補正していくわけです。

校正処理にはいくつも種類があるのですが、まずは最も簡単なレスポンス校正をやってみます。

レスポンス校正は、あらかじめ基準となるレスポンスを計測しておきます。そしてDUTを計測して得られた振幅を、基準となるレスポンスの振幅で割り算してやります。基準となるレスポンスとは何かというと、反射特性の計測については全反射、すなわちオープンまたはショート状態のことです。一方通過特性については、基準は全通過(スルー)状態、すなわち出力ポートを受信ポートに直結した状態のことです。計測すると以下のようなグラフが得られます。

全反射、全通過いずれも右肩下がりになっていることがわかります。これを基準としてDUTの計測結果を割り算することで正規化され、全反射もしくは全通過を1とした相対値が得られることになります。

先ほどのLPFについてこれを行ってみると、下記のようなグラフが得られます。

それらしいグラフになりました。通過帯域の通過量や、阻止域の反射量がおよそ0dBになっていることがわかります。レスポンス校正は割り算だけの簡単な処理ですが、ちゃんとそれらしい結果が得られました。

このようにレスポンス校正でも充分実用的な結果が得られるのですが、実はネットワークアナライザの誤差の原因には、もっと多くの要素があります。

その一つがカプラ(抵抗ブリッジ)の方向性です。反射の測定において、反射信号が無ければブリッジからは出力が出てこないはずですが、実際には方向性は完全ではなく漏れがあります。具体的には、無反射終端すなわち50Ωにマッチした負荷を接続した場合、ポートから出た信号は50Ωですべて消費されて、反射して戻ってくる信号は無いはずですが、実際にはある程度の信号が検出されてしまいます。これは主にブリッジの不完全性が原因です。これを方向性(ディレクティビティ)のエラーと呼びます。(もうひとつ、無反射終端が完全には無反射ではないことも理由の一つです)

同様に通過信号の測定についても、送信、受信ポートをそれぞれ終端してしまい、まったく信号の行き来が無い状態にしたとしても、実際にはごくわずか信号が漏れ出ており、これが測定にかかってきます。こちらはアイソレーションまたはクロストークと呼びます。

ディレクティビティならびにアイソレーションは、共に測定した信号から差し引くことで、キャンセルすることが可能です。大きい方がロードの観測値でディレクティビティを示します。小さい方がアイソレーションです。対数を取っているのでアイソレーションで観測値が0だった部分はプロットされていません。

もう一つのエラーの要因があります。先ほどレスポンス校正の例では反射の基準としてオープンを使用しましたが、ショートも全反射の状態として使用することができます。オープンとショートは、反射波の符号は正負反対になりますが、振幅は同じとなるはずです。ところが実際に測定してみると、オープンとショートには振幅に差異が生じます。

縦軸のスケールが大きくなっているので差が大きいように見えますが、最大で1dB程度です(でも少なくない値です)。具体的には、ブリッジ入力端子のインピーダンスが負荷インピーダンスの影響を受けて変化していることにより、振幅が変化していることが原因です。簡単な理解では、オープンの開放状態が負荷が軽いのに対して、ショートでは負荷が重いので、振幅が減ってしまっているということに対応しています。この項目をソースマッチといい、信号源と負荷の間の整合の不完全性を示しており、これも校正で補正する対象です。

これらをすべて補正する校正は、エンハンストレスポンス校正と呼びます。信号の出入りを矢印で表現したシグナルフローグラフで示すと下記のようになります。

S11a, S21aが実際の係数(actual)、S11m, S21mが観測された係数(measured)、Ed, Er, Es, Et, Exがエラー項でそれぞれ、ディレクティビティ、リフレクショントラッキング、ソースマッチ、トランスミッショントラッキング、アイソレーションを示しています。すべて複素数です。

目的は、測定された係数S11m、S21mから、実際のS11a, S21aを求めることとなります。シグナルフローグラフから簡単な規則で式を導出することができます。矢印が合流する箇所は和、ループとなっている部分は多重反射=等比数列の無限和1+x+x^2+x^3…となりますからx«1であれば1/(1-x)で求めることができます。シグナルフローグラフの詳細は参考書を参照してください。結果として、下記のようになります。

このうち方向性とアイソレーションは、無反射のロード、そしてポート間が無接続すなわちS11a=0, S21a=0の状態ですから、両方のポートをターミネータで塞いだ状態としてS11m、S21mを計測したものがそのままEd,Exとなります。

Es,Erは、S11の式に、オープンS11a=1, ショートS11a=-1として式を二つ立て、これを連立方程式として解いて求めることができます。結果だけ示すと下記のようになります。

式は対称性のある形をしています。S11moはオープンでの反射係数、S11msはショートでの反射係数です。それぞれEdを差っ引いてから計算すると式変形が容易です。

最後にEtですが、送受信直結状態でS21mtを計測します。理想状態であるS21a = 1、S11a=0を仮定すると、Etは下記で得られます。

こうして得られたエラー項を使って、観測値からS11とS21を次のようにして求めることができます。

実際にさきほどの計測値を使ってエラー項を計算してみます。

そしてLPFの観測値を使ってS11,S21を計算してみます。

単に式を書いているように見えますが、すべての周波数について個別に、複素数での計算を行っています。

プロットしてみます。

LPFをDUTとした場合には、レスポンス校正と大きな差異は見られませんが、阻止域の低いレベルでの不要な漏れが取り除かれているのがわかります。

ここまでのグラフでは振幅しか示しませんでしたが、計算は複素数で行っていますので位相も含めて校正しています。そこで反射係数を複素平面上で、スミスチャートとしてプロットしてみます。

通過帯域では原点近くをぐるぐるとインピーダンスが変化しているのがわかります。一方阻止域では円周近くで全反射となりながら位相が回っていることがわかります。このようにスミスチャートだとフィルタの挙動がよくわかります。

結果を見ると少しおかしいことがわかります。残念ながら少し単位円をはみ出してしまっています。本来であれば円をはみ出すことはないはずです。校正処理によって、オープン、ショート、ロードと3箇所がびたっと点に落ちるのですが、その他の部分でずれが生じているようです。いくつか置いた仮定、例えばロードが完全な無反射という仮定が現実と合っていない等の原因があるかもしれません。できればもう少し完全を目指したいところです。改善検討ポイントです。

以上校正処理をPythonで試してみました。この流れはあくまで原理の確認のために行ったことです。現在の作業状況ですが、実はもう既にファームウェアに校正や描画処理も実装してしまいました。これについては引き続き紹介したいと思います。

リファレンス

Load more