QPSK信号的包络就是y(1)和y(2)的模
求出这个QPSK信号包络的均值和方差
均值应该是信号的能量,也就是1
方差可以通过计算加噪后的能量,然后减去信号的能量得到
a=1/sqrt(2)
b=-1/sqrt(2)
ser=zeros(1,11)
power = 0
for i=1:1
error=0
for j=1:10000
n=10^(log10(0.5)-(i/10))
u=rand
z=(sqrt(n/2))*(sqrt(2*log(1/(1-u))))
u=rand
gsrv1=z*cos(2*pi*u)
gsrv2=z*sin(2*pi*u)
s=fix(rand(1,2)*2)
if s(1)==0
s(1)=a
elseif s(1)==1
s(1)=b
end
if s(2)==0
s(2)=a
elseif s(2)==1
s(2)=b
end
y(1)=s(1)+gsrv1
y(2)=s(2)+gsrv2
power = power + y(1)^2+y(2)^2
end
end
variance = (power-10000)/10000
如果统计的量越大,越精确
下面是一路信号的QPSK基带仿真的程序:n=1e4
M=4
Tx=randint(n,1,M)
h=modem.pskmod(M)%产生调制QPSK句柄
y=modulate(h,Tx) %用QPSK句柄调制Tx信号
EbNo=10;
yNoise=awgn(y,EbNo,'measured') %加噪声
g=modem.pskdemod(M) %产生解调句柄
Rx=demodulate(g,yNoise)%解调信号
num_biterr=biterr(Tx,Rx) %计算错误的比特数
Pb=num_err/n %计算错误的比特概率
程序没有错,不是直接运行的,你需要建立三个.m文件,分别把两个Function和最上面的程序粘贴上去。我修改了一下你只需要建立两个.m文件然后运行第一个文件就可以得到结果。SNRindB1=0:2:10
SNRindB2=0:0.1:10
for i=1:length(SNRindB1)
[pb,ps]=cm_sm32(SNRindB1(i))
smld_bit_err_prb(i)=pb
smld_symbol_err_prb(i)=ps
end
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10)
theo_err_prb(i)=(1/2)*erfc(sqrt(2*SNR)/sqrt(2))
end
title('QPSK误码率分析')
semilogy(SNRindB1,smld_bit_err_prb,'*')
axis([0 10 10e-8 1])
hold on
% semilogy(SNRindB1,smld_symbol_err_prb,'o')
semilogy(SNRindB2,theo_err_prb)
legend('仿真比特误码率','理论比特误码率')
hold off
另一个.m文件
function [pb,ps]=cm_sm32(SNRindB)
N=10000
E=1
SNR=10^(SNRindB/10)
sgma=sqrt(E/SNR)/2
s00=[1 0]
s01=[0 1]
s11=[-1 0]
s10=[0 -1]
for i=1:N
temp=rand
if (temp<0.25)
dsource1(i)=0
dsource2(i)=0
elseif (temp<0.5)
dsource1(i)=0
dsource2(i)=1
elseif (temp<0.75)
dsource1(i)=1
dsource2(i)=0
else
dsource1(i)=1
dsource2(i)=1
end
end
numofsymbolerror=0
numofbiterror=0
for i=1:N
n=sgma*randn(size(s00))
if((dsource1(i)==0)&(dsource2(i)==0))
r=s00+n
elseif((dsource1(i)==0)&(dsource2(i)==1))
r=s01+n
elseif((dsource1(i)==1)&(dsource2(i)==0))
r=s10+n
else
r=s11+n
end
c00=dot(r,s00)
c01=dot(r,s01)
c10=dot(r,s10)
c11=dot(r,s11)
c_max=max([c00 c01 c10 c11])
if (c00==c_max)
decis1=0decis2=0
elseif(c01==c_max)
decis1=0decis2=1
elseif(c10==c_max)
decis1=1decis2=0
else
decis1=1decis2=1
end
symbolerror=0
if(decis1~=dsource1(i))
numofbiterror=numofbiterror+1
symbolerror=1
end
if(decis2~=dsource2(i))
numofbiterror=numofbiterror+1
symbolerror=1
end
if(symbolerror==1)
numofsymbolerror=numofsymbolerror+1
end
end
ps=numofsymbolerror/N
pb=numofbiterror/(2*N)
记得要保存为cm_sm32.m,然后运行前面那个.m文件就可以了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)