LTSpiceをデフォルトの設定のまま使用していると、FFTや.fourコマンドでつまずくことがあります。その原因と対策についてまとめます。
デフォルトの計算精度では何が起きるのか?
この検証では、±1V, 1kHzの正弦波信号100周期で検証します。
FFT
FFTアナライザでは、周波数スペクトラムを表示します。シミュレーション後、波形画面からView -> FFTの順に操作します。サンプル数は262144ポイントとします。
・・・なにやら余計なものがたくさん見えます。低域でもフロアが-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
試してみる
FFT
まず、timestepを自動から0.1us(10000分の1)に設定します。
低域のフラットな部分がなくなり、全体的に若干改善しました。
次に、.options plotwinsize=0 を追加します。
大きく改善し、ノイズフロアは-180dB以下に収まっています。
例えば、24bit分解能のダイナミックレンジが144dBなので一般的な用途ではこの設定で十分そうですが、計算値ですからもう少しなんとかしたいですね。
更に、 .options numdgt=7 を追加します。*3
大変綺麗になりました。ここまでくれば十分でしょう。
これ以上ノイズフロアを下げたければ、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%の結果が出ました。