function [b_bar,bn,En,gn]=LC_RA(Ex_bar,Noise_var,gap_dB,Hn)
% [b_bar,bn,En,gn]=LC_RA(Ex_bar,Noise_var,gap_dB,Hn)
% Levin Campello's Method
% Ex_bar is the normalized energy
% Ntot is the total number of real/complex subchannels, Ntot>2
% gap is the gap in dB
%
% gn is channel gain
% En is the energy in the nth subchannel (PAM or QAM)
% bn is the bit in the nth subchannel (PAM or QAM)
% Nstar is the number of subchannel used
% b_bar is the bit rate
%
% The first bin and the last bin is PAM, the rest of them are QAM.
  
% dB into normal scale
gap=10^(gap_dB/10);

Ntot=2*(length(Hn)-1);

% initialization
En=zeros(1,Ntot/2+1);
bn=zeros(1,Ntot/2+1);
gn=zeros(1,Ntot/2+1);
decision_table=zeros(1,Ntot/2+1);

% subchannel center frequencies
f=0:1/Ntot:1/2;

% find gn vector
gn=abs(Hn).^2/Noise_var;

%debugging purpose
%plot(gn)

%%%%%%%%%%%%%%%%%%%%%%%
% Now do LC %
%%%%%%%%%%%%%%%%%%%%%%%

%initialization

%used energy so far
E_so_far=0;
%decision table - QAM and PAM 
decision_table(2:Ntot/2)=2*gap./gn(2:Ntot/2);
if gn(1) ~= 0
    decision_table(1)=3*gap/gn(1);
else
    decision_table(1)=inf;
end
if gn(Ntot/2+1) ~=0
    decision_table(Ntot/2+1)=3*gap/gn(Ntot/2+1);
else
    decision_table(Ntot/2+1)=inf;
end

%decision_table: debugging purpose

while(1)
    
    [y,index]=min(decision_table);
    E_so_far=E_so_far+y;
    
    if E_so_far > Ex_bar*Ntot
      
        break;
	
    else
      
        En(index)=En(index)+y;
        bn(index)=bn(index)+1;
	
	if (index ==1 | index == Ntot/2+1)
	  decision_table(index)=4*decision_table(index);
	else
	  decision_table(index)=2*decision_table(index);
	end

    end
    
end

% calculate b_bar
b_bar=1/Ntot*(sum(bn));

%>> [gn,En,bn,b_bar]=LC([1 0.9],10,1,8,0)
%
%gn =
%
%   19.9448   17.0320   10.0000    2.9680    0.0552
%
%
%En =
%
%    0.7521    1.7614    3.0000    2.0216         0
%
%
%bn =
%
%     2     4     4     2     0
%
%
%b_bar =
%
%    1.5000



    
        
        
