⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp.m

📁 CDMA多用户检测中传统检测器
💻 M
字号:
%product received vector 
function [p]=BP(snr_in_dB)
Lc=31;                  %Lc is frame size 码长
snr=10^(snr_in_dB/10);   %信噪比由dB形式转化               也有的写为snr=exp(snr_in_dB*log(10)/10)
sgma=1;                  % noise standard deviation is fixed 定义方差
Eb=2*sgma^2*snr;         % signal level required to achieve the given 
                         % signal to noise ratio 
E_chip=Eb/Lc;            % energy per chip 每个码片能量
A=[sqrt(Eb),sqrt(Eb),sqrt(Eb)];     %sqrt(20*Eb),sqrt(20*Eb),sqrt(20*Eb),sqrt(20*Eb)  
% A为干扰用户的幅度,0-30,最多不要超过31,干扰强度为20dB,BPSK中
% 干扰强度=10*log(Ak^2/E1),E1为期望用户的能量,若想实现干扰强度随snr_in_dB变化,则干扰用户为sqrt(Eb*exp(snr_in_dB/10))
N=1000;                  % number of bits transmitted  发送的信息位,如果图效果不好可以改大                 
K=length(A);             % number of users 用户数,即A的长度
 
% gold sequence for the duration of the bit is generated next 
connections1=[1 0 1 0 0];
connections2=[1 1 1 0 1];
gold_seq=get_gold(connections1,connections2);  %产生31x31的扩频码
user1code=(1/sqrt(Lc))*gold_seq(:,31);   %定义了用户1的扩频码,1/sqrt(Lc)表示归一化,把用户的扩频码定义在第31列,可以减少干扰用户的影响

% The generation of the data, noise, interference, decoding process and error 
% counting is performed all together in order to decrease the run time of
% the program. This is accomplished by avoiding very large sized vectors. 


%算法赋初值
 num_of_err=0;  %错误码数先赋0
 S=zeros(31,K+1);  %定义扩频码矩阵
 S(:,K+1)=user1code; 
 w=[A,sqrt(Eb)];
 W=diag(w);
 
%从此位开始一直到最后一个end,是循环,作用是发送并检测,用接收与发送比较计算错误码个数

for i=1:10, 
  
  b=zeros(K+1,1);   %定义发送端发送的信息列
  y=zeros(K+1,1);   %定义经过匹配滤波器组相关处理后的信息列  
 
% generate the next data bit  产生新的数据位
  temp=rand;  
  if (temp<0.5),
      data=-1;
  else
      data=1;
  end
  % the transmitted signal is 
  trans_sig=sqrt(Eb)*data*user1code; %与公式相比sqrt(Eb)相当于Ak data相当于bk user1code为sk   sqrt(Eb)认为是期望用户,
%   与A中干扰用户幅度定义不同,为了突出最后图的效果
  
% AWGN with variance sgma^2 
  noise=sgma*randn(Lc,1);   %产生一列31行的随机噪声,加性高斯白噪声  不是sgma^2是因为sgma本身为1(或许可以这么认为)
 
  % interference user data is dat
  % 产生K个干扰用户,dat是干扰用户数据,真正的用户为K+1个,期望用户直接定义为sqrt(Eb)
  inter_sig=zeros(31,1);

  for k=1:K,
      temp=rand;  
      if (temp<0.5),
          dat=-1;
      else
          dat=1;
      end
      inter_sig=inter_sig+A(k)*dat*(1/sqrt(Lc))*gold_seq(:,k); %干扰用户数据的扩频码放在1到第K列,期望用户的在第31列
      S(:,k)=(1/sqrt(Lc))*gold_seq(:,k); 
      b(k)=dat;
  end;
  b(K+1)=data;
  
  R=corrcoef(S);  %扩频码的互相关矩阵
 
 % received signal  
  rec_sig=trans_sig+noise+inter_sig;   %接收到的数据是31x1位的
 
 

 % making detect                       开始检测
  for k=1:K+1,
      y(k)=rec_sig'*S(:,k);               %求出经过匹配滤波器组相关处理后的信息列 
  end
 % 建立Bp神经网络,并加以训练
  net=newff(minmax(y'),[3,1],{'tansig','purelin'},'traingd','learngd');
  net.trainParam.goal=0.001;
  net.trainParam.lr=0.05;
  net.trainParam.eporchs=300;
  net.trainParam.show=NaN;
  b=b';
  net=train(net,y',b);
end
% 网络训练好以后,开始正式检测
for i=1:N, 
  
  b=zeros(K+1,1);   %定义发送端发送的信息列
  y=zeros(K+1,1);   %定义经过匹配滤波器组相关处理后的信息列  
 
% generate the next data bit  产生新的数据位
  temp=rand;  
  if (temp<0.5),
      data=-1;
  else
      data=1;
  end
  % the transmitted signal is 
  trans_sig=sqrt(Eb)*data*user1code; %与公式相比sqrt(Eb)相当于Ak data相当于bk user1code为sk   sqrt(Eb)认为是期望用户,
%   与A中干扰用户幅度定义不同,为了突出最后图的效果
  
% AWGN with variance sgma^2 
  noise=sgma*randn(Lc,1);   %产生一列31行的随机噪声,加性高斯白噪声  不是sgma^2是因为sgma本身为1(或许可以这么认为)
 
  % interference user data is dat
  % 产生K个干扰用户,dat是干扰用户数据,真正的用户为K+1个,期望用户直接定义为sqrt(Eb)
  inter_sig=zeros(31,1);

  for k=1:K,
      temp=rand;  
      if (temp<0.5),
          dat=-1;
      else
          dat=1;
      end
      inter_sig=inter_sig+A(k)*dat*(1/sqrt(Lc))*gold_seq(:,k); %干扰用户数据的扩频码放在1到第K列,期望用户的在第31列
      S(:,k)=(1/sqrt(Lc))*gold_seq(:,k); 
      b(k)=dat;
  end;
  b(K+1)=data;
  
  R=corrcoef(S);  %扩频码的互相关矩阵
 
 % received signal  
  rec_sig=trans_sig+noise+inter_sig;   %接收到的数据是31x1位的
 
 

 % making detect                       开始检测
  for k=1:K+1,
      y(k)=rec_sig'*S(:,k);               %求出经过匹配滤波器组相关处理后的信息列 
  end
 % 调用神经网络,得到输出估计值
  output=sim(net,y');
  output(K+1)=sign(output(K+1));  
  if  (output(K+1)<=0),
           bit=-1;
      else
           bit=1;
      end;
     
      if (bit~= data), 
        num_of_err=num_of_err+1; 
      end;
end;       % 对应for i=1:N,
p=num_of_err/N;  
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -