gusucode.com > 非线性BD-GMD均分功率用户排序误码率源码程序 > 非线性BD-GMD均分功率用户排序误码率源码程序/code/BD_GMD_5_stream.m
function [Q,R,P] =BD_GMD_5_stream(H,UserNum,UserAntennaNum,stream_num,flag) % H 为信道 Nr*Nt % H 按行分成Num个字h对应每个用户,UserAntennaNum为向量,对应每用户的天线数 % flag标示是 真二用户 1 假二用户 0 主要为了减少计算量 %将H分成各子信道矩阵 [m,n]=size(H); I=eye(n); %Q_end=[]; %R_end=zeros(m); %P_end=[]; % if UserNum~=2 [Q1,R1,P1] = BD_GMD_5_stream(H,2,[UserAntennaNum(1) sum(UserAntennaNum(2:end))],[stream_num(1) sum(stream_num(2:end))],0);%假二用户 H2=H(UserAntennaNum(1)+1:end,:); % rank_of_rightmatrix=rank((I-P(:,1:stream_num(1))*P(:,1:stream_num(1))')); % rank_of_old_H=rank(H(UserAntennaNum(1)+1:end,:)); % rank_of_new_H=rank(H2); [Q2,R2,P2] = BD_GMD_5_stream(H2*(I-P1*P1'),UserNum-1,UserAntennaNum(2:end),stream_num(2:end),1); % 合成最后分解矩阵 Q=blkdiag(Q1,Q2); R=blkdiag(R1,R2); R(stream_num(1)+1:end,1:stream_num(1))=Q2'*H2*P1; P=[P1 P2]; % Q(UserAntennaNum(1)+1:end,stream_num(1)+1:end)=Q2; % R(stream_num(1)+1:end,stream_num(1)+1:end)=R2; % R(stream_num(1)+1:end,1:stream_num(1))=Q2'*H(UserAntennaNum(1)+1:end,:)*P(:,1:stream_num(1)); % P(:,stream_num(1)+1:end)=P2; else if flag==0% 假二用户,不必对H2进行分解,只对H1进行分解即可 H1=H(1:UserAntennaNum(1),:); %求BD-GMD [Q,R,P]=gmd_zcy_streamreduce(H1,stream_num(1)); % Q:Nr1*r1, R:r1*r1,P:Nt*r1 else %真二用户 需要对H1和H2都要分解 %%求二分矩阵的BD-GMD H1=H(1:UserAntennaNum(1),:); H2=H(UserAntennaNum(1)+1:UserAntennaNum(1)+UserAntennaNum(2),:); %求BD-GMD [Q1,R1,P1]=gmd_zcy_streamreduce(H1,stream_num(1)); HH=H2*(I-P1*P1'); [Q2,R2,P2]=gmd_zcy_streamreduce(HH,stream_num(2)); r=(Q2)'*H2*P1; R=blkdiag(R1,R2); [row col]=size(R1); R(stream_num(1)+1:stream_num(1)+stream_num(2),1:col)=r; P=[P1 P2]; Q=blkdiag(Q1,Q2); end %% end