gusucode.com > m4k20功率分配图 mimo功率优化,OFDM典型仿真程序,贪婪算法仿真程序 > code/mimo功率优化/opt_mutual_mimo.m

    clear all;
close all;
clc;

disp('Initializing...');

%--------------------PARAMETERS--------------------
% change these parameters to run different simulations
N = 4;
M = 4;
NSAMPLE = 100;

SNR_dB = [-10:5:15]; % SNR in dB
K = 5;  % channel K factor

random_data = 0; % generate random channel mean and correlation matrices
spec_case = 0; % 1 is no mean, 2 is no tx corr

% setting up various file names
if spec_case == 1
  suffix = 'corr';
elseif spec_case == 2
  suffix = 'mean';
else
  suffix = 'both';
end


%--------------------PROGRAM--------------------
I = eye(N);
SNR = 10.^(SNR_dB/10);

  Rt_half = randn(N,N) + j*randn(N,N)%;
  Rt = Rt_half*Rt_half'%;
  Rt = Rt/(K+1)%;
  
  H0 = randn(M,N) + j*randn(M,N)%;
  H0 = H0/norm(H0, 'fro')*sqrt(K*M*N/(K+1))%;  
end

if (spec_case == 2)
  % check for mean only case
  Rt = I*real(trace(Rt))/N; % this is to retain the same K factor
elseif (spec_case == 1)
  % check for correlation only case
  Rt = Rt/trace(Rt)*N; % full correlation
  H0 = zeros(M,N);
end

Rt_sqrt = sqrtm(Rt);


S0 = (H0'*H0 + M*Rt);
[U lambda] = eig(S0);
lambda = real(diag(lambda));


lambda_equal = ones(N,1)/N;  

disp('Calculating Jensen''s upper bound on average mutual information...');
for k = 1:length(SNR_dB)
  disp(['  SNR = ', num2str(SNR_dB(k)), 'dB']);  
  lambda_jen_wf(:,k) = waterfill(SNR(k), lambda);
  mutual_jen_wf(k) = ...
      - mutual_mimo_func_diag(M,N,H0*U,U'*Rt_sqrt*U,...
                              SNR(k),lambda_jen_wf(:,k),NSAMPLE,I);
  mutual_equal(k) = ...
      - mutual_mimo_func_diag(M,N,H0,Rt_sqrt,...
                              SNR(k),lambda_equal,NSAMPLE,I); 
end

figure;
plot(SNR_dB, mutual_jen_wf/log(2), 'b+-');
hold on;
plot(SNR_dB, mutual_equal/log(2), 'r:s');
xlabel('SNR(dB)');
ylabel('频谱效率(bps/Hz)');
legend('功率优化算法', '等功率分配算法',2);


figure;
plot(SNR_dB, lambda_equal*ones(1, length(SNR_dB)), 'r:s');
hold on;
plot(SNR_dB, lambda_jen_wf, 'b+-');
xlabel('SNR(dB)');
ylabel('功率分配');
legend('等功率分配算法','功率优化算法',2);