Scilabのcomm_tbxにはバイナリシーケンスをNRZ信号化する関数はあれども他の符号化関数がないです。そこで前回、自前NRZI関数を作成。しかし生成した信号から元のバイナリシーケンスに戻す逆方向の関数も欲しいです。動作確認のためなんだけれども。ついでにNRZ信号をバイナリに戻す関数も作成。どちらもテスト用っす。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上で、Scilab6.1.1およびScilab上のツールボックス Scilab Communication Toolbox 0.3.1(以下comm_tbx)を使用させていただいとります。
NRZ信号、NRZI信号をバイナリに戻す関数
comm_tbxのnrz関数や、前回自前作成のmakeNRZI関数で作成される「信号」は、バイナリシーケンスの各ビットをシンボル長だけ引き伸ばした(NRZIの場合は変換)数列でした。シンボル長さが微妙に変動したり、雑音が乗ったりしてない「ピュア」な信号です。今回作成の「逆関数」はこのような「ピュア」信号を元のバイナリに戻すもので信号処理の実用というより、動作確認用のものであります。
まずはNRZIをもとに戻す関数(ホントに正しいのか知らんけど。)
// extract binary sequence from NRZI pulses (by J.Halfmoon Oct. 26, 2023) // ONLY FOR IDEAL PULSES, NOT FOR REAL. // nrzi: input NRZI pulse // osf: Over-Sampling Factor(nrzi, osf) function b=extNRZI(nrzi, osf) nSym=int(length(nrzi)/osf); index = 1; curr = 0; old=0; for n=1:nSym if nrzi((n-1)*osf+1)==1 then curr = bitxor(old, 1); else curr = old end old = nrzi((n-1)*osf+1); b(index) = curr; index = index +1; end endfunction
続いて NRZ をもとに戻す関数(こっちゃは簡単、多分OKね。)
// extract binary sequence from NRZ pulses (by J.Halfmoon Oct. 19, 2023) // ONLY FOR IDEAL PULSES, NOT FOR REAL. // nrzP: input NRZ pulse // osf: Over-Sampling Factor(nrzi, osf) function b=extNRZ(nrzP, osf) nSym=int(length(nrzP)/osf); index = 1; for n=1:nSym b(index) = nrzP((n-1)*osf+1); index = index +1; end endfunction
上記関数の動作確認
以下のようにして、疑似乱数バイナリシーケンス x をNRZ、NRZI信号(信号名先頭y)とした後で、今回作成の関数で「元に」戻して(信号名先頭x)プロットしてみました。
n=30; osf=5; x=prbs(n); yNRZ=nrz(x,osf); yNRZI=makeNRZI(x, osf); xNRZ=extNRZ(yNRZ, osf); xNRZI=extNRZI(yNRZI, osf); clf(); subplot(3,1,1); plot_binary(x); title('x'); subplot(3,1,2); plot_binary(xNRZ); title('xNRZ'); subplot(3,1,3); plot_binary(xNRZI); title('xNRZI');
もとには戻った。ホントにOKかどうかは知らんけど。テスト用のパターンが欲しいぞなもし。