前回気づいたことが一つ。テスト用のシーケンス(疑似乱数系列)を生成するのに、prbs関数出力をnrz関数に通してシンボル長を踏まえて「信号」らしく成形しました。しかしNRZ以外の符号化用関数が見当たりません。NRZ以外は使わんだろ~ってこと?今回はNRZI信号を生成する自前関数を作成。他も以下同文で作れると、ホントか?
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上で、Scilab6.1.1およびScilab上のツールボックス Scilab Communication Toolbox 0.3.1(以下comm_tbx)を使用させていただいとります。
伝送路符号化
勝手に推測(邪推?)すると Scilabのcomm_tbxの「中の人」は、NRZ以外使わんのじゃね、と思ったのかもしれません。でも教科書的には伝送路符号化として各種の方式を列挙してあるのがフツーです。使うかどうかは知らんけど。以下のマスキシステム様のホームページには各種の符号化が列挙されておりますぞ。
自前NRZI関数を作成
comm_tbxに含まれている nrz関数は以下のような形式です。
y = nrz(b, osf)
bがバイナリシーケンスで、osfがオーバサンプリングファクタです。ぶちゃけ bの中の0や1の「1桁」がosf個だけ並んだシーケンスが y に「信号」として返されます。
上記の真似っ子で今回作成の自前関数は以下のようにいたしました。
y = makeNRZI(b, osf)
そのソースが以下に。何の芸もないコードっす。
// NRZI pulse shaping (by J.Halfmoon Oct. 19, 2023) // b: input binary sequence // osf: Over-Sampling Factor(symbol length) function nrzi=makeNRZI(b, osf) nSym=length(b); index = 1; curr = 0; for n=1:nSym if b(n)==1 then curr = bitxor(curr, 1); end for i=1:osf nrzi(index) = curr; index = index +1; end end endfunction
自前NRZI関数をエクササイズ
以下のようなシーケンスで、上記で作成したNRZI関数を動かしてみました。比較のため「素の」NRZの結果と並べてます。コードは以下に
n=10; osf=5; x=prbs(n); yNRZ=nrz(x, osf); yNRZI=makeNRZI(x, osf); clf(); subplot(2,1,1); plot_binary(yNRZ); title('NRZ'); subplot(2,1,2); plot_binary(yNRZI); title('NRZI');
NRZIを元のバイナリシーケンスに戻す関数も作らないと良いのかどうか分からんぜよ。まあ、似た方法で、RZでもなんでも符号化はできそうな気がする。大丈夫か?