0001 function [d_tilde, A, B ]=OFDM_PreEqualizerSingleTap( d, C, criterion, Para )
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 if Para.N_R==1 && Para.N_T==1
0051 if Para.S>1
0052 error('Error: S>min(N_T,N_R)')
0053 end
0054 H=fft(squeeze(C),Para.nSubcarriers);
0055 switch criterion
0056 case 'ZF'
0057 A_tilde=1./H;
0058 xi=abs(A_tilde);
0059 A=A_tilde./xi;
0060 B=xi;
0061 case 'MMSE'
0062
0063 Es_N0=10.^(Para.Es_N0_dB/10);
0064 A_tilde=conj(H)./(abs(H).^2+1/Es_N0);
0065 xi=abs(A_tilde);
0066 A=A_tilde./xi;
0067 B=xi;
0068 case 'MF'
0069 A_tilde=1./H;
0070 xi=abs(A_tilde);
0071 A=A_tilde./xi;
0072 B=xi;
0073 case 'SVD'
0074 A_tilde=1./H;
0075 xi=abs(A_tilde);
0076 A=A_tilde./xi;
0077 B=xi;
0078 otherwise
0079 error('Equalizer type not existing')
0080 end
0081 d_tilde=zeros(Para.nSubcarriers, (Para.Ns+Para.PreambleLength));
0082 for m=Para.ActiveSubcarriers
0083 d_tilde(m,:)=A(m).*d(m,:);
0084 end
0085 else
0086 H=zeros(Para.N_R,Para.N_T,Para.nSubcarriers);
0087 for index_N_R=1:Para.N_R
0088 for index_N_T=1:Para.N_T
0089 H(index_N_R,index_N_T,:)=fft(squeeze(C(index_N_R,index_N_T,:)),Para.nSubcarriers).';
0090 end
0091 end
0092 B=zeros(Para.S, Para.N_R, Para.nSubcarriers);
0093 A=zeros(Para.N_T, Para.S, Para.nSubcarriers);
0094 switch criterion
0095 case 'ZF'
0096 if Para.N_R>Para.N_T
0097 error('Error: N_R>N_T')
0098 end
0099 for m=Para.ActiveSubcarriers
0100 H_m=H(:,:,m);
0101 Gram_inv=eye(Para.N_R,Para.N_R)/(H_m*H_m');
0102 xi=sqrt(trace(Gram_inv)/Para.S);
0103 A(:,:,m)=H_m'*Gram_inv.*(1/xi);
0104 B(:,:,m)=xi*eye(Para.N_R,Para.N_R);
0105 end
0106
0107 case 'MMSE'
0108 if Para.N_R>Para.N_T
0109 error('Error: N_R>N_T')
0110 end
0111 for m=Para.ActiveSubcarriers
0112
0113 Es_N0=10.^(Para.Es_N0_dB/10);
0114 H_m=H(:,:,m);
0115 A_tilde=(H_m'*H_m+1/Es_N0*Para.N_R*eye(Para.N_T,Para.N_T))\H_m';
0116 xi=sqrt(trace(A_tilde*A_tilde')/Para.S);
0117 A(:,:,m)=A_tilde.*(1/xi);
0118 B(:,:,m)=xi*eye(Para.N_R,Para.N_R);
0119 end
0120 case 'MF'
0121 if Para.N_R>Para.N_T
0122 error('Error: N_R>N_T')
0123 end
0124 for m=Para.ActiveSubcarriers
0125 H_m=H(:,:,m);
0126 A_tilde=H_m'/(diag(diag(H_m*H_m')));
0127 xi=sqrt(trace(A_tilde*A_tilde')/Para.S);
0128 A(:,:,m)=A_tilde.*(1/xi);
0129 B(:,:,m)=xi*eye(Para.N_R,Para.N_R);
0130 end
0131 case 'SVD'
0132 for m=Para.ActiveSubcarriers
0133 if Para.S>min(Para.N_T, Para.N_R)
0134 error('Error: S>min(N_T,N_R)')
0135 end
0136 H_m=H(:,:,m);
0137 [~,~,V] = svd(H_m);
0138 A_tilde=V(:,1:Para.S);
0139 xi=sqrt(trace(A_tilde*A_tilde')/Para.S);
0140 A(:,:,m)=A_tilde.*(1/xi);
0141 B(:,:,m)=((H_m*A(:,:,m))'*(H_m*A(:,:,m)) )\((H_m*A(:,:,m))');
0142 end
0143
0144 otherwise
0145 error('Equalizer type not existing')
0146 end
0147 d_tilde=zeros(Para.N_T,Para.nSubcarriers, (Para.Ns+Para.PreambleLength));
0148 if Para.S==1
0149 for m=Para.ActiveSubcarriers
0150 for l=1:(Para.Ns+Para.PreambleLength)
0151 d_tilde(:,m,l)=A(:,:,m)*d(m,l);
0152 end
0153 end
0154 else
0155 for m=Para.ActiveSubcarriers
0156 for l=1:(Para.Ns+Para.PreambleLength)
0157 d_tilde(:,m,l)=A(:,:,m)*d(:,m,l);
0158 end
0159 end
0160 end
0161 if Para.N_T==1
0162 d_tilde=squeeze(d_tilde);
0163 end
0164
0165
0166 end
0167
0168
0169
0170
0171 end
0172