前々回が自前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しているみたいです。
例によって長めのビット列に変更し、PSD(Power Sepctral Density)プロットを描いてみました。
test2 = genBPSK(10e5, 10e4, 10e3, prbs(2000)); clf(); plot_psd(test2);
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プロットが以下です。およよ、なんだかチガクない?
「生波形」みたら違いが分かった?
昨年あたり大流行?だった「生xx」みたいで恥ずかしいのですが「生波形」をくらべてみたら、自前版とtbx版の違いが明らかに。
上記のように、位相が切り替わるのは0もしくはπの位置(BPSKなので180度ひっくり返る)になってます。位相0かπなのでY軸的には0のところで切り替わってます。そのせいか上下のピーク(π/2、3π/2位置)は、FsとFcの関係がズレている場合(上の場合など)、うまく値が乗らないので頭がちょん切れてます。
一方 tbx版を見てみると。どうも90度(π/2、3π/2位置)ずれた位置でシンボルが切り替わっているみたい。こんな感じ。
お陰でピーク(上では1か-1になるはず)がピッタンコで出てるみたいです。そのかわりどちらも0でつながる自前にくらべてシンボルが切り替わると絶対値で2の変化があらわれとります。
ぶっちゃけ、自前生成でsinをcosに返れば90度位相がズレてtbx版と似た挙動を示すと思うのですけれどもどうなんだろ。どっちもPSKちゃ、PSKだし。ま、違いがあることは分かったと、どうすんだ。