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

Joseph Halfmoon

別シリーズでパルス平均化弁別器というものを題材に使いFM変調信号から元の信号を取り出す(復調)ようなシミュレーションをLTspiceとScilabの両方で行いました。お惚け老人的には処理結果の信号は「同じようなもんでないの」。下手な信号休むに似たり。違うか。しかし、両者の数値信号の間には暗くて深い断絶があるみたいです。

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

別シリーズのパルス平均化弁別器

別シリーズ「お手軽ツールで今更学ぶアナログ」にてパルス平均化弁別器を取り扱ったのは以下の2回です。

お手軽ツールで今更学ぶアナログ(216) FM検波、なんちゃってパルス平均化弁別器?

お手軽ツールで今更学ぶアナログ(217) なんちゃってパルス平均化弁別器のScilabモデル

第216回で電子部品を使った「なんちゃって」回路をでっち上げ、LTspiceにてその挙動をシミュレーション、第217回では「信号処理」ということで「同様な考え方」のアルゴリズムをScliabを使ってシミュレーションしてみました。LTspiceScilabEC上記のプロットの左が第216回の結果で、右が第217回の結果です。一番下が「復調」された信号波形です。まあコマケーところに目をつぶって「周波数」をみれば、元に戻っているような感じっす。

暗くて深い断絶

結論から言ってしまえば、「暗くて深い断絶」は以下です。

    • Scilab上の「信号処理」では、一定間隔(1/Fs、Fsはサンプリング周波数)の時間インターバル毎に処理している
    • LTspiceの方、回路の挙動により時間間隔は短くなったり(多分急激な曲率変化があるとき)、長くなったり(単調な変化のとき)する

今回はシミュレーションの出だしのところ、FM変調信号の生成のところに着目して、その様子を味わってみたいと思います。

Scliab上での処理

別シリーズの第217回で使用したコードから、FM変調波を生成する前半部分をとりだし、その末尾にFFTをかけて周波数応答を見るプロットコマンドを置いたものが以下に。

サンプリング周波数Fs、信号は正弦波で1kHz固定。キャリア周波数Fcは20kHzです。オフセット0、振幅1であります。

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);
plotFFT2(Fs, Xmod, 0);

上記により「位相に断絶のない滑らかな」FM変調信号が得られる筈。

ここで時間間隔を与えている(ベクトルとして生成)のは以下の行です。

t=[0:1/Fs:5/Fsig];

上記により、1/F [s] 間隔で、信号5周期分の時間ベクトル、勿論、等間隔が得られます。

なお、ここで使用しているplotFFT2関数はFFTプロット用にFFT関数に「一枚被せた」関数です。正規化周波数ではなく、横軸の実際の周波数[Hz]にたいして縦軸[dB]にてプロットするもの。コードが以下に。

// FFT plot (dB)
// Fs: sampling frequency [Hz]
// wav: time domain seq(nSample)
// opt: Window function 0:none, 1:hamming
function plotFFT2(Fs, wav, opt)
    N = size(wav, '*');
    regN = 2/N;
    select opt
    case 1 then
        winf = window('hm',N);
        regF = 2;
    else
        winf = ones(1,N);
        regF = 1;
    end
    y = fft(wav .* winf);
    xf = Fs*(0:(N/2))/N; //associated frequency vector
    nf = size(xf, '*');
    clf();
    plot2d(xf,  20*log10(abs(y(1:nf)) * regN * regF));
    xtitle('FFT', '[Hz]', '[dB]');
endfunction

上記で観察したFM変調波が以下に。Scilab_FMwaveFc20Fsig1

まあ、教科書に出てくるような波形でないかい?ホントか?

LTspice上でのFM変調波の生成

LTspice上では以下の2つの方法で、FM変調波を生成したことがあります。

    1. 独立電圧源のSFFM関数を使う
    2. SpecialFunctionsの中のmodulateモデル(ビヘイビア)を使う

まずはキメウチのFM変調波を生成するのにお手軽なSFFMでのFM変調波の生成が以下に。振幅は5Vになってますが、キャリア周波数は20kHz、信号周波数は1kHz、変調指数は5とな。LTspiceSFFM_Fc20Fsig1settings

上記の回路図でFM_INとなっているノードにFFTかけて観察したものが以下に。LTspiceSFFM_Fc20Fsig1

肝心の信号部分はScilabと「似たようなもん」だけれども、なんだか高い周波数のところ「うるさい」のでないかい。。。低いところもガタガタいってるけれども。

一方、modulator部品を使って、上記と「似た」信号を作ってみたものが以下に。ただし、Voutの振幅は1Vになってます。LTspiceModulator_Fc20Fsig1CIR

上記ではFM端子に1Vを入力すると変調波は25kHzとなり、0Vを入力すると15kHzとなる筈。

Vout信号をFFTで観察したものが以下に。LTspiceModulator_Fc20Fsig1

肝心な部分付近は上よりも良い感じではあるけれど、やっぱり高い周波数にはうるさいヒトがいるね。

LTspiceの時間間隔を観察

以下は上記のシミュレーション結果をファイルに落としたものを表計算ソフトで読み込んだものに、ΔT時間とそのMAX、MINを書き加えてみたものです。画像は先頭付近だけだけれども。LTspiceTIME

いやあ、一瞬出だしで定間隔になりかけているけど、その後は結構バラバラ。最大、最小の差をみると4桁も違うし。。。

しかし時間ステップがバラバラでどうやってFFTかけているのだろ?謎は深いデス。素人老人が知らないだけ?

SPICEの小瓶(53) LTspice、AC解析「.AC 1」の件、誤解していた! へ戻る

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