良い名前が思いつかない

電子回路屋が趣味でやっていることを書き残します。

LTSpiceで精度の高いシミュレーションを行う

LTSpiceをデフォルトの設定のまま使用していると、FFTや.fourコマンドでつまずくことがあります。その原因と対策についてまとめます。


デフォルトの計算精度では何が起きるのか?

この検証では、±1V, 1kHzの正弦波信号100周期で検証します。
f:id:hanachan_ac:20210929200419p:plain

FFT

FFTアナライザでは、周波数スペクトラムを表示します。シミュレーション後、波形画面からView -> FFTの順に操作します。サンプル数は262144ポイントとします。
f:id:hanachan_ac:20211002172057p:plain
・・・なにやら余計なものがたくさん見えます。低域でもフロアが-105dB程度と高いです。

.fourコマンド

Fourコマンドでは、波形の歪率を計算します。SPICE Directiveを追加し、次のコマンドを入力すると計算されます。ほかにも指定できる項目があるので、興味があれば調べてみてください。

.four [周波数] [測定箇所1] [測定箇所2] ... [測定箇所n]

シミュレーション後に View -> SPICE Error Logを開くと、ログ内に以下のように結果が表示されます。第9次高調波までで0.774548%, 全高調波で0.850861% と高く、明らかにおかしな結果です。

Harmonic	Frequency	 Fourier 	Normalized	 Phase  	Normalized
 Number 	  [Hz]   	Component	 Component	[degree]	Phase [deg]
    1   	1.000e+03	9.933e-01	1.000e+00	    0.09°	    0.00°
    2   	2.000e+03	1.199e-04	1.207e-04	   88.65°	   88.56°
    3   	3.000e+03	6.912e-03	6.959e-03	 -165.81°	 -165.91°
    4   	4.000e+03	1.314e-04	1.323e-04	   82.03°	   81.94°
    5   	5.000e+03	1.673e-03	1.685e-03	 -148.74°	 -148.83°
    6   	6.000e+03	1.175e-04	1.183e-04	   75.62°	   75.53°
    7   	7.000e+03	1.765e-03	1.777e-03	 -133.30°	 -133.39°
    8   	8.000e+03	5.426e-05	5.463e-05	   99.00°	   98.91°
    9   	9.000e+03	2.334e-03	2.349e-03	 -112.83°	 -112.93°
Total Harmonic Distortion: 0.774548%(0.850861%)


原因と対策

シミュレーションのタイムステップ

自動で設定されるシミュレーションのタイムステップ(時間刻み)は、FFTやfourコマンドのような解析には不向きな大きい値がセットされるようです。
長くても、解析信号周期の1000分の1~10000分の1くらいの値にセットしましょう。
Edit Simulation Commandウインドウで、Maximum Timestepに値を入れて設定します。

波形圧縮が行われている

デフォルト設定では、波形ウインドウに300ポイントとなるようデータを間引いてしまいます。*1
これを間引かないよう設定する必要があります。
SPICE Directiveを追加し、次のコマンドを入力すると間引かないようになります。

.options plotwinsize=0

浮動小数点演算の精度が悪い

デフォルト設定では演算精度が悪く、どうやら単精度浮動小数点で計算するようです。これを、倍精度で計算するよう設定する必要があります。
SPICE Directiveを追加し、次のコマンドを入力すると倍精度で演算します。*2

.options numdgt=7


試してみる

FFT

まず、timestepを自動から0.1us(10000分の1)に設定します。
f:id:hanachan_ac:20211002175536p:plain
低域のフラットな部分がなくなり、全体的に若干改善しました。

次に、.options plotwinsize=0 を追加します。
f:id:hanachan_ac:20211002175545p:plain
大きく改善し、ノイズフロアは-180dB以下に収まっています。
例えば、24bit分解能のダイナミックレンジが144dBなので一般的な用途ではこの設定で十分そうですが、計算値ですからもう少しなんとかしたいですね。

更に、 .options numdgt=7 を追加します。*3
f:id:hanachan_ac:20211002175555p:plain
大変綺麗になりました。ここまでくれば十分でしょう。
これ以上ノイズフロアを下げたければ、timestepを更に細かく刻む必要があります。

.fourコマンド

FFTと同様timestep, plotwinsize=0, numdgt=7を順番に追加していき、.fourコマンドの出力値を比較します。

Total Harmonic Distortion
デフォルト設定 0.774548%(0.850861%)
timestep 0.1us 0.057223%(0.077561%)
timestep 0.1us
plotwinsize=0
0.000000%(0.000000%)
timestep 0.1us
plotwinsize=0
numdgt=7
0.000000%(0.000000%)

こちらはそもそも出力値の桁が少ないので、numdgtの設定値はあまり影響しないようです。plotwinsize=0を追加した時点で、歪率0%の結果が出ました。

高精度の計算をデフォルト設定にしたい

今回紹介した値のデフォルト値は変更できないようです。誰か知っている方が居たら教えてください!
いちいち入力するのが面倒というのであれば、こんな感じのテンプレートを作って持っておくのはいかがでしょうか?
ほかにも、mcやmeas, stepコマンドなども書いておけば、使いたいときにすぐに使えます。使用しないコマンドは、セミコロンでコメントアウトできます。
f:id:hanachan_ac:20211002182301p:plain

*1:300ポイントで表現できない場合は、自動で設定変更されるようです。

*2:通常のSPICEではnumdgtは有効桁を設定するコマンドのようですが、LTSpiceでは7以上の値をセットすると倍精度になるようです。

*3:複数のSPICE Directiveは、.options plotwinsize=0 numdgt=7というふうにまとめて書くことができます。