手習ひデジタル信号処理(83) Scilab、FSK、自力更生の必要なしだけれどやってみた

Joseph Halfmoon

前回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);

上記出力波形の一部を拡大したものが以下に。周波数変調されておるようです。大丈夫か?bfsk_waveform

上記の波形は「位相が連続」なように見えますが、滑らかな波形が得られるように引数を選んだ結果であります。引数によってはプッチン、となります。

続いて長め(2000)のビット列に対して、変調指数0.5のミニマムな変調をかけてPSDプロットを描いてみます。

test05 = genBFSK(10e5, 10e4, 10e3, 0.5, prbs(2000));
clf(); plot_psd(test05);

プロットが以下に。その下に変調インデックス1.0のときがあるので、それと比べてみてくだされや。bfsk_H_05

同じ長さ(2000)のビット列に対して、こんどは変調指数1.0に変えてみた場合が以下に。

test10 = genBFSK(10e5, 10e4, 10e3, 1.0, prbs(2000));
clf(); plot_psd(test10);

PSDプロットが以下に。0.5のときより、ピークの「ツノ2つ」の幅が広がった感じが分かります。bfsk_H_10

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);

結果が以下に。見比べたけれども上のと同じように見えます。commtbx_fsk_10

どうなんだろ。

手習ひデジタル信号処理(82) Scilab、ライブラリ再生成してみたけどダメ。自力更生。へ戻る

手習ひデジタル信号処理(84) Scilab、BPSK、自前版とtbx版、微妙な違い? へ進む