📄 dbpsk.m
字号:
% function [Pb,ErrP]=DBPSK(EbN0)
%7.3dB,Pb=.001,ErrP=.0075//8.3dB,Pb=.00024,ErrP=.0037
%9.89dB,Pb=10e-5,ErrP=0//5.2dB,Pb=10e-2,ErrP=.0367
clear;clc;format compact;
EbN0=5.2;%dB
%验证差分相干解调
LPN=255;
LFram=4;
REN=10^(EbN0/10);
Pb=2*Q((2*REN)^.5)*(1-Q((2*REN)^.5))
CNR=10*log10(128e3)+EbN0;%10e-5:62.4(未编码);10e-3:60(未编码)
f0=70e6;
fb=128e3;
fc=fb*LPN;
fs=fb*256*5;
fl=70e6+0;
sgma=(1+2*10^(CNR/10)/fs)^-.5;
P0=2*sgma^2*10^(CNR/10)/fs;
P=P0;
%信息及其差分
BSer=sign(randn(1,(LFram+1)*125));
DBSer=[];
for i=1:(LFram+1)
DBSer=[DBSer 1 1];
for j=1:125
tp=length(DBSer);
if(BSer((i-1)*125+j)==DBSer(tp))
DBSer=[DBSer 1];
else
DBSer=[DBSer -1];
end
end
DBSer=[DBSer 1];
end
%伪码构造
ms=2*genmCode(8,'FF','11D')-1;
PNSer=ms(1:255);
%成型滤波器
SSFIR=fir1(16,1.3*fc/fs,kaiser(17,5));
SSCache=zeros(1,17);SSCache1=zeros(1,17);
%抽取滤波器
DDCFIR10=fir1(60,1.3*fb/fs,kaiser(61,7));
DDCCache10=zeros(1,61);
DDCFIR16=fir1(32,1.3*fb/(fs/10),kaiser(33,7));
DDCCache16=zeros(1,33);
%符号滤波器
SymFIR=fir1(64,1.3*fb/(fs/160),kaiser(65,5));
SymFIRCache=zeros(1,65);SymFIRCache1=zeros(1,65);
pr=0;pc=0;pb=0;PNStt=zeros(1,5*8);enDcn=0;
pl=2*pi/6;
BDelay=zeros(1,32);SymSum=0;SymOut=[];
i1=0;i2=0;i3=0;i4=0;i5=0;i6=0;Pcnt=0;
stop=0;
while(stop==0)
i1=i1+1;
if(mod(i1-1,65536)==0)
noise=sgma*randn(1,65536);
end
%构造接收信号
pc=mod(pc+fc/fs,255);pn=PNSer(mod(round(pc),255)+1);pn=1;
pb=pb+fb/fs;sb=DBSer(round(pb)+1);
pr=pr+2*pi*f0/fs;
rcv=(2*P)^.5*pn*sb*sin(pr)+1*noise(mod(i1-1,65536)+1);
if(mod(i1,163840)==0)
Pcnt=1;P=0;pr=pr+2*pi*rand(1);
end
if(Pcnt~=0)
Pcnt=Pcnt+1;
end
if(Pcnt==128)
Pcnt=0;P=P0;
end
%混频
pl=pl+2*pi*fl/fs;
mix=rcv*exp(-1j*pl);
SSCache=[SSCache(2:17) mix];
mixo=SSCache*SSFIR';
%解扩
pn=PNSer(mod(round(pc),255)+1);pn=1;
SSCache1=[SSCache1(2:17) pn];
PNStt=[PNStt(2:40) pn];
DSO=mixo*(SSCache1*SSFIR');
if(sum(PNStt)==40)
enDcn=1;
end
%抽取滤波
DDCCache10=[DDCCache10(2:61) DSO];
if(mod(i1,10)==0)
i2=i2+1;
ddc1=DDCCache10*DDCFIR10';
DDCCache16=[DDCCache16(2:33) ddc1];
if(mod(i2,4)==0)
i3=i3+1;
ddc2=DDCCache16*DDCFIR16';
%SymFIRCache=[SymFIRCache(2:65) ddc2];
%ddc3=SymFIRCache*SymFIR';
mul=ddc2*conj(BDelay(1));
BDelay=[BDelay(2:32) ddc2];
mul1=real(mul);
V1(i3)=mul1;
if(i3>20)%71
i4=i4+1;
SymSum=SymSum+mul1;
if(i4<8)
enDcn=0;
end
if(i4==32)%if(enDcn)%
enDcn=0;
i5=i5+1;
if((i5>1) & (i5<127))
if(SymSum>0)
SymOut=[SymOut 1];
else
SymOut=[SymOut -1];
end
i6=i6+1;
if(mod(i6,200)==0)
i6;
end
end
SymSum=0;i4=0;
if(i5==128)
i5=0;
end
end
end
if(i6==LFram*125)
stop=1;
end
end
end
end
RLen=length(SymOut);
Err=BSer(1:RLen)-SymOut;
figure(2);stem(Err,'.');
figure(1);stem(BSer(1:RLen),'.');hold on;stem(SymOut,'r:.');
ErrP=sum(abs(Err))/2/RLen
% disp('OVER!');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -