前回「間が持たない」ということで、アナデバ様の元記事ではブロックダイアグラムでアイディアのみ提示されていたパルス平均化弁別器によるFM検波をLTspiceしてみました。シミュレータなので部品使い放題、しかしお惚け老人のなんちゃって回路です。でもこれScilab使ってデジタル信号処理できるんじゃ。やってみました。
※「お手軽ツールで今更学ぶアナログ」投稿順 indexはこちら
※学生でもないのに勝手に実習をさせていただいておりますアナデバ様の記事(日本語版)が以下です。
Scilabによるモデリング
普通は先に数値モデルの検討があり、それから具体回路の設計に落とし、LTspiceシミュレーションで検証して回路化とそんな手順であるはずですが、今回は逆、じょじょに先祖返り?しての数値モデルです。
忘却力の老人はほぼほぼ忘れておりましたが以下の別シリーズ過去回で「位相連続のFM変調」波形を作ってました。
手習ひデジタル信号処理(99) Scilab、位相連続のFM変調方法を実験
ここまでできてりゃ後一息?ホントか?
まずは周波数の設定と信号波形の生成
サンプリング周波数Fs、信号周波数Fsig、搬送波周波数Fcにて信号の5波長分くらいの波形を生成してみました。こんな感じ。
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);
時間軸ベクトルはtで、信号波形ベクトルが Xsig、キャリアが Xc、そして変調されたFM波形が Xmodです。ここまでは過去回と一緒ね。
後はパルス平均化してFM波形
上記で入力のFM波形ができましたが、Scilab上での「パルス平均化弁別器」ちょろい?です。
zindex = find(Xmod(1:$-1) < 0 & Xmod(2:$) >= 0) + 1; Xpulse=zeros(t); Xpulse(zindex)=1;
前回記事では ゼロクロス信号生成のためのコンパレータに LT1394、その出力を等幅のパルスに変換するワンショット・マルチバイブレータにLTC6993-1と、回路シミュレータならでは、部品代も気にせず使ってしまいした。しかし2チップ分のお仕事は上記の実質3行で完了であります。なお、$はScilab独特の記法で、MatlabやOctaveでは end と記述する筈。
さてこれでパルス波形ができたので、後はLPFにかけるだけです。Scilabには各種フィルタを生成する関数などいろいろある中で、今回はIIRフィルタの設計関数を使ってみました。これまた計算のみ、実装時のハード、ソフトなど一切気にすることなく、IIRで7次のローパスフィルタ、バタワース特性、カットオフ周波数はFsig=1000にたいして1500くらいというフィルタを生成してもらいました。その適用が以下に。
[hz]=iir(7, 'lp', 'butt', [Fsig*1.5/Fs, Fc/Fs], [0.1, 0.1]); [Xlpf, zf]=filter(hz.num, hz.den, Xpulse); Xlpf_ampC = 1/max(Xlpf); XLPFamp = Xlpf * Xlpf_ampC;
まばらなパルスを平均化しているので値が小さめっす。そのままでもグラフ化は問題ないのですが、結果のピークが1になるように「アンプ」もかけてます。
さてプロットは以下で。
clf; subplot(5,1,1); plot(t, Xsig); title('Signal'); subplot(5,1,2); plot(t, Xc); title('Carrier'); subplot(5,1,3); plot(t, Xmod); title('FM'); subplot(5,1,4); plot(t, Xpulse); title('ZeroCrossOneShot'); subplot(5,1,5); plot(t, XLPFamp); title('LPF');
FM復調できとるみたいです。前回のLTspiceシミュレーションよりも波形キレイだし。デジタル・フィルタのお陰じゃな。まあピュアな?数値モデルだしのう。。。