前回の続きです。

ノイズを生成してみましたので、それを信号に印加して復調してみます。
Xcos で以下のような回路を作ります。
イメージ 3
緑で囲んだブロックが追加分です。
それらのパラメータは以下のようにします。

From workspace                   加算器
イメージ 1イメージ 2

加算器の方ですが、入力に対する符号と利得を決めることができます。後でここをいじって見ましょう。
とりあえず最初は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)

の最後の行を足して実行しておいて下さい。

さて、結果は波形として以下のようになります。
イメージ 4
全体的にノイズだらけになったことが分かると思います。
こうして得られたデータを前回と同じように時間軸ずれを評価してみます。

コードを再掲します。

まずは、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 

となり、ヒストグラムでは、
イメージ 5
となります。縦軸が割合になってしまっていて分かりづらいです。何とかしたいのですが。調査中。
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)

イメージ 7
ちょっとノイズがいるか、というぐらいですか。
本当はちゃんと 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 

となり、ヒストグラムは次の通りです。
イメージ 6

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