LTspice Transient解析用にスイープ信号をつくる

published_with_changes 更新日:

labelLTspice Tips

何に使えるのか、今のところ宛はありませんが、興味本位で時間軸のスイープ信号を作ってみます。サイン波、矩形波、三角波のリニアスイープとログスイープを考えます。Googleで探して持ってきた内容がメインですが、あれこれ自分でやってみたものもあります。



振動試験などで使われる周波数スイープには、周波数のスイープ(掃引)のさせ方として、リニアスイープとログスイープがあります。時間軸に対して周波数がリニアに増加するのがリニアスイープで、logで変化するのがログスイープです。

大まかに言えば、初期の低周波数域ではリニアスイープが周波数が早く変化し、終期の高周波数域ではログスイープが周波数の変化が早く感じられます。リニアスイープでは終期の高周波数域ではほとんど周波数が変化しないのに比べ、ログスイープの方が時間の経過に対してより均一に変化しているイメージです。


目次
  1. リニアスイープ
    1. 数式を適用した場合
    2. LTspiceに備わっているmodulateを使う場合
    3. LTspiceでのシミュレーション
      1. modulateについて
  2. 対数スイープ
    1. LTspiceでのシミュレーション
  3. 矩形波のスイープ
  4. 三角波のスイープ
    1. 第1事例
    2. 第2事例
    3. 第3事例
  5. のこぎり波のスイープ

リニアスイープ

サイン波をスイープさせることを考えます。ビヘイビア電源に数式を適用する方法とLTspiceに備わっているmodulateを使う2通りの方法でやってみます。

数式を適用した場合

Wikipediaから引用します。時間とともに周波数が変化する信号をチャープ信号と言い、時間との変化がリニアな線形チャープ信号指数関数的に変化する指数チャープ信号があります。線形チャープ信号の場合は、

fsf_sを時間t1t_1における開始周波数、fef_et2t_2における終了周波数、またfsf_sからfef_eまでのスイープ時間をTeT_eとした場合、ある時点の瞬時周波数は次式で与えられます。
f(t)=fs+kt(1)f(t)=f_s+kt\tag{1}
ここで、kk周波数の増加率あるいはチャープ率とも言い次のように定義します。
k=fefsTe(2)k=\frac{f_e-f_s}{T_e}\tag{2}
時間領域において、任意の周期波形の位相は角周波数の積分となるので、初期位相ϕ0\phi_0として式(1)を積分すると、位相は次式で与えられます。
ϕ(t)=ϕ0+2π(fst+k2t2)(3)\phi(t)=\phi_0+2\pi (f_s t+\frac{k}{2}t^2)\tag{3}

LTspiceに備わっているmodulateを使う場合

modulateは[SpecialFunctions]にあります。FM端子に周波数を入力すると時間積分して位相を出力するコンポーネントのようです。詳細は後述します。
ϕ(t)=t1t2f(t)dt=t1t2(fs+kt)dt(4)\phi(t)=\int_{t1}^{t2} f(t)dt=\int_{t1}^{t2} (f_s+kt)dt\tag{4}

LTspiceでのシミュレーション

下図に数式を利用したCASE 1 とmodulateを利用したCASE 2を併記しています。当然ですが、どちらも同じになります。

CASE 1では、式(3)で示す位相と式(1)で示す瞬時周波数をビヘイビア電源で作りました。
CASE 2では、電圧制御電圧源のPWL出力で時間に対してリニアに変化する波形を与え、それをmodulateのFM端子へ入力します。その周波数はmodulateのspaceとmarkで設定しています。PWLの出力V(fm)は0Vから1Vの変化なので、周波数の値を得るためにビヘイビア電源B3で換算しています。次の図を見ると、CASE 1(数式)とCASE 2(modulate)が同じであることがわかります。



modulateについて

使い方を忘れると思うので、書いておきます。周波数を設定するには、modulate のシンボルの上で右クリックし、spicelineの行に
  • mark   FM端子入力が1V時の周波数
  • space  FM端子入力が0V時の周波数
を設定します。

感覚的な使い方としては、これには2通りの設定が可能です。たとえば、

    1. mark=1 space=0 (単位はともにHz)と記入すると、FM端子への入力電圧[V]がそのまま周波数[Hz]になります。範囲の外側(以下、外挿)を指定することもでき、例えば、入力電圧を1k[V]とすれば、周波数は1kHzになります。つまり、markとspace間を基準周波数(1Hz)にして、FM端子の入力で周波数を設定する方法です。
    2. もう一つの設定として、mark=2k space=1k (Hz)と記入すると、FM端子入力が0Vのspaceでは周波数1kHzであり、FM端子入力が1Vのmarkでは2kHzです。電圧で見れば、markとspaceは1Vの差がありますので、入力1-0=1[V]あたり2k-1k=1k[Hz]の増加を意味します。この場合、入力2[V]では3k[Hz]になります。つまり、PWL(0 0 10m 1)のように入力側を0~1Vの基準にして、mark周波数とspace周波数間を分割して設定する方法です。a)と同様に外挿の2Vを設定することもできます。
    3. さらに、周波数に負の値を入れると絶対値が同じ周波数で、位相が反転します。

