見出し画像

【電子工作】Qucs と NanoVNA のデータを octave で並べてグラフ表示してみた

AMラジオに使う中間周波トランスの特性を測ってみた。ブレッドボードで簡単な回路を組みNanoVNAで測定、またそれと同じ回路を Qucs でSパラメータシミュレーションして、それらの結果を octave に読み込んで一つのグラフに表示してみた。その大まかな手順と結果を書く。

Qucs から octave へ


Qucs のシミュレーション結果は"*.dat"というテキストファイル。これを読めば良いだけなのだが、複素数の扱いが Qucs と Octave では異なるためデータの変換が必要になる。Qucs の虚数は正負符号と数値の間に"j"が入るのに対し、Octave では虚数の末尾に"j"が付く。また、"*.dat"のデータは要素ごとのシリーズのデータで使いにくいので表の形式に並べ替えるよう perl スクリプトを書いた。文末に今回書いた perl スクリプトとそれを使って作ったCSVファイルをOctave に読み込むスクリプトを置いておくので興味のある方は見てください。

NanoVNA から Octave へ

NanoVNA のデータは NanoVNA Saver を使ってPCに取り込みます。それでできたSパラメータのs2pファイルをOctave に読み込みます。s2pファイルもテキストデータで、そのフォーマットは、
"周波数[Hz]  S11(実数部)  S11(虚数部)  S21(実数部)  S21(虚数部)"
となっていてデリミタは半角スペースです。s2pファイルは特に変換の必要はありません。Octave を起動した後下記コマンドで読み込めます。

s2p = dlmread("NanoVNAで測定したデータ.s2p"," ",1,0)

ただ、このままだと実部と虚部が分離されていて使いにくいので一つの数値にまとめます。s11は反射係数、s21は伝達関数です。s2p(:,1)は周波数データ、s2p(:,2)~s2p(:,5)はパラメータの数値です。

s11 = [s2p(:,1), s2p(:,2)+s2p(:,3)*i ]
s21 = [s2p(:,1), s2p(:,4)+s2p(:,5)*i ]

s11の反射係数をインピーダンス(ZL)に換算します。

ZL=[s11(:,1),(1+s11(:,2))./(1-s11(:,2))*50]

シミュレーションと測定

図1にQucsで書いた回路図を示します。これをSパラシミュレーションします。ここで"*.dat"ファイルができますので、冒頭の方法でデータ変換します。 

図 1 回路図

写真1は測定の様子です。黄色のコイルを測ってみました。NanoVNAは本体での操作も可能ですが、PCからの操作のほうがやりやすいので NanoVNA Saver を使ってNanoVNAを操作します。

写真 1  測定の様子

図2が NonoVNA Saver で表示させた測定結果です。これもテキストファイルで保存します。

図 2 NanoVNA測定結果

それぞれのデータを Octave に読み込んでグラフ表示したものです。

図 3  測定結果と解析結果比較

図3の青い線がQucsのシミュレーション結果で赤い線がNanoVNAの測定結果です。共振周波数(455kHz)、ゲイン、位相とも概ね一致しています。Qucs での中間周波トランスは  "three mutual inductors" を使用していて、インダクタンスはカタログ値、コイルの結合係数(k12,k13,k23)は0.99を使用しています。測定結果とシミュレーション結果が大体合っているので、まぁこれでOKかと思います。

今回作成したスクリプト

qucs_to_octave.pl は Qucs のシミュレーション結果に対して虚数記号を処理して Octave で読めるようにした perl スクリプト。使う際は自己責任でお願いします。

下のコードは qucs_to_octave.pl で作成した CSV データを Octave に読み込む octave スクリプト。使う際は自己責任でお願いします。

#  Qucs のデータをoctaveに読み込む

Qucs_data = fopen( "CSVfilename" , 'r');
qucs_label = fgetl( Qucs_data );
fclose( Qucs_data );
qucs_l = strsplit ( qucs_label , ",");

valuname = genvarname( qucs_l )

qucs_dd = dlmread( filename ,',',1,0);
ii = size( qucs_dd, 2)

for ix = 1:ii
   qdata.( (valuname(1,ix)){1} ) = qucs_dd(:,ix);
end

以上

この記事が気に入ったらサポートをしてみませんか?