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

📄 fig_adaptive_mud_time_invariant_environment.m

📁 张贤达老师 通信信号处理4-9章的程序 这本书是张老师的经典之作。
💻 M
字号:
% Fig_adaptive_mud_time_invariant_environment

%%%%%%%%%%%%%%%%% Blind Multiuser Detection Using LMS Algorithms %%%%%%%%%%%
clear
N=31;                            % the spreading gain
SourceNum=2000;                  % the number of source signal
IterNum=SourceNum*N;             % the number of noise
RunningTime=10;                 % the iteration number
userNum=13;                      % the total number of users
mu=2e-5;                         % learning rate
SNR=[20 30 30 30 30 30 40 40 40 40 40 40 50]-20;          % the SNR correspond to the first user
% handle=waitbar(0,'Please wait...');                       % uicontral waitbar's handle

for j=1:RunningTime                                       % begin to circulation 
    noise=randn(IterNum,1)/(10^(20/20));                  % generate noise
    
    source=sign(rand(userNum,SourceNum)-0.5);                       % generate bipolar signal
    source=diag(10.^(SNR/20))*source;
    
    spreadingCode=goldcode(log2(N+1))/sqrt(N);            % generate spreading code using the function goldcode
    spreadingCode=spreadingCode(:, 2:userNum+1);
    % spreaded signal               