これらの特性を図で示したのが次の図です。1段目の緑色波形はLTspiceに備わっている d()関数で、V(out)を微分したものです。位相の微分なので周波数を表しています。


この場合のmodulateの書き方は下図です。



modulateを使う場合とビヘイビア電源で数式を使う場合の比較をしてみました。

式(4)はLTspiceに備わっている積分関数 idt() で周波数の(1)式を直接積分したものです。2段目の Te*V(in) は (3)式を V(in) を使って表わしたものです。

4ケースを重ね合わせると、ピタリと一致します。





対数スイープ

詳しくないので、対数スイープ、ログスイープ、指数スイープを同じ意味の周波数掃引として使います。調べていくと、最近は swept-sine という言い方をするようです。

色々探し回って、swept-sine信号波形を具体的に数式表現している下記文献を探し当てることができました。 ここに載っているsynchronized swept-sine という信号です。

"Synchronized Swept-Sine: Theory, Application, and Implementation"
Antonin Novak, Laurent Simon, Pierrick Lotton

HAL Id: hal-02504321
https://hal.archives-ouverTes.fr/hal-02504321
SubmitTed on 10 Mar 2020


文献によると時刻tt におけるswept-sine波は次式で与えられます。
ϕ(t)=sin[2πfsL{exp(tL)1}](5)\phi(t) = \sin \left[ 2\pi f_{s} L \cdot \left\{\exp \left( \frac{t}{L} \right)-1\right\} \right]\tag{5}
ここに、
L=Teln(fefs)(6)L = \displaystyle \frac{T_{e}}{\ln \left( \frac{f_e}{f_s} \right)}\tag{6}
fsf_s: 初期周波数[Hz]
fef_e: 最終周波数[Hz]
TeT_e: Swept-sineの長さ[sec]

