前回の続きです。
ノイズを生成してみましたので、それを信号に印加して復調してみます。
Xcos で以下のような回路を作ります。

緑で囲んだブロックが追加分です。
それらのパラメータは以下のようにします。
From workspace 加算器


加算器の方ですが、入力に対する符号と利得を決めることができます。後でここをいじって見ましょう。
とりあえず最初は1:1としておきます。
それと先に、前回までにセーブしたデータを呼び出しておきます。
-->load('BPSKdata')
-->load('BPSK')
-->load('BPSKnoise')
一番最初の 'BPSKdata' がセーブしてなかったですか?
ちょっと前のスクリプトに
//XCOS用データの作成
timesize=size(bpskmodu,'c')
timelength=[0:timesize-1]/512
t1=timelength'
x1=bpskmodu'
//転置行列を生成して、データフィールドを作った。
code=mlist(['st','dims','values','time'],[1,1],x1,t1)
save('BPSKdata',bpskmodu,code)
の最後の行を足して実行しておいて下さい。
さて、結果は波形として以下のようになります。

全体的にノイズだらけになったことが分かると思います。
こうして得られたデータを前回と同じように時間軸ずれを評価してみます。
コードを再掲します。
まずは、Xcos データをコンソールに移して、デジタイズします。
// 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))
結果は、コンソール上には、
column 1 to 18
3. 15. 14. 14. 14. 14. 15. 14. 15. 14. 14. 15. 14. 14. 15. 15. 15. 15.
column 19 to 34
14. 14. 14. 14. 15. 14. 15. 15. 15. 15. 15. 14. 15. 15. 15. 0.
14.53125
0.5070073
となり、ヒストグラムでは、

となります。縦軸が割合になってしまっていて分かりづらいです。何とかしたいのですが。調査中。
14ポイントがベースでしたので、少しズレが出ているのが分かると思います。
ついでに波形をFFTしてみます。
コードは以下のようになります。
//FFT for actualwave
// Xcosで生成したデータをコンソールで扱えるようにする。
actualdata=(getfield(3,actualwave))'
time_count=getfield(4,actualwave)
cycle=time_count(2)-time_count(1)
//サンプル間隔を検出
N=size(actualdata,'c')
f=1/cycle*(0:(N/2))/N
//サンプリング周期とデータ数からFFTマップに対する横軸の値を算出
//1サンプル周期の逆数掛けるサンプル数で最大周波数を計算
n=size(f,'*')
scf(10);
clf(10)
fdata=fft(actualdata)
plot2d(f,abs(fdata(1:n)))
save('BPSKactual',actualwave,actualdata)

ちょっとノイズがいるか、というぐらいですか。
本当はちゃんと S/N で語りたいのですが、まだそこまでいっていません。頑張ります。
加算器のところの計数を1:1から1:2にしてやってみると、
コンソール上は、
column 1 to 18
3. 14. 15. 16. 21. 15. 14. 15. 14. 15. 15. 14. 21. 15. 13. 13. 14. 13.
column 19 to 34
16. 15. 15. 15. 14. 15. 14. 14. 14. 14. 14. 15. 14. 14. 14. 0.
14.8125
1.7859216
となり、ヒストグラムは次の通りです。

時間軸ズレが増えたのが分かります。
ちなみに評価エッジ数は 32 あります。コンソール上のデータ数は 34 ありますが、最初の一つと最後の一つは処理場発生するゴミデータです。で、ノイズ量を増やしていくと、この数が増えると思います。コンソール上のデータ数が 34 を越えたら、評価エッジ数以上のエッジが増えたと云うことで、ノイズの影響を受けてエラーになったと考えることができます。
ノイズを生成してみましたので、それを信号に印加して復調してみます。
Xcos で以下のような回路を作ります。

緑で囲んだブロックが追加分です。
それらのパラメータは以下のようにします。
From workspace 加算器


加算器の方ですが、入力に対する符号と利得を決めることができます。後でここをいじって見ましょう。
とりあえず最初は1:1としておきます。
それと先に、前回までにセーブしたデータを呼び出しておきます。
-->load('BPSKdata')
-->load('BPSK')
-->load('BPSKnoise')
一番最初の 'BPSKdata' がセーブしてなかったですか?
ちょっと前のスクリプトに
//XCOS用データの作成
timesize=size(bpskmodu,'c')
timelength=[0:timesize-1]/512
t1=timelength'
x1=bpskmodu'
//転置行列を生成して、データフィールドを作った。
code=mlist(['st','dims','values','time'],[1,1],x1,t1)
save('BPSKdata',bpskmodu,code)
の最後の行を足して実行しておいて下さい。
さて、結果は波形として以下のようになります。

全体的にノイズだらけになったことが分かると思います。
こうして得られたデータを前回と同じように時間軸ずれを評価してみます。
コードを再掲します。
まずは、Xcos データをコンソールに移して、デジタイズします。
// 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))
結果は、コンソール上には、
column 1 to 18
3. 15. 14. 14. 14. 14. 15. 14. 15. 14. 14. 15. 14. 14. 15. 15. 15. 15.
column 19 to 34
14. 14. 14. 14. 15. 14. 15. 15. 15. 15. 15. 14. 15. 15. 15. 0.
14.53125
0.5070073
となり、ヒストグラムでは、

となります。縦軸が割合になってしまっていて分かりづらいです。何とかしたいのですが。調査中。
14ポイントがベースでしたので、少しズレが出ているのが分かると思います。
ついでに波形をFFTしてみます。
コードは以下のようになります。
//FFT for actualwave
// Xcosで生成したデータをコンソールで扱えるようにする。
actualdata=(getfield(3,actualwave))'
time_count=getfield(4,actualwave)
cycle=time_count(2)-time_count(1)
//サンプル間隔を検出
N=size(actualdata,'c')
f=1/cycle*(0:(N/2))/N
//サンプリング周期とデータ数からFFTマップに対する横軸の値を算出
//1サンプル周期の逆数掛けるサンプル数で最大周波数を計算
n=size(f,'*')
scf(10);
clf(10)
fdata=fft(actualdata)
plot2d(f,abs(fdata(1:n)))
save('BPSKactual',actualwave,actualdata)

ちょっとノイズがいるか、というぐらいですか。
本当はちゃんと S/N で語りたいのですが、まだそこまでいっていません。頑張ります。
加算器のところの計数を1:1から1:2にしてやってみると、
コンソール上は、
column 1 to 18
3. 14. 15. 16. 21. 15. 14. 15. 14. 15. 15. 14. 21. 15. 13. 13. 14. 13.
column 19 to 34
16. 15. 15. 15. 14. 15. 14. 14. 14. 14. 14. 15. 14. 14. 14. 0.
14.8125
1.7859216
となり、ヒストグラムは次の通りです。

時間軸ズレが増えたのが分かります。
ちなみに評価エッジ数は 32 あります。コンソール上のデータ数は 34 ありますが、最初の一つと最後の一つは処理場発生するゴミデータです。で、ノイズ量を増やしていくと、この数が増えると思います。コンソール上のデータ数が 34 を越えたら、評価エッジ数以上のエッジが増えたと云うことで、ノイズの影響を受けてエラーになったと考えることができます。