前回まで、簡単なBPSK変調~復調システムについて、scilab 上で具現化してみました。
この後、どうしていくかというと色々な変調方式について確認していく予定ですが、まずはここまでのデジタル伝送系について評価してみようと思います。
一連の流れを確認します。矢印の後ろは生成された変数です。
・ランダムな 64bit のデータを作りました。--> data
・8倍オーバサンプリングしました。--> data8
・32Hz の正弦波で変調を掛けるためにさらに 64倍しました。--> datasignal
・BPSK 変調を掛けました。--> bpskmodu
・Xcos で使うため、データ形式変換を行いました。--> code
・Xcos 上で、32Hz 正弦波とかけ算を行い、ローパスフィルタを通して復調しました。--> グラフ
とここまででした。
では、Xcos で作られたデータをスクリプトで処理すべく、Xcos をちょっと変更します。


念のため結果も載せておきます。

これで、LPF を通したデータ変数 readback を得ました。
readback はまだアナログデータですので、スライサを使って二値化します。今回は少しヒステリシスを掛けます。さらに元のデータと比較して、エラーがないかチェックします。コードは以下の通り。
※コードを載せ忘れていましたので、追記します。以下
// Xcosで生成したデータをコンソールで扱えるようにする。
dmddata=(getfield(3,readback))'
//これらを二値化する。
dmdsize=size(dmddata,'c')
readdata=[]
offsetdata=0
for i=1:dmdsize-10
// 出力データはあらかじめ 10ポイントずらしておく。
if dmddata(1,i)>offsetdata then readdata(1,i+10)=0
else readdata(1,i+10)=1
end
//ヒステリシスを掛ける。
offsetdata=0.2*(readdata(1,i+10)-0.5)
end
//BPSK ファイルにセーブ
save('BPSK',datasignal,dmddata,readdata)
※追記ここまで
// datasignal と readdata の時間差チェック
//データサイズの取得
datasize=size(datasignal,'c')
xordata=modulo(datasignal+readdata,2)
i=1
j=1
l=0
devilength=[]
while i<=datasize do k=1,
devilength(1,j)=0
while xordata(1,i+k-1)==1 do devilength(1,j)=devilength(1,j)+1,k=k+1,l=1,end
if l==1 then j=j+1
end
l=0
i=i+k
end
disp(devilength)
scf(3);
clf(3)
subplot(3,1,1)
plot(datasignal)
subplot(3,1,2)
plot(readdata)
subplot(3,1,3)
plot(xordata)
sizelength=size(devilength,'c')-1
disp(mean(devilength(2:sizelength)))
disp(stdev(devilength(2:sizelength)))
scf(4);
clf(4)
leveldata=[0:40]
histplot(leveldata,devilength(2:sizelength))
簡単に要点を書いておくと、デジタル伝送をした結果、当然のことながら信号は時間的に遅れます。従って、元のデータをエクスクルーシブオア(XOR)をとると、遅れ時間分が残ります。普通はこの時間は一定なのですが、今後、伝送信号(bpskmodu)にノイズを加える予定ですので、さらに遅れを加えておきます。これはノイズの影響で復調信号のエッジが前に進んでも良いように、という意味です。10ポイント進めています。
結果として、グラフ3には各波形(元波形、復調波形、差分)が表示され、グラフ4には差分データの誤差分のヒストグラムが表示されます。

※コードの実行結果として以下のデータがコンソール上に現れます。
column 1 to 18
3. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14.
column 19 to 34
14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 0.
14.
0.
※ここまで
最初の '3' は時間遅れにより入ってしまうので、ヒストグラム作成の際に無視しています。最後のゼロも計数上入ってしまいますので、無視します。間の32個のデータが有効です。その後の'14'は平均、'0'は標準偏差です。