理解を深めるため、(5)式を導入してみます。
ある瞬間における周波数が下記の対数で表されるものとします。
logf(t)=At+logf0(7)\log f(t)=A・t+\log f_0\tag{7}
t=0t=0 のときに f(t)=fsf(t)=f_st=Tet=T_e のときに f(t)=fef(t)=f_e と置いて、これらを(7)式に入れて整理すると、A=(logfelogfs) 1Te=log(fefs)1Te(8)A=(\log f_e -\log f_s)\cdot \dfrac{1}{T_e}=\log\left(\frac {f_e}{f_s}\right)\cdot \dfrac{1}{T_e}\tag{8}
と書けます。さらに、(7)式は指数表現に置き換えて次のように書くことができます。
f(t)= fsexp(At)(9) f(t)= f_s\cdot \exp(At)\tag{9}
位相を求めるためf(t)f(t)を積分します。
f(t)dt=fsexp(At)dt=fs1Aexp(At)C\int f(t) dt=\int f_s\cdot \exp(At) dt=f_s\cdot \frac{1}{A}\cdot\exp(At)+C
t=0t=0 のときには f(0)=0\int f(0)=0 なので、積分定数C=fs1AC=-f_s\dfrac{1}{A} となります。
これを使うと、上式は(10)式になります。
f(t)dt=fs1A{exp(At)1}(10)\int f(t) dt=f_s\cdot \frac{1}{A}\cdot \{\exp(At)-1\} \tag{10}
(5)式、(6)式と同じ表し方にするため、L=1AL=\dfrac{1}{A}とします。
また、log()\log()ln()\ln()で書き改め、周波数を角周波数[rad/s]に書き改めます。
L=1A=1(lnfefs)1Te=Teln(fefs)(6’)L=\dfrac{1}{A}=\dfrac{1}{\left(\ln\frac{f_e}{f_s}\right)\cdot \dfrac{1}{T_e}}=\dfrac{T_e}{\ln \left(\frac{f_e}{f_s} \right)}\tag{6'}
このとき、位相と周波数は
位相ϕ(t)=sin2πf(t)dt=sin[2πfsL{exp(tL)1}](5’){\rm位相} \quad \phi(t)=\sin \int 2\pi\cdot f(t) dt=\sin \left[2\pi f_s L \cdot \left\{\exp \left(\frac{t}{L}\right)-1\right\}\right]\tag{5'}
周波数f(t)=fsexp(tL)(9’){\rm周波数} \quad f(t)=f_s \cdot \exp \left(\frac{t}{L}\right)\tag{9'}

LTspiceでのシミュレーション

下図に数式を利用したCASE 3 とmodulateを利用したCASE 4を比較して載せました。位相、周波数とも当然ですが、どちらも同じになります。(実際は後述するように、影響のでないであろうわずかの位相差があります。)

CASE 3では、式(5)(5')で示す位相と式(9)(9')で示す瞬間周波数をビヘイビア電源で作りました。
CASE 4では、リニアスイープのときのように瞬時周波数をFM端子入力にしてみたのですが満足な結果とはなりませんでした。そこで、この記事から数式を引用し、ビヘイビア電源の電圧(modulateのFM端子入力)を次式で与えました。
V=fsfefs{exp(tL)1}V=\frac{f_s}{f_e-f_s}\cdot \left\{\exp \left(\frac{t}{L}\right)-1\right\}




CASE 3とCASE 4を細かく比較すると、上図のV(out2)-V(out1) で示すわずかな出力差があります。この詳細を調べてみると下の図のように5kHzのときに 422ns200us2ππ240\dfrac{422ns}{200us}\cdot 2\pi\fallingdotseq \dfrac {\pi}{240} の位相差が発生しています。これは問題にならない大きさです。



矩形波のスイープ

サイン波が得られているときには、それに LTspice の符号関数 sgn(x)(x)関数を被せれば矩形波が得られます。符号関数は次のものです。
sgn(x)={1(x>0)0(x=0) 1(x<0)\begin{aligned} \mathrm{sgn}(x) = \begin{cases} \quad 1 & ( x \gt 0) \\ \quad 0 & ( x = 0 ) \\ \ -1 & ( x \lt 0 ) \end{cases} \end{aligned}

この符号関数をサイン出力に掛けると、パルス波が得られます。3例目のデューティ可変は興味本位でやってみましたが、波形を見る限りではうまくいっているようです。この方法は後述の三角波でやった方がduty比の設定が容易だと思います。
  • サイン → パルス リニアスイープ
  • サイン → パルス ログスイープ
  •   → パルス ログスイープ、デューティ可変;Digital → schmtinv(シュミットトリガ インバータ)のしきい値(p-pを0~1 に分割して設定)で設定




三角波のスイープ

三角波でスイープさせる事例を探したら、これ(三角波の周波数掃引@三共社)がありました。

  1. 一つ目の事例は、modulate でサイン波のスイープをつくり、それをパルス波に変換。これをオペアンプで積分して三角波にする方法です。この方法は積分定数が一定なので、周波数が大きくなると振幅が小さくなってしまいます。
  2. この欠点の改良版が2件目の事例です。次のように説明されています。
方形波から三角波を生成する方法では周波数変化があっても振幅を一定に保つようにするには、周波数を変化に応じて、積分時定数も同時に変化させなければならない(前ページで示した例の通り)。
そこで、電流源を積分するコンセプトを利用しつつ三角波の山と谷を検出し、そこで反転する回路を付加することで振幅が一定になる三角波を実現している。

 

第1事例

書き写して、実際にシミュレーションしてみました。まず、第1事例です。
V(cont)がスイープ周波数の入力です。この入力に対して、三角波図形のカーソル読みで約100Hzから約500Hzへスイープしていることが確認できました。



第2事例

第2事例もシミュレーションしてみました。引用元資料に書かれてある説明は半分以上理解できませんが、振幅一定の三角波スイープを得ることができました。ただし、これだけ複雑だとサブサーキットにしないと使いずらいと思います。

シミュレーション条件は1kHzから10kHzへのスイープなのですが、入力周波数を表すビヘイビア電源 B3の出力 V(CONT) は0.2kHzから2kHzです。しかし、三角波図形のカーソル読みでは約1kHzから約10kHzのスイープが得られています。

出力 V(OUT)を微分すると角周波数になるはずです。この計算をすると、理由はわかりませんが、4π4\pi で割ったときのピーク値が入力周波数と一致しました。



第3事例

三角波を表す数式を見つけましたので、これをビヘイビア電源に適用します。
x(t)=acos(cos(x))\begin{aligned} x(t)={\rm acos}(\cos(x)) \end{aligned}

振幅(Amp)とcos(ωt)\cos(\omega t)の与え方に注意が必要ですが、狙い通りの特性を得ることができました。


のこぎり波のスイープ

前項の第3事例の応用です。のこぎり波の振幅をA、周波数をff とするとき、のこぎり波は次式(@Wikipedia)で表されます。
x(t)=2A(ftfloor(ft+12))\begin{aligned} x(t)=2{\rm A}\left( f \cdot t -{\rm floor}\left( f \cdot t +\frac{1}{2}\right)\right) \end{aligned}


Powered by Blogger | Designed by QooQ

keyboard_double_arrow_down

keyboard_double_arrow_down