📄 one_user.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%2007.3.2 JD程序,场景:基站和1用户单天线,TD下行
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
clc
global gl;
myCst=[1+j,1-j,-1+j,-1-j]; %the constellation
myMap=[3,2,1,0];
subframe=5;
minperusertotalenth=22000;
minlen=floor(minperusertotalenth/(44*subframe));
peruserlenth=minlen*44*subframe;
minDB=-5;maxDB=5;
for snr=minDB:maxDB
snr
error = 0 ;
for lenth=1:minlen*subframe
gl.gu = zeros(1,4);
m=1;ka=1;N=44;w=4;Q=16;
h1(1,:) = Rayleigh_Doppler_multiPath(2000,120,0,0.000675,0.00078125,1.28,[0,781,1563,2344],[0,-3,-6,-9]);
d1 = 2*randint(44,1)-1 + i * (2*randint(44,1)-1);%数字表示用户号,如:d1表示要考察的用户数据
sp1 = d1*ovsf(1);%加OVSF
sp = zeros(44,16);
sp = sp1;%干扰形成
s = zeros(864,1);
for idx = 1:22
s((idx-1)*16+1:idx*16) = sp(idx,:);%装到第一个数据区1-352
end
for idx = 23:44
s((idx-23)*16+1+496:(idx-22)*16+496) = sp(idx,:);%装到第二个数据区497-848
end
s(361:488)= 2*midamble_1;%装midamble
e1(1,:) = s'.*h1(1,:);
power=0;
for i=1:864
tempp=e1(1, i);
power=power+tempp*tempp';
end;
power_s = power/864;
tempp=10^(snr/10);
sigma=sqrt(power_s/tempp);
n1 = normrnd(0,sigma,1,864) + j*normrnd(0,sigma,1,864);
x1_t(1,:) = e1(1,:) + n1%加噪
r_mid1(1,:) = x1_t(1,361:491);%取midamble码,有w-1个延迟
x11 = zeros(1,355);%
x11(1,:) = x1_t(1,1:355);%取第一个数据区数据(1-352),有3个延迟
x1_1 = x11(1,:)';
x12 = zeros(1,355);
x12(1,:)=x1_t(1,497:851);%取第二个数据区数据(497-848),有3个延迟
x1_2 = x12(1,:)';
a1 = a_mid_1;%信道估计
b1 = inv(a1'*a1)*a1';
gl.gu(1,:)=(b1*r_mid1(1,:)')';
a= A_gen_1;%联合检测
h=a'*a;
digh=diag(diag(h));
dighinv=inv(digh);
mt=chol(h);
hinv=inv(mt);
htinv=inv(mt');
s_zf1=hinv*htinv*digh*dighinv*a'*x1_1;
s_zf2=hinv*htinv*digh*dighinv*a'*x1_2;
rs1 = zeros(44,1);%接收端信号比较
for i = 1:22
rs1(i) = s_zf1(i);
rs1(i+22) = s_zf2(i);
end
for k=1:44
zcast_mom=(rs1(k)-myCst).*conj(rs1(k)-myCst);%判断是接近A还是-A
[temp,myIndex]=min(zcast_mom);
index=[myMap(myIndex)];
dst(k)=index;
end;
for k=1:44
cast_mom=(d1(k)-myCst).*conj(d1(k)-myCst)%判断是接近A还是-A
[c_temp,c_myIndex]=min(cast_mom);
index=[myMap(c_myIndex)];
ss(k)=index;
end;
err_num=0;
for n=1:44
if ss(n)~=dst(n)
err_num=err_num+1;
end;
end;
error = error + err_num;
clear m ka N w Q h1 d1 sp sp1 s e1 power tempp power_s sigma x1_t r_mid1 n1 idx...
x11 x1_1 x12 x1_2 a1 b1 gl.gu s_zf1 s_zf2 ry1 ry2 a h digh dighinv mt hinv htinv ...
rs1 i kk ss dst index zcast_mom myIndex cast_mom temp c_temp c_myIndex k n gu;
end;
myBER((snr-minDB)+1,:)=error;
end;
EsN0=[minDB:1:maxDB]
BER=myBER.'
%Draw curves for the results,Eb/N0
figure(1)
semilogy(EsN0,myBER/(1*peruserlenth),'*-');%k=1表示一个用户
xlabel('Es/N0 in dB');
ylabel('bit error rate');
grid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -