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

Joseph Halfmoon

前回は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などなくしてしまいました。

まずは時間波形。amplingLTwave2_TIM

前回、ガタガタな階段が見えていたのに比べると相当マシな感じ。

さてFFT結果が以下に(~50kHzまで部分)samplingLTwave2_FFT

LPFなどかけていないのだけれども、無理やり前回LPFかけた波形よりもずっと綺麗でないの。こっちの方が遥かにマシな気がする(気がするだけかよ?)

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です