SPICEの小瓶(55) FM変調波形、ScilabからLTspiceへ波形を輸出

Joseph Halfmoon

前回、Scilab上でのデジタル信号処理波形は定周期だけれども、LTspiceのシミュレーションでは時間ステップが変動するところが違う、ところを観察しました。それじゃScilab上の一定周期の波形をLTspiceに持ち込んだらどうなるの?という疑問があり。まずはScilabからLTspiceに波形を輸出しないとな。

※「SPICEの小瓶」投稿順インデックスはこちら

LTspiceへの波形ファイルの取り込み

老人の朧げな記憶によれば、LTspiceは外部からの波形を取り込むために2種類の方法を用意してくれとります。どちらもVoltage Sourceの波形定義から使用可能なもの。

    1. PWL形式ファイルの読み込み
    2. WAV形式ファイルの読み込み

PWL形式は回路図上でも使える波形定義で t1 v1 t2 v2 … とダラダラと時刻とそのときの電圧を与える表現です。時刻を明記していくので特にサンプリング周波数一定でなくとも表現可能っす。これを別テキストファイルに書き込んで用意しておいて読み込ませる方法です。明快ではあるものの、ちょいとしたスクリプトでも書く必要があります。気力の無い老人にはメンドイっす。

一方、WAV形式は、Windows上などのシンプルな音声データ形式であるWAVファイルにバイナリ値を詰め込む形式です。こちらはサンプリング・レートは一定である必要があります。既に以下の過去回にて Octave(Matlabとよく似た)で生成した波形をLTspiceに読み込ませたことがあり。

SPICEの小瓶(3) Octaveで生成した「波形」をLTspiceしてみる、簡単?

まあ、ScilabもOctaveも似たようなもんだ(ちょっと違うケド)ということでやってみました。ただし問題は、今回波形は「音声データ」としてはサンプリング周波数Fsが高すぎる点です。「そんなWAVファイルは知らん」とかエラーではねられるんじゃないか?どうよ。

前回使用のScilabスクリプトの末尾に、wavwriteを加えたものが以下に。

Fs=500000;
Fsig=1000;
Fc=20000;
t=[0:1/Fs:5/Fsig];
Xsig=sin(2*%pi*Fsig*t);
Xc=sin(2*%pi*Fc*t);
Fdev=Xsig * (Fc*5*(Fsig/Fc));
Xmod=sin(2*%pi*Fc.*t + 2*%pi*cumsum(Fdev)/Fs);
wavwrite(Xmod, Fs, 'C:\var\fm20_1.wav')

案ずるより産むがやすし?ホントか?さくっと書きこみ完了。出来たファイルのプロパティをWindows上で観察するとこんな感じ。wavefileRate

ちゃんと設定のFs=500kHzになっとります。WAVフォーマット、心が広いのう。なお、Scilab上では-1.0~1.0範囲の実数でしたが、生成時に何も指定しないとWAVファイル上では16ビット整数に変換されてます(32ビット化もできた筈。)

上記のScilab出力ファイルをLTspice上に読み込んで波形を愛でる回路が以下に。FMwavefileTest

波形が以下に。FMwavefileTestwave

期待どおりのFM変調波形の輸入に成功しておるようです。

だが、サンプリング周波数はどうなっているの?上記の波形のタイムスタンプを吟味してみたものが以下に。以下は各点間の時間差分ΔTです。deltaTonLTspice

「元波形」が500kHzのときの、となりあう2データ間のΔTは0.000002秒です。上記をみるとそこに「集まって」はいるものの、激しく変化している部分があります。

表計算ソフトでその部分を確認してみます。こんな感じ。deltaChanges

最左端が時刻、真ん中が電圧値、右端がとなりあう2点の間の時間差分ΔTです。マイナスからプラスに向かって値が激しく変動している(しかし微分値はさほど変わらないハズ)付近の前後、急な登りからなだらかになる付近(しかし微分値は大きく変化する)で時間キザミが狭くなっているみたい。

Scilabから一定周期の信号として輸出しても、LTspiceでシミュレーションするときには、LTspiceの御都合により細かく刻んできたりするのね。たまにオリジナルのΔTより長くなることもあるみたいだし。可変。

SPICEの小瓶(54) FM変調波形にみる、LTspiceとScilabの処理の違い へ戻る

SPICEの小瓶(56) FM変調波形、今度はLTspiceからScilabへ波形を輸出? へ進む