ということで、復調されたデータは意図的にずらした10ポイントを除くと、4ポイントのタイミング遅れで再生されていることが分かります。
なお、この値ですが今回のケースではローパスフィルタの時定数が支配的ですので、興味のある方は Xcos 上で色々いじって見て下さい。
次は、この伝送系にノイズが乗ったらどうなるかを調べてみたいと思います。
この後、どうしていくかというと色々な変調方式について確認していく予定ですが、まずはここまでのデジタル伝送系について評価してみようと思います。
一連の流れを確認します。矢印の後ろは生成された変数です。
・ランダムな 64bit のデータを作りました。--> data
・8倍オーバサンプリングしました。--> data8
・32Hz の正弦波で変調を掛けるためにさらに 64倍しました。--> datasignal
・BPSK 変調を掛けました。--> bpskmodu
・Xcos で使うため、データ形式変換を行いました。--> code
・Xcos 上で、32Hz 正弦波とかけ算を行い、ローパスフィルタを通して復調しました。--> グラフ
とここまででした。
では、Xcos で作られたデータをスクリプトで処理すべく、Xcos をちょっと変更します。
変更したと云っても、データを出力するための[To Workspace]を2個追加しただけです。それぞれのパラメータは次のようにしておきます。


念のため結果も載せておきます。

これで、LPF を通したデータ変数 readback を得ました。
readback はまだアナログデータですので、スライサを使って二値化します。今回は少しヒステリシスを掛けます。さらに元のデータと比較して、エラーがないかチェックします。コードは以下の通り。
※コードを載せ忘れていましたので、追記します。以下
// Xcosで生成したデータをコンソールで扱えるようにする。
dmddata=(getfield(3,readback))'
//これらを二値化する。
dmdsize=size(dmddata,'c')
readdata=[]
offsetdata=0
for i=1:dmdsize-10
// 出力データはあらかじめ 10ポイントずらしておく。
if dmddata(1,i)>offsetdata then readdata(1,i+10)=0
else readdata(1,i+10)=1
end
//ヒステリシスを掛ける。
offsetdata=0.2*(readdata(1,i+10)-0.5)
end
//BPSK ファイルにセーブ
save('BPSK',datasignal,dmddata,readdata)
※追記ここまで
// datasignal と readdata の時間差チェック
//データサイズの取得
datasize=size(datasignal,'c')
xordata=modulo(datasignal+readdata,2)
i=1
j=1
l=0
devilength=[]
while i<=datasize do k=1,
devilength(1,j)=0
while xordata(1,i+k-1)==1 do devilength(1,j)=devilength(1,j)+1,k=k+1,l=1,end
if l==1 then j=j+1
end
l=0
i=i+k
end
disp(devilength)
scf(3);
clf(3)
subplot(3,1,1)
plot(datasignal)
subplot(3,1,2)
plot(readdata)
subplot(3,1,3)
plot(xordata)
sizelength=size(devilength,'c')-1
disp(mean(devilength(2:sizelength)))
disp(stdev(devilength(2:sizelength)))
scf(4);
clf(4)
leveldata=[0:40]
histplot(leveldata,devilength(2:sizelength))
簡単に要点を書いておくと、デジタル伝送をした結果、当然のことながら信号は時間的に遅れます。従って、元のデータをエクスクルーシブオア(XOR)をとると、遅れ時間分が残ります。普通はこの時間は一定なのですが、今後、伝送信号(bpskmodu)にノイズを加える予定ですので、さらに遅れを加えておきます。これはノイズの影響で復調信号のエッジが前に進んでも良いように、という意味です。10ポイント進めています。
結果として、グラフ3には各波形(元波形、復調波形、差分)が表示され、グラフ4には差分データの誤差分のヒストグラムが表示されます。

※コードの実行結果として以下のデータがコンソール上に現れます。
column 1 to 18
3. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14.
column 19 to 34
14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 14. 0.
14.
0.
※ここまで
最初の '3' は時間遅れにより入ってしまうので、ヒストグラム作成の際に無視しています。最後のゼロも計数上入ってしまいますので、無視します。間の32個のデータが有効です。その後の'14'は平均、'0'は標準偏差です。

ということで、復調されたデータは意図的にずらした10ポイントを除くと、4ポイントのタイミング遅れで再生されていることが分かります。
なお、この値ですが今回のケースではローパスフィルタの時定数が支配的ですので、興味のある方は Xcos 上で色々いじって見て下さい。
次は、この伝送系にノイズが乗ったらどうなるかを調べてみたいと思います。