clc,clear,close all; %%
%我们使用四个用户的CDMA系统
coefficients=[1 0 1 0 0]; %5级左移m序列码发生器的反馈系数 mseq=mseries(coefficients); %生成31×31的m序列码矩阵
walsh=[1 1 1 1;1 -1 1 -1;1 1 -1 -1;1 -1 -1 1]; %4阶WALSH矩阵 pn=mseq(1:31); %PN码
%四个用户发出的信号,可以随便设定
user0=[ 1,-1,-1,-1,-1,-1, 1, 1, 1,-1,-1, 1, 1,-1, 1,-1, 1,-1,-1,-1,-1,-1, 1, 1, 1,-1,-1, 1, 1,-1, 1,-1];%用户1,可以是随机信号
user1=[-1,-1,-1,-1,-1, 1, 1,-1, 1,-1,-1, 1, 1, 1, 1,-1, 1,-1,-1, 1, 1,-1, 1, 1, 1,-1, 1, 1, 1,-1, 1,-1];%用户2,可以是随机信号
user2=[ 1,-1,-1,-1, 1,-1, 1, 1, 1,-1,-1, 1, 1,-1, 1, 1, 1,-1, 1,-1,-1,-1, 1, 1, 1, 1,-1, 1, 1, 1,-1,-1];%用户3,可以是随机信号
user3=[-1,-1, 1,-1,-1, 1, 1,-1, 1,-1,-1, 1, 1, 1, 1,-1, 1,-1,-1, 1,-1, 1, 1,-1, 1,-1,-1, 1, 1,-1, 1, 1];%用户4,可以是随机信号
%==========================================================================
for t=1:length(user0)
user=[user0(t),user1(t),user2(t),user3(t)];%四个用户分别发送1,-1,1,1
for i=1:4%四用户信号和WALSH矩阵相乘 for j=1:4
walsh_user(j,i)=user(i)*walsh(i,j); end end
for i=1:4%变成串行信号
walsh_user2(4*i-3)=walsh_user(i,1); walsh_user2(4*i-2)=walsh_user(i,2); walsh_user2(4*i-1)=walsh_user(i,3); walsh_user2(4*i-0)=walsh_user(i,4); end
for i=1:31 for j=1:16
walsh_user3(i,j)=walsh_user2(j); end end
for i=1:31 for j=1:16
pn_walsh_user(i,j)=walsh_user3(i,j)*pn(i); end end
%并----串
for i=1:31 for j=1:16
pn_walsh_user_c(i*j)=pn_walsh_user(i,j); end end
%以上是信号调制过程
%========================================================================== %一下是信号解调过程
%串----并 for i=1:31 for j=1:16
pn_walsh_user_rec(i,j)=pn_walsh_user_c(i*j); end end
%pn解扩 for i=1:31 for j=1:16
walsh_user_rec(i,j)=pn_walsh_user_rec(i,j)*pn(i); end end
for i=1:31 for j=1:16
walsh_user_rec2(j)=walsh_user_rec(i,j); end end
%walsh解扩
user_rec2(1,1)=walsh_user_rec2(1); user_rec2(1,2)=walsh_user_rec2(2); user_rec2(1,3)=walsh_user_rec2(3); user_rec2(1,4)=walsh_user_rec2(4);
user_rec2(2,1)=walsh_user_rec2(5); user_rec2(2,2)=walsh_user_rec2(6); user_rec2(2,3)=walsh_user_rec2(7); user_rec2(2,4)=walsh_user_rec2(8);
user_rec2(3,1)=walsh_user_rec2(9); user_rec2(3,2)=walsh_user_rec2(10); user_rec2(3,3)=walsh_user_rec2(11);
user_rec2(3,4)=walsh_user_rec2(12);
user_rec2(4,1)=walsh_user_rec2(13); user_rec2(4,2)=walsh_user_rec2(14); user_rec2(4,3)=walsh_user_rec2(15); user_rec2(4,4)=walsh_user_rec2(16);
for i=1:4 for j=1:4
rec(i,j)= user_rec2(i,j)*walsh(i,j); end end
%===============接收信号===================================
rec_signal= user_rec2(1,1:4);
%========画信号============================================================== if t==1 figure;
subplot(511)
stairs(1:4,user,'r');%用户信号 axis([1,4,-2,2]);
title('用户发送的信号')
subplot(512)%随机码 stairs(1:31,pn); axis([1,31,-2,2]); title('随机码')
subplot(513)%调制WALSH stairs(1:16,walsh_user2,'r'); axis([1,16,-2,2]); title('调制WALSH')
subplot(514) %发送
stairs(1:496,pn_walsh_user_c); axis([1,496,-2,2]); title('发送信号')
subplot(515) %数据接收 stairs(1:4,rec_signal,'r'); axis([1,4,-2,2]);
title('数据接收信号') hold on; end end
figure;
subplot(411); stairs(1:32,user0);
axis([1,32,-2,2]);title('user0数据接收信号')
subplot(412); stairs(1:32,user1);
axis([1,32,-2,2]);title('user1数据接收信号')
subplot(413); stairs(1:32,user2);
axis([1,32,-2,2]);title('user2数据接收信号')
subplot(414); stairs(1:32,user3);
axis([1,32,-2,2]);title('user3数据接收信号') %%
%=====================以上是加上噪声的 误码率测试=================================================
prompt={'请输入用户个数:','请输入用户发送信息个数:','请输入用户码功率','请输入噪声功率','请输入要测试的用户ID号'};
name=['码分多址复用技术测试']; line=1;
defaultanswer={'4','100','1 2 3 4', '10','1'};
glabel=inputdlg(prompt,name,line,defaultanswer);%对话框 num1=str2num(char(glabel(1,1))); %对话框 num2=str2num(char(glabel(2,1))); %对话框 num3=str2num(char(glabel(3,1))); %对话框 num4=str2num(char(glabel(4,1))); %对话框 k=str2num(char(glabel(5,1))); %对话框
UserNumber=num1;%用户数
inflength=num2;%用户信息序列长度 a=num3; %用户信息功率 Pn=num4; %噪声功率 sigma=1;%噪声标准差
%========================================================================== N=31;%伪随即序列的阶数
R=(ones(UserNumber)+(N-1)*eye(UserNumber))/N; %相关系数矩阵
b=2*randint(UserNumber,inflength)-1; %用户信息矩阵(随机+1,-1矩阵) coefficients=[1 0 1 0 0]; %5级左移m序列码发生器的反馈系数 mseq=mseries(coefficients); %生成31×31的m序列码矩阵 mseq=mseq(1:UserNumber,1:N);
%==================以上生成随即序列========================================
%===================生成噪声========================== n1=Pn*normrnd(0,1,1,inflength*N); n=zeros(UserNumber,inflength); for j=1:inflength
ntemp=n1(1,((j-1)*N+1):j*N); n(:,j)=(mseq*ntemp')/N; end
%*******************************************
A=diag(a);
y=R*A*b+n; %传统单用户检测
ydec=inv(R)*y; %线性解相关多用户检测
ymmse=inv(R+sigma^2*inv(A))*y; %最小均方误差多用户检测 for i=1:UserNumber
ylen(i)=length(find(sign(real(y(i,:)))-b(i,:))); ydeclen(i)=length(find(sign(real(ydec(i,:)))-b(i,:)));
ymmselen(i)=length(find(sign(real(ymmse(i,:)))-b(i,:))); BER_y(i)=ylen(i)/inflength;
BER_ydec(i)=ydeclen(i)/inflength; BER_ymmse(i)=ymmselen(i)/inflength; end
snr=20*log10(a(1)/Pn); disp('信噪比为'); disp(snr);
disp('误码个数为'); disp(ylen(k)); disp(ydeclen(k)); disp(ymmselen(k)); disp('误码率为'); disp( BER_y(k)); disp(BER_ydec(k)); disp(BER_ymmse(k));