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