www.gusucode.com > LTE仿真Matlab源码 > LTE_detect_SIxO.m
function [LLR_SD,M,rx_layer_x_equalized] = LTE_detect_SIxO(MCS_and_scheduling,filtering,rx_user_symbols,H_est,H_est_user,LTE_params,receiver,receiver_k,sigma_n2,MSE) % SISO detection. % Author: Stefan Schwarz, sschwarz@nt.tuwien.ac.at % (c) 2009 by INTHFT % www.nt.tuwien.ac.at nLayers = MCS_and_scheduling.nLayers; M = MCS_and_scheduling.CQI_params.modulation_order; bittable = false(M,2^max(M)); symbol_alphabet = zeros(1,2^max(M)); bittable(1:M,1:2^M)=LTE_params.bittable{M}; % Bitmapping table symbol_alphabet(1,1:2^M)=LTE_params.SymbolAlphabet{M}.'; % Symbol alphabet LLR_SD = zeros(M,length(rx_user_symbols)); % Log likelihood Ratios of the Spere decoder l = 1:length(rx_user_symbols); indices = MCS_and_scheduling.freq_indices; rx_layer_x_equalized = zeros(length(rx_user_symbols),nLayers); if (strcmp(filtering,'BlockFading')) for ctr = 1:LTE_params.Ntot ind = ~(indices-ctr); if (~ind) continue end H_complete = squeeze(H_est(ctr,1,:)); switch receiver case 'SSD' rx_layer_x = pinv(H_complete)*rx_user_symbols(ind,:).'; [Q,R] = qr(H_complete); LLR_SD(:,ind) = LTE_softsphere(rx_layer_x,rx_user_symbols(ind,:),Q,R,symbol_alphabet,bittable,nLayers,M); case 'SSDKB' rx_layer_x = pinv(H_complete)*rx_user_symbols(ind,:).'; [Q,R] = qr(H_complete); LLR_SD(:,ind) = LTE_softsphere_kbest(rx_layer_x,rx_user_symbols(ind,:),Q,R,symbol_alphabet,bittable,nLayers,M,receiver_k); case 'ZF' inv_temp = pinv(H_complete); rx_layer_x = inv_temp*rx_user_symbols(ind,:).'; rx_layer_x_equalized(ind,:) = rx_layer_x; Hg = inv_temp*H_complete; noise_enhancement = sum(abs(inv_temp).^2,2)*ones(M,length(rx_layer_x)); LLR_SD(:,ind) = LTE_demapper(rx_layer_x,symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); case 'MMSE' temp = H_complete'*H_complete; % inv_temp = (temp+(sigma_n2+MSE(ctr))*eye(size(temp)))^-1*H_complete'; inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_complete'; rx_layer_x = inv_temp*rx_user_symbols(ind,:).'; rx_layer_x_equalized(ind,:) = rx_layer_x; Hg = inv_temp*H_complete; noise_enhancement = sum(abs(inv_temp).^2,2)*ones(M,length(rx_layer_x)); LLR_SD(:,ind) = LTE_demapper(rx_layer_x,symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); end end else for ctr = 1:l(end) H_complete = squeeze(H_est_user(ctr,:)).'; switch receiver case 'SSD' rx_layer_x = pinv(H_complete)*rx_user_symbols(ctr,:).'; [Q,R] = qr(H_complete); LLR_SD(:,ctr) = LTE_softsphere(rx_layer_x,rx_user_symbols(ctr,:),Q,R,symbol_alphabet,bittable,nLayers,M); case 'SSDKB' rx_layer_x = pinv(H_complete)*rx_user_symbols(ctr,:).'; [Q,R] = qr(H_complete); LLR_SD(:,ctr) = LTE_softsphere_kbest(rx_layer_x,rx_user_symbols(ctr,:),Q,R,symbol_alphabet,bittable,nLayers,M,receiver_k); case 'ZF' inv_temp = pinv(H_complete); rx_layer_x = inv_temp*rx_user_symbols(ctr,:).'; Hg = inv_temp*H_complete; noise_enhancement = sum(abs(inv_temp).^2,2)*ones(M,length(rx_layer_x)); LLR_SD(:,ctr) = LTE_demapper(rx_layer_x,symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); case 'MMSE' temp = H_complete'*H_complete; inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_complete'; rx_layer_x = inv_temp*rx_user_symbols(ctr,:).'; Hg = inv_temp*H_complete; noise_enhancement = sum(abs(inv_temp).^2,2)*ones(M,length(rx_layer_x)); LLR_SD(:,ctr) = LTE_demapper(rx_layer_x,symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement); end end end