%     SpreadedSignal=[spreadingCode(:,1:10)*source(1:10,1:600) spreadingCode*source(:,601:1200) spreadingCode(:,1:8)*source(1:8,1201:SourceNum)];
    SpreadedSignal=spreadingCode*source;
    x=zeros(N,1);                                         % the variant part of weigh vector
    
    for i=1:SourceNum
        ReceivedSignal(:,i)=SpreadedSignal(:,i)+noise(1+(i-1)*N:i*N);     % calculate the received signal, that passs the channel
        Z_MF=ReceivedSignal(:,i)'*spreadingCode(:,1);
        Z=ReceivedSignal(:,i)'*(spreadingCode(:,1)+x);
        x=x-mu*Z*(ReceivedSignal(:,i)-Z_MF*spreadingCode(:,1));
        SINR(j,i)=10*log10(abs((spreadingCode(:,1)+x)'*source(1,i)*spreadingCode(:,1)/((spreadingCode(:,1)+x)'*(ReceivedSignal(:,i)-source(1,i)*spreadingCode(:,1))))^2);
        OutputEnergy(j,i)=abs((spreadingCode(:,1)+x)'*ReceivedSignal(:,i))^2;
        MSE(j,i) = (source(1,i)-(spreadingCode(:,1)+x)'*ReceivedSignal(:,i))^2;
    end
end
FONTSIZE=0.315;         % 单位为厘米;  
LINEWIDTH_AXES=1.2;%140/42;  % corresponding to 0.140mm 
LINEWIDTH_WAVE=0.5;%180/42;  % corresponding to 0.180mm
figNumber=figure('Name','three adaptive mud algorithms in static environment', 'Visible','on');
set(gcf,'Color','white');
plot(mean(SINR),'b','LineWidth',LINEWIDTH_WAVE)
hold on
xlabel('Iteration Number','FontUnits','centimeters','FontName','Times New Roman','FontSize',FONTSIZE);  
ylabel('SINR','FontUnits','centimeters','FontName','Times New Roman','FontSize',FONTSIZE);
title('\bf The Average SINR versus Iteration Number of Three Adaptive Algorithms','Color','blue','FontUnits','centimeters','FontName','Times New Roman','FontSize',FONTSIZE*1.2);
set(gca,'XColor','blue','YColor','blue','FontUnits','centimeters','FontName','Times New Roman','FontSize',FONTSIZE,'LineWidth',LINEWIDTH_AXES);
set(figNumber,'PaperPosition',[0.634518 6.34518 20.3046*0.8 15.2284*0.8]);     %Shrink the figure size  




%%%%%%%%%%%%%%%%% Blind Multiuser Detection Using RLS Algorithms %%%%%%%%%%%
clear
N=31;
SourceNum=2000;
IterNum=SourceNum*N;
RunningTime=10;
lamda=0.995;
userNum=13;

SNR=[20 30 30 30 30 30 40 40 40 40 40 40 50]-20;
% handle=waitbar(0,'Please wait...');

for j=1:RunningTime
    noise=randn(IterNum,1)/(10^(20/20));
    source=sign(rand(userNum,SourceNum)-0.5);
    source=diag(10.^(SNR/20))*source;
    spreadingCode=goldcode(log2(N+1))/sqrt(N);
    spreadingCode=spreadingCode(:, 2:userNum+1);
%     SpreadedSignal=[spreadingCode(:,1:10)*source(1:10,1:600) spreadingCode*source(:,601:1200) spreadingCode(:,1:8)*source(1:8,1201:SourceNum)];
    SpreadedSignal=spreadingCode*source;
    R_inv=1e5*eye(N);
    for i=1:SourceNum
        ReceivedSignal(:,i)=SpreadedSignal(:,i)+noise(1+(i-1)*N:i*N);
        k=R_inv*ReceivedSignal(:,i)/(lamda+ReceivedSignal(:,i)'*R_inv*ReceivedSignal(:,i));
        R_inv=1/lamda*(R_inv-k*ReceivedSignal(:,i)'*R_inv);
        c=1/(spreadingCode(:,1)'*R_inv*spreadingCode(:,1))*R_inv*spreadingCode(:,1);
        SINR(j,i)=10*log10(abs(c'*source(1,i)*spreadingCode(:,1)/(c'*(ReceivedSignal(:,i)-source(1,i)*spreadingCode(:,1))))^2);
        OutputEnergy(j,i)=abs(c'*ReceivedSignal(:,i))^2;
        MSE(j,i) = (source(1,i)-c'*ReceivedSignal(:,i))^2;
    end
end
FONTSIZE=0.315;         % 单位为厘米;  
LINEWIDTH_AXES=1.2;%140/42;  % corresponding to 0.140mm 
LINEWIDTH_WAVE=0.5;%180/42;  % corresponding to 0.180mm
plot(mean(SINR),'g','LineWidth',LINEWIDTH_WAVE)






%%%%%%%%%%%%%%%%% Blind Multiuser Detection Using Kalman Filter %%%%%%%%%%%
clear
N=31;
SourceNum=2000;
IterNum=SourceNum*N;
RunningTime=10;
userNum=13;

mu=2e-5;
SNR=[20 30 30 30 30 30 40 40 40 40 40 40 50]-20;
    
for j=1:RunningTime
    noise=randn(IterNum,1)/(10^(20/20));
    source=rand(userNum,SourceNum);
    for i=1:userNum
        source(i,find(source(i,:)>0.5))=1;
        source(i,find(source(i,:)<=0.5))=-1;
    end
    source=diag(10.^(SNR/20))*source;
    spreadingCode=goldcode(log2(N+1))/sqrt(N);
    spreadingCode=spreadingCode(:, 2:userNum+1);
    C=[spreadingCode(:,1) rand(N,N-1)];
%     SpreadedSignal=[spreadingCode(:,1:10)*source(1:10,1:600) spreadingCode*source(:,601:1200) spreadingCode(:,1:8)*source(1:8,1201:SourceNum)];
    SpreadedSignal=spreadingCode*source;
    for i=2:N
        temp=zeros(N,1);
        for k=1:i-1
            temp=temp+C(:,i)'*C(:,k)*C(:,k);
        end
        C(:,i)=C(:,i)-temp;
        C(:,i)=C(:,i)/sqrt(sum(C(:,i).^2));
     end
     K=eye(N-1);
     w=zeros(N-1,1);
     for i=1:SourceNum
         ReceivedSignal(:,i)=SpreadedSignal(:,i)+noise(1+(i-1)*N:i*N);
         y=spreadingCode(:,1)'*ReceivedSignal(:,i);
         d=C(:,2:N)'*ReceivedSignal(:,i);
         g=K*d/(d'*K*d+1);
         K=K-g*d'*K;
         w=w+g*(y-d'*w);
         c=spreadingCode(:,1)-C(:,2:N)*w;
         result(j,i) = c'*ReceivedSignal(:,i);
         SINR(j,i)=10*log10(abs(c'*source(1,i)*spreadingCode(:,1)/(c'*(ReceivedSignal(:,i)-source(1,i)*spreadingCode(:,1))))^2);
         OutputEnergy(j,i)=abs((c'*ReceivedSignal(:,i)))^2;

     end
     MinAveEnergy(j)=abs(1/(spreadingCode(:,1)'*inv(ReceivedSignal*ReceivedSignal'/SourceNum)*spreadingCode(:,1)));
     RemainEnergy(j,:)=abs(OutputEnergy(j,:)-MinAveEnergy(j));

end
FONTSIZE=0.315;         % 单位为厘米;  
LINEWIDTH_AXES=1.2;%140/42;  % corresponding to 0.140mm 
LINEWIDTH_WAVE=0.5;%180/42;  % corresponding to 0.180mm
plot(mean(SINR),'y','LineWidth',LINEWIDTH_WAVE)

⌨️ 快捷键说明

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