mimo系统 matlab算法

  • 格式:docx
  • 大小:14.07 KB
  • 文档页数:4

function

[gn,en_bar,bn_bar,Nstar,b_bar_check,margin]=MAwaterfill(P,SNRmfb,Ex_bar,b_bar,Ntot,gap)

% EE379C 2001-2002 Spring,

% Written by Seong Taek Chung

%

% P is the pulse response

% SNRmfb is the SNRmfb in dB

% b_bar is the normalized bit rate

% 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_bar is the energy/dim in the nth subchannel

% bn_bar is the bit/dim in the nth subchannel

% Nstar is the number of subchannel used

% dB into normal scale

Noise_var=Ex_bar*(norm(P)^2)/(10^(SNRmfb/10));

gap=10^(gap/10);

% initialization

en=zeros(1,Ntot);

bn=zeros(1,Ntot);

gn=zeros(1,Ntot);

Hn = zeros(1,Ntot);

% subchannel center frequencies

f=-1/2+1/Ntot:1/Ntot:1/2;

% find Hn vector

for i=1:length(P)

Hn=Hn+P(i)*exp(j*2*pi*f*(i-1));

% This value will be different depending if P represents

% P(1) + P(2)*D^-1 + .... or P(1) + P(2)*D^+1....,

% but we'll get same gn, thus same waterfilling result.

% (Note that both have the same magnitude response!)

end

% find gn vector

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

%plot(gn)

%%%%%%%%%%%%%%%%%%%%%%%

% Now do waterfilling %

%%%%%%%%%%%%%%%%%%%%%%%

%sort

[gn_sorted, Index]=sort(gn); % sort gain, and get Index

gn_sorted = fliplr(gn_sorted);% flip left/right to get the largest

% gain in leftside

Index = fliplr(Index); % also flip index

num_zero_gn = length(find(gn_sorted == 0)); %number of zero gain subchannels

Nstar=Ntot - num_zero_gn;

% Number of used channels,

% start from Ntot - (number of zero gain subchannels)

while(1)

K=(2^(Ntot*b_bar*2)/prod(gn_sorted(1:Nstar)))^(1/Nstar)*gap;

%K=1/Nstar*(Ntot*Ex_bar+gap*sum(1./gn_sorted(1:Nstar)));

En_min=K-gap/gn_sorted(Nstar); % En_min occurs in the worst channel

if (En_min<0)

Nstar=Nstar-1; % If negative En, continue with less channels

else

break; % If all En positive, done.

end

end

En=K-gap./gn_sorted(1:Nstar); % Calculate En

Bn=.5*log2(K*gn_sorted(1:Nstar)/gap); % Calculate bn

bn(Index(1:Nstar))=Bn; % return values in original index

en(Index(1:Nstar))=En; % return values in original index

en_bar=en;

bn_bar=bn;

% calculate b_bar

b_bar_check=1/Ntot*(sum(bn));

%calculate margin

margin=10*log10(Ntot*Ex_bar/sum(en));

%>> [gn,en_bar,bn_bar,Nstar,b_bar_check,margin]=MAwaterfill([1 0.9],10,1,1,8,0) %

%gn =

%

% Columns 1 through 7

%

% 2.9680 10.0000 17.0320 19.9448 17.0320 10.0000 2.9680

%

% Column 8

%

% 0.0552

%

%

%en_bar =

%

% Columns 1 through 7

%

% 0.2000 0.4369 0.4782 0.4868 0.4782 0.4369 0.2000

%

% Column 8

%

% 0

%

%

%bn_bar =

%

% Columns 1 through 7

%

% 0.3361 1.2123 1.5964 1.7103 1.5964 1.2123 0.3361

%

% Column 8

%

% 0

%

% Nstar =

%

% 7

%

%

%b_bar_check =

%

% 1.0000

%

%

%margin = %

% 4.6903

%