www.gusucode.com > LTE仿真Matlab源码 > LTE_detect_TxD.m
function [LLR_SD,M,rx_layer_x_equalized] = LTE_detect_TxD(MCS_and_scheduling,BS_nAtPort,rx_user_symbols,UE_nRX,H_est_user,LTE_params,receiver,receiver_k,sigma_n2) % Transmit diversity detection. % Author: Stefan Schwarz, sschwarz@nt.tuwien.ac.at % (c) 2009 by INTHFT % www.nt.tuwien.ac.at if (BS_nAtPort == 2) nLayers = 2; rx_layer_x_equalized = zeros(length(rx_user_symbols)/2,nLayers); M = [MCS_and_scheduling.CQI_params.modulation_order] * ones(1,nLayers); % Modulation order bittable = false(sum(M(1:nLayers)),2^max(M)); symbol_alphabet = zeros(nLayers,2^max(M)); for i = 1:nLayers bittable(sum(M(1:i-1))+(1:M(i)),1:2^M(i))=LTE_params.bittable{M(i)}; % Bitmapping table symbol_alphabet(i,1:2^M(i))=LTE_params.SymbolAlphabet{M(i)}.'; % Symbol alphabet end symbol_alphabet(2,:) = conj(symbol_alphabet(2,:)); % this is because also the received symbols get conjugated rx_layer_x = zeros(2,length(rx_user_symbols)/2); % initialization of variable for received layers LLR_SD = zeros(M(1)*nLayers,length(rx_user_symbols)/2); % Log likelihood Ratios of the Spere decoder if (UE_nRX == 2) % 2x2 case for i = 1:2:length(rx_user_symbols)-1 rx_user_symbols_combined = [rx_user_symbols(i,1);rx_user_symbols(i,2);conj(rx_user_symbols(i+1,1));conj(rx_user_symbols(i+1,2))]; H_est_user_combined = [H_est_user(i,1,1),-H_est_user(i,1,2);H_est_user(i,2,1),-H_est_user(i,2,2);conj(H_est_user(i+1,1,2)),conj(H_est_user(i+1,1,1));conj(H_est_user(i+1,2,2)),conj(H_est_user(i+1,2,1))]; % generate equivalent channel matrix switch receiver case 'SSD' % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = pinv(H_est_user_combined)*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+1)/2)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+1)/2)=rx_user_symbols_combined_2(2,:); %%%%%%%%%%%%%%%%%%% [Q,R]= qr(H_est_user_combined); LLR_SD(:,(i+1)/2) = LTE_softsphere(rx_layer_x(:,(i+1)/2),rx_user_symbols_combined.'*sqrt(2),Q,R,symbol_alphabet,bittable,nLayers,M); case 'SSDKB' % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = pinv(H_est_user_combined)*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+1)/2)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+1)/2)=rx_user_symbols_combined_2(2,:); %%%%%%%%%%%%%%%%%%% [Q,R]= qr(H_est_user_combined); LLR_SD(:,(i+1)/2) = LTE_softsphere_kbest(rx_layer_x(:,(i+1)/2),rx_user_symbols_combined.'*sqrt(2),Q,R,symbol_alphabet,bittable,nLayers,M,receiver_k); case 'ZF' inv_temp = pinv(H_est_user_combined); % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+1)/2)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+1)/2)=rx_user_symbols_combined_2(2,:); rx_layer_x_equalized((i+1)/2,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+1)/2,2) = rx_user_symbols_combined_2(2,:)'; %%%%%%%%%%%%%%%%%%% Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1)]; LLR_SD(:,(i+1)/2) = LTE_demapper(rx_layer_x(:,(i+1)/2),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); case 'MMSE' temp = H_est_user_combined'*H_est_user_combined; inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_est_user_combined'; % MMSE Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+1)/2)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+1)/2)=rx_user_symbols_combined_2(2,:)'; rx_layer_x_equalized((i+1)/2,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+1)/2,2) = rx_user_symbols_combined_2(2,:); %%%%%%%%%%%%%%%%%%% Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1)]; LLR_SD(:,(i+1)/2) = LTE_demapper(rx_layer_x(:,(i+1)/2),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); end end elseif (UE_nRX == 1) % 2x1 case for i = 1:2:length(rx_user_symbols)-1 rx_user_symbols_combined = [rx_user_symbols(i,1);conj(rx_user_symbols(i+1,1))]; H_est_user_combined = [H_est_user(i,1,1),-H_est_user(i,1,2);conj(H_est_user(i+1,1,2)),conj(H_est_user(i+1,1,1))]; % generate equivalent channel matrix switch receiver case 'SSD' % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = pinv(H_est_user_combined)*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+1)/2)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+1)/2)=rx_user_symbols_combined_2(2,:); %%%%%%%%%%%%%%%%%%% [Q,R]= qr(H_est_user_combined); LLR_SD(:,(i+1)/2) = LTE_softsphere(rx_layer_x(:,(i+1)/2),rx_user_symbols_combined.'*sqrt(2),Q,R,symbol_alphabet,bittable,nLayers,M); case 'SSDKB' % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = pinv(H_est_user_combined)*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+1)/2)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+1)/2)=rx_user_symbols_combined_2(2,:); %%%%%%%%%%%%%%%%%%% [Q,R]= qr(H_est_user_combined); LLR_SD(:,(i+1)/2) = LTE_softsphere_kbest(rx_layer_x(:,(i+1)/2),rx_user_symbols_combined.'*sqrt(2),Q,R,symbol_alphabet,bittable,nLayers,M,receiver_k); case 'ZF' inv_temp = pinv(H_est_user_combined); % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+1)/2)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+1)/2)=rx_user_symbols_combined_2(2,:); rx_layer_x_equalized((i+1)/2,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+1)/2,2) = rx_user_symbols_combined_2(2,:)'; %%%%%%%%%%%%%%%%%%% Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1)]; LLR_SD(:,(i+1)/2) = LTE_demapper(rx_layer_x(:,(i+1)/2),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); case 'MMSE' temp = H_est_user_combined'*H_est_user_combined; inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_est_user_combined'; % MMSE Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+1)/2)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+1)/2)=rx_user_symbols_combined_2(2,:)'; rx_layer_x_equalized((i+1)/2,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+1)/2,2) = rx_user_symbols_combined_2(2,:); %%%%%%%%%%%%%%%%%%% Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1)]; LLR_SD(:,(i+1)/2) = LTE_demapper(rx_layer_x(:,(i+1)/2),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); end end else error('number of RX antennas not supported'); end else nLayers = 4; M = [MCS_and_scheduling.CQI_params.modulation_order] * ones(1,nLayers); % Modulation order rx_layer_x_equalized = zeros(length(rx_user_symbols)/4,nLayers); bittable = false(sum(M(1:nLayers)),2^max(M)); symbol_alphabet = zeros(nLayers,2^max(M)); for i = 1:nLayers bittable(sum(M(1:i-1))+(1:M(i)),1:2^M(i))=LTE_params.bittable{M(i)}; % Bitmapping table symbol_alphabet(i,1:2^M(i))=LTE_params.SymbolAlphabet{M(i)}.'; % Symbol alphabet end symbol_alphabet(2,:) = conj(symbol_alphabet(2,:)); % this is because also the received symbols get conjugated symbol_alphabet(4,:) = conj(symbol_alphabet(4,:)); % this is because also the received symbols get conjugated LLR_SD = zeros(M(1)*nLayers,length(rx_user_symbols)/4); % Log likelihood Ratios of the Spere decoder rx_layer_x = zeros(4,length(rx_user_symbols)/4); % initialization of variable for received layers if (UE_nRX == 4) % 4x4 case for i = 1:4:length(rx_user_symbols)-3 rx_user_symbols_combined = [rx_user_symbols(i,1);rx_user_symbols(i,2);conj(rx_user_symbols(i+1,1));conj(rx_user_symbols(i+1,2)); rx_user_symbols(i+2,1);rx_user_symbols(i+2,2);conj(rx_user_symbols(i+3,1));conj(rx_user_symbols(i+3,2)); rx_user_symbols(i,3);rx_user_symbols(i,4);conj(rx_user_symbols(i+1,3));conj(rx_user_symbols(i+1,4)); rx_user_symbols(i+2,3);rx_user_symbols(i+2,4);conj(rx_user_symbols(i+3,3));conj(rx_user_symbols(i+3,4))]; H_est_user_combined = [H_est_user(i,1,1),-H_est_user(i,1,3),0,0;H_est_user(i,2,1),-H_est_user(i,2,3),0,0;conj(H_est_user(i+1,1,3)),conj(H_est_user(i+1,1,1)),0,0;conj(H_est_user(i+1,2,3)),conj(H_est_user(i+1,2,1)),0,0;... % generate equivalent channel matrix 0,0,H_est_user(i+2,1,2),-H_est_user(i+2,1,4);0,0,H_est_user(i+2,2,2),-H_est_user(i+2,2,4);0,0,conj(H_est_user(i+3,1,4)),conj(H_est_user(i+3,1,2));0,0,conj(H_est_user(i+3,2,4)),conj(H_est_user(i+3,2,2));... H_est_user(i,3,1),-H_est_user(i,3,3),0,0;H_est_user(i,4,1),-H_est_user(i,4,3),0,0;conj(H_est_user(i+1,3,3)),conj(H_est_user(i+1,3,1)),0,0;conj(H_est_user(i+1,4,3)),conj(H_est_user(i+1,4,1)),0,0;... % generate equivalent channel matrix 0,0,H_est_user(i+2,3,2),-H_est_user(i+2,3,4);0,0,H_est_user(i+2,4,2),-H_est_user(i+2,4,4);0,0,conj(H_est_user(i+3,3,4)),conj(H_est_user(i+3,3,2));0,0,conj(H_est_user(i+3,4,4)),conj(H_est_user(i+3,4,2))]; switch receiver case 'SSD' % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2(1:2) = pinv(H_est_user_combined([1:4,9:12],1:2))*rx_user_symbols_combined([1:4,9:12])*sqrt(2); % calculate received symbols rx_user_symbols_combined_2(3:4) = pinv(H_est_user_combined([5:8,13:16],3:4))*rx_user_symbols_combined([5:8,13:16])*sqrt(2); % rx_user_symbols_combined_2(5:6) = pinv(H_est_user_combined(9:12,1:2))*rx_user_symbols_combined(9:12)*sqrt(2); % calculate received symbols % rx_user_symbols_combined_2(7:8) = pinv(H_est_user_combined(13:16,3:4))*rx_user_symbols_combined(13:16)*sqrt(2); rx_layer_x(:,(i+3)/4)=rx_user_symbols_combined_2; [Q,R]= qr(H_est_user_combined([1:4,9:12],1:2)); LLR_SD(1:sum(M(1:2)),(i+3)/4) = LTE_softsphere(rx_layer_x(1:2,(i+3)/4),rx_user_symbols_combined([1:4,9:12]).'*sqrt(2),Q,R,symbol_alphabet(1:2,:),bittable(1:sum(M(1:2)),:),nLayers/2,M(1:2)); [Q,R]= qr(H_est_user_combined([5:8,13:16],3:4)); LLR_SD(sum(M(1:2))+1:sum(M),(i+3)/4) = LTE_softsphere(rx_layer_x(3:4,(i+3)/4),rx_user_symbols_combined([5:8,13:16]).'*sqrt(2),Q,R,symbol_alphabet(3:4,:),bittable(1:sum(M(1:2)),:),nLayers/2,M(3:4)); case 'ZF' inv_temp = pinv(H_est_user_combined); % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+3)/4)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+3)/4)=rx_user_symbols_combined_2(2,:); rx_layer_x(3,(i+3)/4)=rx_user_symbols_combined_2(3,:); rx_layer_x(4,(i+3)/4)=rx_user_symbols_combined_2(4,:); %%%%%%%%%%%%%%%%%%% rx_layer_x_equalized((i+3)/4,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+3)/4,2) = rx_user_symbols_combined_2(2,:)'; rx_layer_x_equalized((i+3)/4,3) = rx_user_symbols_combined_2(3,:); rx_layer_x_equalized((i+3)/4,4) = rx_user_symbols_combined_2(4,:)'; Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1);... noise_enhancement_tmp(3)*ones(M(3),1);noise_enhancement_tmp(4)*ones(M(4),1)]; LLR_SD(:,(i+3)/4) = LTE_demapper(rx_layer_x(:,(i+3)/4),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); case 'MMSE' temp = H_est_user_combined'*H_est_user_combined; inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_est_user_combined'; % MMSE Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+3)/4)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+3)/4)=rx_user_symbols_combined_2(2,:); rx_layer_x(3,(i+3)/4)=rx_user_symbols_combined_2(3,:); rx_layer_x(4,(i+3)/4)=rx_user_symbols_combined_2(4,:); %%%%%%%%%%%%%%%%%%% rx_layer_x_equalized((i+3)/4,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+3)/4,2) = rx_user_symbols_combined_2(2,:)'; rx_layer_x_equalized((i+3)/4,3) = rx_user_symbols_combined_2(3,:); rx_layer_x_equalized((i+3)/4,4) = rx_user_symbols_combined_2(4,:)'; Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1);... noise_enhancement_tmp(3)*ones(M(3),1);noise_enhancement_tmp(4)*ones(M(4),1)]; LLR_SD(:,(i+3)/4) = LTE_demapper(rx_layer_x(:,(i+3)/4),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); end end elseif (UE_nRX == 2) % 4x2 case for i = 1:4:length(rx_user_symbols)-3 rx_user_symbols_combined = [rx_user_symbols(i,1);rx_user_symbols(i,2);conj(rx_user_symbols(i+1,1));conj(rx_user_symbols(i+1,2)); rx_user_symbols(i+2,1);rx_user_symbols(i+2,2);conj(rx_user_symbols(i+3,1));conj(rx_user_symbols(i+3,2))]; H_est_user_combined = [H_est_user(i,1,1),-H_est_user(i,1,3),0,0;H_est_user(i,2,1),-H_est_user(i,2,3),0,0;conj(H_est_user(i+1,1,3)),conj(H_est_user(i+1,1,1)),0,0;conj(H_est_user(i+1,2,3)),conj(H_est_user(i+1,2,1)),0,0;... % generate equivalent channel matrix 0,0,H_est_user(i+2,1,2),-H_est_user(i+2,1,4);0,0,H_est_user(i+2,2,2),-H_est_user(i+2,2,4);0,0,conj(H_est_user(i+3,1,4)),conj(H_est_user(i+3,1,2));0,0,conj(H_est_user(i+3,2,4)),conj(H_est_user(i+3,2,2))]; switch receiver case 'SSD' % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2(1:2) = pinv(H_est_user_combined(1:4,1:2))*rx_user_symbols_combined(1:4)*sqrt(2); % calculate received symbols rx_user_symbols_combined_2(3:4) = pinv(H_est_user_combined(5:8,3:4))*rx_user_symbols_combined(5:8)*sqrt(2); rx_layer_x(:,(i+3)/4)=rx_user_symbols_combined_2; [Q,R]= qr(H_est_user_combined(1:4,1:2)); LLR_SD(1:sum(M(1:2)),(i+3)/4) = LTE_softsphere(rx_layer_x(1:2,(i+3)/4),rx_user_symbols_combined(1:4).'*sqrt(2),Q,R,symbol_alphabet(1:2,:),bittable(1:sum(M(1:2)),:),nLayers/2,M(1:2)); [Q,R]= qr(H_est_user_combined(5:8,3:4)); LLR_SD(sum(M(1:2))+1:sum(M),(i+3)/4) = LTE_softsphere(rx_layer_x(3:4,(i+3)/4),rx_user_symbols_combined(5:8).'*sqrt(2),Q,R,symbol_alphabet(3:4,:),bittable(1:sum(M(1:2)),:),nLayers/2,M(3:4)); case 'ZF' inv_temp = pinv(H_est_user_combined); % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+3)/4)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+3)/4)=rx_user_symbols_combined_2(2,:); rx_layer_x(3,(i+3)/4)=rx_user_symbols_combined_2(3,:); rx_layer_x(4,(i+3)/4)=rx_user_symbols_combined_2(4,:); %%%%%%%%%%%%%%%%%%% rx_layer_x_equalized((i+3)/4,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+3)/4,2) = rx_user_symbols_combined_2(2,:)'; rx_layer_x_equalized((i+3)/4,3) = rx_user_symbols_combined_2(3,:); rx_layer_x_equalized((i+3)/4,4) = rx_user_symbols_combined_2(4,:)'; Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1);... noise_enhancement_tmp(3)*ones(M(3),1);noise_enhancement_tmp(4)*ones(M(4),1)]; LLR_SD(:,(i+3)/4) = LTE_demapper(rx_layer_x(:,(i+3)/4),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); case 'MMSE' temp = H_est_user_combined'*H_est_user_combined; inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_est_user_combined'; % MMSE Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+3)/4)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+3)/4)=rx_user_symbols_combined_2(2,:); rx_layer_x(3,(i+3)/4)=rx_user_symbols_combined_2(3,:); rx_layer_x(4,(i+3)/4)=rx_user_symbols_combined_2(4,:); %%%%%%%%%%%%%%%%%%% rx_layer_x_equalized((i+3)/4,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+3)/4,2) = rx_user_symbols_combined_2(2,:)'; rx_layer_x_equalized((i+3)/4,3) = rx_user_symbols_combined_2(3,:); rx_layer_x_equalized((i+3)/4,4) = rx_user_symbols_combined_2(4,:)'; Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1);... noise_enhancement_tmp(3)*ones(M(3),1);noise_enhancement_tmp(4)*ones(M(4),1)]; LLR_SD(:,(i+3)/4) = LTE_demapper(rx_layer_x(:,(i+3)/4),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); end end elseif (UE_nRX == 1) % 4x1 case for i = 1:4:length(rx_user_symbols)-3 rx_user_symbols_combined = [rx_user_symbols(i,1);conj(rx_user_symbols(i+1,1));rx_user_symbols(i+2,1);conj(rx_user_symbols(i+3,1))]; % generate equivalent channel matrix H_est_user_combined = [H_est_user(i,1,1),-H_est_user(i,1,3),0,0;conj(H_est_user(i+1,1,3)),conj(H_est_user(i+1,1,1)),0,0;... 0,0,H_est_user(i+2,1,2),-H_est_user(i+2,1,4);0,0,conj(H_est_user(i+3,1,4)),conj(H_est_user(i+3,1,2))]; switch receiver case 'SSD' % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2(1:2) = pinv(H_est_user_combined(1:2,1:2))*rx_user_symbols_combined(1:2)*sqrt(2); % calculate received symbols rx_user_symbols_combined_2(3:4) = pinv(H_est_user_combined(3:4,3:4))*rx_user_symbols_combined(3:4)*sqrt(2); rx_layer_x(:,(i+3)/4)=rx_user_symbols_combined_2; %%%%%%%%%%%%%%%%%%% [Q,R]= qr(H_est_user_combined(1:2,1:2)); LLR_SD(1:sum(M(1:2)),(i+3)/4) = LTE_softsphere(rx_layer_x(1:2,(i+3)/4),rx_user_symbols_combined(1:2).'*sqrt(2),Q,R,symbol_alphabet(1:2,:),bittable(1:sum(M(1:2)),:),nLayers/2,M(1:2)); [Q,R]= qr(H_est_user_combined(3:4,3:4)); LLR_SD(sum(M(1:2))+1:sum(M),(i+3)/4) = LTE_softsphere(rx_layer_x(3:4,(i+3)/4),rx_user_symbols_combined(3:4).'*sqrt(2),Q,R,symbol_alphabet(3:4,:),bittable(1:sum(M(1:2)),:),nLayers/2,M(3:4)); case 'ZF' inv_temp = pinv(H_est_user_combined); % ZF Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+3)/4)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+3)/4)=rx_user_symbols_combined_2(2,:); rx_layer_x(3,(i+3)/4)=rx_user_symbols_combined_2(3,:); rx_layer_x(4,(i+3)/4)=rx_user_symbols_combined_2(4,:); %%%%%%%%%%%%%%%%%%% rx_layer_x_equalized((i+3)/4,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+3)/4,2) = rx_user_symbols_combined_2(2,:)'; rx_layer_x_equalized((i+3)/4,3) = rx_user_symbols_combined_2(3,:); rx_layer_x_equalized((i+3)/4,4) = rx_user_symbols_combined_2(4,:)'; Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1);... noise_enhancement_tmp(3)*ones(M(3),1);noise_enhancement_tmp(4)*ones(M(4),1)]; LLR_SD(:,(i+3)/4) = LTE_demapper(rx_layer_x(:,(i+3)/4),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); case 'MMSE' temp = H_est_user_combined'*H_est_user_combined; inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_est_user_combined'; % MMSE Detector %%%%%%%%%%%%%%%%%%% rx_user_symbols_combined_2 = inv_temp*rx_user_symbols_combined*sqrt(2); % calculate received symbols rx_layer_x(1,(i+3)/4)=rx_user_symbols_combined_2(1,:); % map them to the corresponding layer rx_layer_x(2,(i+3)/4)=rx_user_symbols_combined_2(2,:); rx_layer_x(3,(i+3)/4)=rx_user_symbols_combined_2(3,:); rx_layer_x(4,(i+3)/4)=rx_user_symbols_combined_2(4,:); %%%%%%%%%%%%%%%%%%% rx_layer_x_equalized((i+3)/4,1) = rx_user_symbols_combined_2(1,:); rx_layer_x_equalized((i+3)/4,2) = rx_user_symbols_combined_2(2,:)'; rx_layer_x_equalized((i+3)/4,3) = rx_user_symbols_combined_2(3,:); rx_layer_x_equalized((i+3)/4,4) = rx_user_symbols_combined_2(4,:)'; Hg = inv_temp*H_est_user_combined; noise_enhancement_tmp = sum(abs(inv_temp).^2,2); noise_enhancement = [noise_enhancement_tmp(1)*ones(M(1),1);noise_enhancement_tmp(2)*ones(M(2),1);... noise_enhancement_tmp(3)*ones(M(3),1);noise_enhancement_tmp(4)*ones(M(4),1)]; LLR_SD(:,(i+3)/4) = LTE_demapper(rx_layer_x(:,(i+3)/4),symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); end end else error('number of RX antennas not supported'); end end