前回はLTspiceの非定周期の信号をScilabで処理するためのお手製関数作ってみましたがイマイチ。取り込んだ後で無理やりローパスフィルタをかけてなんとかした感じ。それどころかそのお手製関数にバグあり。しかしそれよりも前回やらなかった方法の方が結果が圧倒的良いので前回の方法は捨ててしまいました。見通しの無さだよ~。
※「SPICEの小瓶」投稿順インデックスはこちら
前回のバグ
前回は、「ある時刻t0のデータv0は、次の時刻t1で新たなデータv1が到来するまでホールドされておる(階段状の波形)としてFs側の時間キザミでサンプリングする。」などと書きながら、取得していたのはある時刻t1の直前の時刻t0のデータv0でなく、あろうことか次の時刻t2のv2を拾っていることに気づきました。お間抜け。しかし、このバグ直しても波形は50歩100歩でイマイチ。しかし前回やらなかった方法の方が遥かに成績がよかったので、そちらに一本化してしまいました。済みませぬ。
今回の方法
今回は前回以下のように書いた方法の実装です。
-
- ある時刻t0のデータv0と次の時刻t1のデータv1は「折れ線グラフ」的に直線で連続しているとしてFs側の時間キザミでサンプリングする。
その実験用関数が以下に。
// Sampling LTWave2 // Fs: sampling frequency [Hz] // AVec: vector to be sampled // t: vector sampling time // y: vector sampling data function [t,y]=samplingLTwave2(Fs, Avec) Tmin=min(Avec(2:$,1)); Tmax=max(Avec(2:$,1)); t=[Tmin:1/Fs:Tmax]; y=[]; widx=2; for idx = 1:length(t) while t(idx) > Avec(widx,1) widx = widx + 1; end if t(idx)==0 then y(idx) = Avec(widx,2); else Ratio = (t(idx)-Avec(widx-1,1))/(Avec(widx, 1)-Avec(widx-1,1)); y(idx) = Avec(widx-1,2) + (Avec(widx, 2)-Avec(widx-1,2))*Ratio; end end endfunction
試用結果
前回と同じLTspiceの入力データに上記の関数を適用して定周期の信号化する方法が以下に。
waveLTspice=csvRead('FMtest.csv','\t'); Fs=500000; [T, Y]=samplingLTwave2(Fs, waveLTspice); plot(T, Y); plotFFT2(Fs, Y', 0);
今回参照すべき数字はサンプリング周波数 Fs のみです。メンドイLPFなどなくしてしまいました。
前回、ガタガタな階段が見えていたのに比べると相当マシな感じ。
LPFなどかけていないのだけれども、無理やり前回LPFかけた波形よりもずっと綺麗でないの。こっちの方が遥かにマシな気がする(気がするだけかよ?)