📄 dem_dfusc_2x2_sm.m
字号:
function [ser,mse]=dem_DFUSC_2x2_SM(demparams,NoisePwr,ipfid_rx1,ipfid_rx2)
PwNorm=sqrt(2048/1702); % symbol power normalization factor
% load original data
switch demparams.qam,
case 4,
load orig_DFUSC_QPSK.mat;
ModScheme='QPSK';
case 16,
load orig_DFUSC_QAM16.mat;
ModScheme='16QAM';
case 64,
load orig_DFUSC_QAM64.mat;
ModScheme='64QAM';
otherwise,
error('Not supported Modulation Schme!');
end
load Wk_preamble.mat;
% get preamble modulation and index values
preamble_index_tx1=1:2:1702; % Tx 1 use even subcarriers
preamble_index_tx2=0:2:1702; % Tx 2 use odd subcarriers
preamble_mod_tx1=sqrt(2)*sqrt(2)*2*(0.5-Wk_preamble(2:2:end)); % Note: include DC. At No.426 element
preamble_mod_tx2=sqrt(2)*sqrt(2)*2*(0.5-Wk_preamble(1:2:end));
% ######## Perfect Channel Estimation ########
switch demparams.chantype,
case 1,
load perfectCE_sui1_11.mat;
load perfectCE_sui1_21.mat;
load perfectCE_sui1_12.mat;
load perfectCE_sui1_22.mat;
case 2,
load perfectCE_sui2_11.mat;
load perfectCE_sui2_21.mat;
load perfectCE_sui2_12.mat;
load perfectCE_sui2_22.mat;
case 3,
load perfectCE_sui3_11.mat;
load perfectCE_sui3_21.mat;
load perfectCE_sui3_12.mat;
load perfectCE_sui3_22.mat;
case 4,
load perfectCE_sui4_11.mat;
load perfectCE_sui4_21.mat;
load perfectCE_sui4_12.mat;
load perfectCE_sui4_22.mat;
case 5,
load perfectCE_sui5_11.mat;
load perfectCE_sui5_21.mat;
load perfectCE_sui5_12.mat;
load perfectCE_sui5_22.mat;
case 6,
load perfectCE_sui6_11.mat;
load perfectCE_sui6_21.mat;
load perfectCE_sui6_12.mat;
load perfectCE_sui6_22.mat;
otherwise,
error('Unknown SUI channel type!');
end
perfectCE_11(:,1877:2048)=[]; perfectCE_11(:,1:173)=[];
perfectCE_21(:,1877:2048)=[]; perfectCE_21(:,1:173)=[];
perfectCE_12(:,1877:2048)=[]; perfectCE_12(:,1:173)=[];
perfectCE_22(:,1877:2048)=[]; perfectCE_22(:,1:173)=[];
% ################################################################
suberr=0; % used to calculate subcarrier error rate
mse=0;
datanum=demparams.numframe*2*demparams.sympf*1702; % data number in one frame of 2 Tx
for frm=1:demparams.numframe
% ############## When use Known Channel Knowledge #############
%FullChanEst_11=sqrt(2048/1702)*perfectCE_11(frm,:);
%FullChanEst_21=sqrt(2048/1702)*perfectCE_21(frm,:);
%FullChanEst_12=sqrt(2048/1702)*perfectCE_12(frm,:);
%FullChanEst_22=sqrt(2048/1702)*perfectCE_22(frm,:);
% #############################################################
% use preamble for channel estimation
%---------- Path 11 and 21-------------
[preamble_time_rx1, symlen] = fread(ipfid_rx1, 2*2048*(1+demparams.Guard), 'float32');
if symlen~=2*2048*(1+demparams.Guard), error('fread Rx 1 input data error!'); end
preamble_time_rx1 = [ 1 1j ] * reshape(preamble_time_rx1, 2, symlen/2);
symlen=symlen/2;
% remove CP
preamble_time_rx1=preamble_time_rx1((2048*demparams.Guard+1):end);
% ###### Time domain ls estimation ######
[FullChanEst_11,FullChanEst_21]=ls_time_2x2((preamble_time_rx1).',demparams.chantype,demparams.sampletime);
FullChanEst_11=PwNorm*FullChanEst_11; FullChanEst_21=PwNorm*FullChanEst_21;
% #######################################
% FFT
% preamble_freq_rx1=fftshift(fft(preamble_time_rx1,2048)/sqrt(2048));
% Trim Guard subcarriers
% preamble_freq_rx1(1877:2048)=[]; preamble_freq_rx1(1:173)=[];
% Extract preamble pilots AND Channel Estimation
% preamble_pilots_tx1=preamble_freq_rx1(preamble_index_tx1+1);
% preamble_pilots_tx2=preamble_freq_rx1(preamble_index_tx2+1);
% ChanEst_11=ls_freq(preamble_pilots_tx1,preamble_mod_tx1);
% ChanEst_21=ls_freq(preamble_pilots_tx2,preamble_mod_tx2);
% Interpolate Note: If interpolate 'Tx1', must remove DC
% FullChanEst_11=interpolate_2x2(preamble_index_tx1+1,ChanEst_11,'linear','Tx1');
% FullChanEst_21=interpolate_2x2(preamble_index_tx2+1,ChanEst_21,'linear','Tx2');
%------------ Pathe 12 and 22-----------
[preamble_time_rx2, symlen] = fread(ipfid_rx2, 2*2048*(1+demparams.Guard), 'float32');
if symlen~=2*2048*(1+demparams.Guard), error('fread Rx 2 input data error!'); end
preamble_time_rx2 = [ 1 1j ] * reshape(preamble_time_rx2, 2, symlen/2);
symlen=symlen/2;
% remove CP
preamble_time_rx2=preamble_time_rx2((2048*demparams.Guard+1):end);
% ###### Time domain ls estimation ######
[FullChanEst_12,FullChanEst_22]=ls_time_2x2((preamble_time_rx2).',demparams.chantype,demparams.sampletime);
FullChanEst_12=PwNorm*FullChanEst_12; FullChanEst_22=PwNorm*FullChanEst_22;
% #######################################
% FFT
% preamble_freq_rx2=fftshift(fft(preamble_time_rx2,2048)/sqrt(2048));
% Trim Guard subcarriers
% preamble_freq_rx2(1877:2048)=[]; preamble_freq_rx2(1:173)=[];
% Extract preamble pilots AND Channel Estimation
% preamble_pilots_tx1=preamble_freq_rx2(preamble_index_tx1+1);
% preamble_pilots_tx2=preamble_freq_rx2(preamble_index_tx2+1);
% ChanEst_12=ls_freq(preamble_pilots_tx1,preamble_mod_tx1);
% ChanEst_22=ls_freq(preamble_pilots_tx2,preamble_mod_tx2);
% Interpolate Note: If interpolate 'Tx1', must remove DC
% FullChanEst_12=interpolate_2x2(preamble_index_tx1+1,ChanEst_12,'linear','Tx1');
% FullChanEst_22=interpolate_2x2(preamble_index_tx2+1,ChanEst_22,'linear','Tx2');
% ###### MSE Calculation ######
mse=mse+sum(abs(PwNorm*perfectCE_11(frm,:)-FullChanEst_11).^2)/1703 ...
+sum(abs(PwNorm*perfectCE_21(frm,:)-FullChanEst_21).^2)/1703 ...
+sum(abs(PwNorm*perfectCE_12(frm,:)-FullChanEst_12).^2)/1703 ...
+sum(abs(PwNorm*perfectCE_22(frm,:)-FullChanEst_22).^2)/1703;
% Remove DC
FullChanEst_11(852)=[];
FullChanEst_21(852)=[];
FullChanEst_12(852)=[];
FullChanEst_22(852)=[];
for sym=1:demparams.sympf % Spatial Multiplexing
% ------Rx 1------
[sym_time, symlen] = fread(ipfid_rx1, 2*2048*(1+demparams.Guard), 'float32');
if symlen~=2*2048*(1+demparams.Guard), error('fread channel output data error!'); end
sym_time = [ 1 1j ] * reshape(sym_time, 2, symlen/2);
symlen=symlen/2;
% remove CP
sym_time=sym_time((2048*demparams.Guard+1):end);
% FFT
sym_freq_R1=fftshift(fft(sym_time,2048)/sqrt(2048)); % Rx 1
% ##### Trim Guard subcarriers #####
sym_freq_R1(1877:2048)=[]; sym_freq_R1(1:173)=[];
% Remove DC
sym_freq_R1(852)=[];
% ------Rx 2------
[sym_time, symlen] = fread(ipfid_rx2, 2*2048*(1+demparams.Guard), 'float32');
if symlen~=2*2048*(1+demparams.Guard), error('fread channel output data error!'); end
sym_time = [ 1 1j ] * reshape(sym_time, 2, symlen/2);
symlen=symlen/2;
% remove CP
sym_time=sym_time((2048*demparams.Guard+1):end);
% FFT
sym_freq_R2=fftshift(fft(sym_time,2048)/sqrt(2048)); % Rx 2
% ##### Trim Guard subcarriers #####
sym_freq_R2(1877:2048)=[]; sym_freq_R2(1:173)=[];
% Remove DC
sym_freq_R2(852)=[];
% ###### Detection ######
DetectSymbol_1=zeros(1,length(sym_freq_R1));
DetectSymbol_2=zeros(1,length(sym_freq_R2));
for loop=1:length(sym_freq_R1)
R=[sym_freq_R1(loop),sym_freq_R2(loop)].';
H=[FullChanEst_11(loop),FullChanEst_21(loop);
FullChanEst_12(loop),FullChanEst_22(loop)];
% ###### Sphere Decoder ######
%[Subsym,erasure]=sphere_decoding(R,H,2,ModScheme);
%if erasure==1, error('Sphere Decoding failure!');end
% ############################
% ###### Zero Forcing ######
Subsym=ZeroForcing_Detection(R,H);
% ##########################
% ###### MMSE ######
%Subsym=mmse_Detection(R,H,NoisePwr,2);
% ##################
DetectSymbol_1(loop)=Subsym(1);
DetectSymbol_2(loop)=Subsym(2);
end % end loop
% Demap
DemapSymbol_1=demap(DetectSymbol_1, demparams.qam);
DemapSymbol_2=demap(DetectSymbol_2, demparams.qam);
% compare with original data for SER
suberr=suberr+length(find(orig_DFUSC(2*(sym-1)+1,:)-DemapSymbol_1));
suberr=suberr+length(find(orig_DFUSC(2*(sym-1)+2,:)-DemapSymbol_2));
end % end sym
end % end frm
ser=suberr/datanum
mse=mse/(4*demparams.numframe)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -