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

Joseph Halfmoon

前々回が自前ASK、前回が自前BFSKであったので、今回は自前BPSKです。comm_tbxのASK変調が期待と違うために始めた「自前」シリーズですが、前回BFSKでは与えたパラメータでは差は見えずでした。今回のBPSKその差は微妙というべきか、大きいというべきか。素人にはよくわかりませぬが素性は理解したと。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※動作確認に使用させていただいているのは、Scilab 6.1.1(Windows版)です。

当方で使用しておりますcomm_tbxは、以下のバージョンです。Scilab環境からATOMS(Scilabのライブラリ管理ツール?)でインストールをいたしたもの。

Scilab Communication Toolbox 0.3.1

自前のBPSK変調関数

自前で関数そろえると良いのは、引数を「お好み」で揃えられるところですな(といって実際はコピペですが)。

    • 第1引数、サンプリング周波数
    • 第2引数、キャリア周波数
    • 第3引数、シンボルレート

までは不動の並びであります。その後が凸凹しているのはまずかったか。ASK/BFSKで四番にテストシーケンスを入れたら不動の上位打線が構成できたものを。後で変えとくか?

ソースが以下に。いままでで一番、シンプルというか無理やり感がないです。PSK好きだな~。

// generate BPSK modulated signal
// Fs: sampling frequency [Hz]
// Fc: carrier frequency [Hz]
// Fsym: symbol rate [baud]
// b: test sequence
function bpskwave=genBPSK(Fs, Fc, Fsym, b)
    nSym=length(b);
    mw = [];
    nLen=Fs/Fsym
    w0= 2*%pi*Fc/Fs;
    index = 1;
    for n=1:nSym
        for i=1:nLen
            bpskwave(index) = sin(w0*index + %pi*b(n));
            index = index +1;
        end
    end
endfunction
動作確認

まずは短いシーケンスで生波形レベルで確認してみます。確認用のコードが以下に。

test = genBPSK(10e5, 4e3, 1e3, prbs(20));
clf(); plot(test);

波形の一部を拡大したプロットが以下に。「どこかで見たような」プロット波形であります。BPSKしているみたいです。BPSKwave

例によって長めのビット列に変更し、PSD(Power Sepctral Density)プロットを描いてみました。

test2 = genBPSK(10e5, 10e4, 10e3, prbs(2000));
clf(); plot_psd(test2);

プロットが以下に。BPSKpsd_A

comm_tbxの変調関数ではどうよ

さて、comm_tbxの変調関数を使って生成したbpskの波形と比べてみます。上記の自前関数とパラメータをそろえた「つもり」の設定のコードが以下に。

wf = wf_init('bpsk');
mod = mod_init(wf, fs = 10e5, fi = 10e4, fsymb = 10e3);
b = prbs(2000);
[mod,x] = mod_process(mod,b);
clf(); plot_psd(x);

上記出力のPSDプロットが以下です。およよ、なんだかチガクない?BPSKpsd_B

「生波形」みたら違いが分かった?

昨年あたり大流行?だった「生xx」みたいで恥ずかしいのですが「生波形」をくらべてみたら、自前版とtbx版の違いが明らかに。

まずは自前版です。Awave

上記のように、位相が切り替わるのは0もしくはπの位置(BPSKなので180度ひっくり返る)になってます。位相0かπなのでY軸的には0のところで切り替わってます。そのせいか上下のピーク(π/2、3π/2位置)は、FsとFcの関係がズレている場合(上の場合など)、うまく値が乗らないので頭がちょん切れてます。

一方 tbx版を見てみると。どうも90度(π/2、3π/2位置)ずれた位置でシンボルが切り替わっているみたい。こんな感じ。Bwave

お陰でピーク(上では1か-1になるはず)がピッタンコで出てるみたいです。そのかわりどちらも0でつながる自前にくらべてシンボルが切り替わると絶対値で2の変化があらわれとります。

ぶっちゃけ、自前生成でsinをcosに返れば90度位相がズレてtbx版と似た挙動を示すと思うのですけれどもどうなんだろ。どっちもPSKちゃ、PSKだし。ま、違いがあることは分かったと、どうすんだ。

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

手習ひデジタル信号処理(85) Scilab、自前版NCO、単なるSIN/COSの計算だけど へ進む