久しぶりのこのトピックへの書き込みです。きっかけは ko さんからいただいたコメントです。
BPSK 信号の生成から復調をここの記事通りやった見たがその通りに動かないということで調査したところ、BPSK 関連の記事を書いている最中に別のテーマ「アイパターン」を取り上げた際、同じ変数名を使って別の信号を生成していました。で、気が付かずにこの信号を使って BPKS の復調を Xcos でシミュレーションしたため、BPSK 関連記事だけをピックアップしてスクリプトを書いた結果と異なってしまいました。
もっともそれでも復調できなくてはいけないはずですが、まだよく分かりません。
とりあえず改めて記事と同じ波形が出るようなスクリプトを掲示しますので参考にして下さい。
信号生成は以下のスクリプトを使います。ko さんがグラフの表示を細かく設定したスクリプトを送ってくれたので、それを使わせていただきます。
//ランダムデジタルデータの発生
//初期値の設定
rand('seed',0)
//一様分布の乱数発生。数値範囲 0-1.0
randomdata=(rand(1,64,'uniform'))
//'0','1' 符号化するために、0.5を足して整数部分のみを抽出
data=int(0.5+randomdata)
//オーバサンプリングする
for i=1:64
j=(i-1)*8
if data(1,i)==0 then data8(1,j+1:j+8)=[0 1 0 1 1 0 0 0];
else data8(1,j+1:j+8)=[1 0 1 0 0 1 1 1];
end
end
//BPSK 変調を掛ける。
datasignal=[]
//データサイズを取得
datasize=size(data8,'c')
//1bit辺りの周期数を設定
f=4;
//1周期16サンプル
Fs=1/16/f
//データ数と刻みを設定
n=0:Fs:datasize-Fs
//元データ 1bit が 8 x 4 x 16 される。
for i=1:datasize
for j=1:16*f
if data8(1,i)==0 then datasignal(1,(i-1)*16*f+j)=0;
else datasignal(1,(i-1)*16*f+j)=1;
end
end
end
// '0'ならば位相をずらさない、'1'ならば位相
phiy=datasignal*%pi
bpskmodu=sin(f*2*%pi*n+phiy)
//表示
scf(1);
clf(1)
subplot(2,1,1)
a=gca(); //アクティブな軸のオブジェクトを取得
a.data_bounds(:,1)=[0;550]; //X軸の範囲を -1~1に
a.data_bounds(:,2)=[0;1.5]; //Y軸の範囲を 0~2に
plot(n,datasignal)
subplot(2,1,2)
plot(n,bpskmodu)
a=gca(); //アクティブな軸のオブジェクトを取得
a.data_bounds(:,1)=[500;510]; //X軸の範囲を -1~1に
a.data_bounds(:,2)=[-1.5;1.5]; //Y軸の範囲を 0~2に
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')
赤字の部分が変更点です。
後半にある「//表示」以下の plot 関連のスクリプトは ko さん製です。ありがとうございます。
最終行ですが、scilab 5.5.1 までは、'bpskmodu','code' のクォーテーションマークはいらないのですが、scilab 6 以降は必要になるとのことで、実行すると警告が出ます。よって今までの記事に対してクォーテーションマークが追加されています。
こうして作った、'BPSKdata' を
-->load('BPSKdata')
で呼び出して、Xcos でシミュレーションすれば記事通りの波形が出ます。
改めて波形を見てみると結構疑問なことが出てきて、余裕があるときに調べなくてはいけないと思っています。
BPSK 信号の生成から復調をここの記事通りやった見たがその通りに動かないということで調査したところ、BPSK 関連の記事を書いている最中に別のテーマ「アイパターン」を取り上げた際、同じ変数名を使って別の信号を生成していました。で、気が付かずにこの信号を使って BPKS の復調を Xcos でシミュレーションしたため、BPSK 関連記事だけをピックアップしてスクリプトを書いた結果と異なってしまいました。
もっともそれでも復調できなくてはいけないはずですが、まだよく分かりません。
とりあえず改めて記事と同じ波形が出るようなスクリプトを掲示しますので参考にして下さい。
信号生成は以下のスクリプトを使います。ko さんがグラフの表示を細かく設定したスクリプトを送ってくれたので、それを使わせていただきます。
//ランダムデジタルデータの発生
//初期値の設定
rand('seed',0)
//一様分布の乱数発生。数値範囲 0-1.0
randomdata=(rand(1,64,'uniform'))
//'0','1' 符号化するために、0.5を足して整数部分のみを抽出
data=int(0.5+randomdata)
//オーバサンプリングする
for i=1:64
j=(i-1)*8
if data(1,i)==0 then data8(1,j+1:j+8)=[0 1 0 1 1 0 0 0];
else data8(1,j+1:j+8)=[1 0 1 0 0 1 1 1];
end
end
//BPSK 変調を掛ける。
datasignal=[]
//データサイズを取得
datasize=size(data8,'c')
//1bit辺りの周期数を設定
f=4;
//1周期16サンプル
Fs=1/16/f
//データ数と刻みを設定
n=0:Fs:datasize-Fs
//元データ 1bit が 8 x 4 x 16 される。
for i=1:datasize
for j=1:16*f
if data8(1,i)==0 then datasignal(1,(i-1)*16*f+j)=0;
else datasignal(1,(i-1)*16*f+j)=1;
end
end
end
// '0'ならば位相をずらさない、'1'ならば位相
phiy=datasignal*%pi
bpskmodu=sin(f*2*%pi*n+phiy)
//表示
scf(1);
clf(1)
subplot(2,1,1)
a=gca(); //アクティブな軸のオブジェクトを取得
a.data_bounds(:,1)=[0;550]; //X軸の範囲を -1~1に
a.data_bounds(:,2)=[0;1.5]; //Y軸の範囲を 0~2に
plot(n,datasignal)
subplot(2,1,2)
plot(n,bpskmodu)
a=gca(); //アクティブな軸のオブジェクトを取得
a.data_bounds(:,1)=[500;510]; //X軸の範囲を -1~1に
a.data_bounds(:,2)=[-1.5;1.5]; //Y軸の範囲を 0~2に
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')
赤字の部分が変更点です。
後半にある「//表示」以下の plot 関連のスクリプトは ko さん製です。ありがとうございます。
最終行ですが、scilab 5.5.1 までは、'bpskmodu','code' のクォーテーションマークはいらないのですが、scilab 6 以降は必要になるとのことで、実行すると警告が出ます。よって今までの記事に対してクォーテーションマークが追加されています。
こうして作った、'BPSKdata' を
-->load('BPSKdata')
で呼び出して、Xcos でシミュレーションすれば記事通りの波形が出ます。
改めて波形を見てみると結構疑問なことが出てきて、余裕があるときに調べなくてはいけないと思っています。