前回Scilab comm_tbxのask変調関数の様子がおかしい、ということで「自力更生」してみました。今回はaskの次はfskだろ~というありがちな順番で、fskです。しかしfskに関してはcomm_tbxの変調関数の挙動はおかしくないようにも見えるので、よけいな自力更生、の可能性大。念のためか。いやどーも。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※動作確認に使用させていただいているのは、Scilab 6.1.1(Windows版)です。
当方で使用しておりますcomm_tbxは、以下のバージョンです。Scilab環境からATOMS(Scilabのライブラリ管理ツール?)でインストールをいたしたもの。
Scilab Communication Toolbox 0.3.1
自前のBFSK変調関数
前回のASK変調関数と引数をそろえた(実際はコピペ改造)自前のBFSK変調関数のソースが以下に。
-
- BFSK(バイナリ周波数偏移変調)専用です。2値のみ
- CPFSK(連続位相FSK)ではありません。ぶちっとな。
- パルス整形オプション(ガウスフィルタなど)なしっす。
ということで、ほんと形ばかりのものでございます。
// generate BFSK modulated signal // Fs: sampling frequency [Hz] // Fc: carrier frequency [Hz] // Fsym: symbol rate [baud] // h: modulation index [0.5-1.0] // b: test sequence function bfskwave=genBFSK(Fs, Fc, Fsym, h, b) nSym=length(b); fd2=h*Fsym/2; w0i= 2*%pi*(Fc - fd2)/Fs; w1i= 2*%pi*(Fc + fd2)/Fs; nLen=Fs/Fsym; index = 1; for n=1:nSym for i=1:nLen if b(n)==0 then bfskwave(index) = sin(w0i*index); else bfskwave(index) = sin(w1i*index); end index = index +1; end end endfunction
動作確認
まずは生波形レベルで、周波数変調されていることを確認すべく、以下のようなコードを実行してみました。
test2 = genBFSK(10e5, 4e3, 1e3, 1.0, prbs(20)); clf(); plot(test2);
上記出力波形の一部を拡大したものが以下に。周波数変調されておるようです。大丈夫か?
上記の波形は「位相が連続」なように見えますが、滑らかな波形が得られるように引数を選んだ結果であります。引数によってはプッチン、となります。
続いて長め(2000)のビット列に対して、変調指数0.5のミニマムな変調をかけてPSDプロットを描いてみます。
test05 = genBFSK(10e5, 10e4, 10e3, 0.5, prbs(2000)); clf(); plot_psd(test05);
プロットが以下に。その下に変調インデックス1.0のときがあるので、それと比べてみてくだされや。
同じ長さ(2000)のビット列に対して、こんどは変調指数1.0に変えてみた場合が以下に。
test10 = genBFSK(10e5, 10e4, 10e3, 1.0, prbs(2000)); clf(); plot_psd(test10);
PSDプロットが以下に。0.5のときより、ピークの「ツノ2つ」の幅が広がった感じが分かります。
comm_tbxの変調関数ではどうよ
fskに関してはcomm_tbxの変調関数で得られる波形も不審なところはありません。だったらcomm_tbxのでいいじゃん。上記変調インデックス1.0と同様な条件のpsdプロットを求めるコードが以下に。
wf = wf_init('fsk',M=2,index=1.0); mod = mod_init(wf, fs = 10e5, fi = 10e4, fsymb = 10e3); b = prbs(2000); [mod,x] = mod_process(mod,b); clf(); plot_psd(x);
どうなんだろ。