0001 function [ x ] = FBMC_OQAM_EqualizerFrequencySpreadingReceiver( r, C, criterion, Para, B )
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
0051
0052
0053 switch Para.kappa
0054 case 2
0055 HkOneSided = sqrt(2)/2;
0056 Hk = [fliplr(HkOneSided) 1 HkOneSided];
0057 case 3
0058 HkOneSided = [0.91143783 0.41143783];
0059 Hk = [fliplr(HkOneSided) 1 HkOneSided];
0060 case 4
0061 HkOneSided = [0.971960 sqrt(2)/2 0.235147];
0062 Hk = [fliplr(HkOneSided) 1 HkOneSided];
0063 otherwise
0064 error('Parameters of kappa not supported')
0065 end
0066 M=Para.nSubcarriers/2;
0067
0068 theta=ones(2*M,2*(Para.Ns));
0069 theta(2:2:end,1:2:end)=1j;
0070 theta(1:2:end,2:2:end)=1j;
0071
0072 if Para.N_R==1 && Para.N_T==1
0073 C=squeeze(C);
0074 H=(fft(C,2*M*Para.kappa));
0075 switch criterion
0076 case 'ZF'
0077 B=1./H;
0078 case 'MMSE'
0079
0080 Es_N0=10.^(Para.Es_N0_dB/10);
0081 B=conj(H)./(abs(H).^2+1/Es_N0);
0082 case 'Specific'
0083 if exist('B','var')==0
0084 error('Argument B missing for criterion "Specific"')
0085 end
0086 case 'MF'
0087 B=1./H;
0088 otherwise
0089 error('Equalizer type not existing')
0090 end
0091 x=zeros(2*M,2*Para.Ns);
0092 r=r(2*Para.PreambleLength*M+1:end);
0093 for l=1:2*Para.Ns
0094 r_block=r((l-1)*M+1:(l-1)*M+Para.kappa*2*M).';
0095 x_fft=1/Para.kappa*1/sqrt(2*M)*fft(r_block).*exp(1j*2*pi/2/M/Para.kappa*(0:2*M*Para.kappa-1)'*(2*M*Para.kappa-1)/2);
0096 for m=1:2*M*Para.kappa
0097 x_fft(m)=x_fft(m).*B(m);
0098 end
0099 k=-Para.kappa+1:Para.kappa-1;
0100
0101 x_temp=x_fft(mod(k,2*M*Para.kappa)+1);
0102 x_temp(1:Para.kappa-1)=-x_temp(1:Para.kappa-1);
0103 x(1,l)=sum(Hk.*x_temp.');
0104
0105 for m=2:2*M
0106 x_temp=x_fft(mod(Para.kappa*(m-1)+k,2*M*Para.kappa)+1);
0107 x(m,l)=sum(Hk.*x_temp.');
0108 end
0109 end
0110 x=x.*conj(theta);
0111
0112
0113
0114 else
0115 if Para.N_T>Para.N_R
0116 error('Error: N_T>N_R')
0117 else
0118 H=zeros(Para.N_R,Para.N_T,2*M*Para.kappa);
0119 for index_N_R=1:Para.N_R
0120 for index_N_T=1:Para.N_T
0121 H(index_N_R,index_N_T,:)=fft(squeeze(C(index_N_R,index_N_T,:)),2*M*Para.kappa).';
0122 end
0123 end
0124 B=zeros(Para.N_T, Para.N_R, 2*M*Para.kappa);
0125 switch criterion
0126 case 'ZF'
0127 for m=1:2*M*Para.kappa
0128 H_m=H(:,:,m);
0129 B(:,:,m)=(H_m'*H_m)\H(:,:,m)';
0130 end
0131 case 'MMSE'
0132
0133 Es_N0=10.^(Para.Es_N0_dB/10);
0134 for m=1:2*M*Para.kappa
0135 H_m=H(:,:,m);
0136 B(:,:,m)=eye(Para.N_T,Para.N_T)/(H_m'*H_m+1/Es_N0*Para.N_T*eye(Para.N_T,Para.N_T))*H_m';
0137 end
0138 case 'MF'
0139 for m=1:2*M*Para.kappa
0140 H_m=H(:,:,m);
0141 B(:,:,m)= (diag(diag(H_m'*H_m)))\H_m';
0142 end
0143 case 'Specific'
0144 if exist('B','var')==0
0145 error('Argument B missing for criterion "Specific"')
0146 end
0147 otherwise
0148 error('Equalizer type not existing')
0149 end
0150
0151 x=zeros(Para.N_T,2*M,2*Para.Ns);
0152 r=r(:,2*Para.PreambleLength*M+1:end);
0153 for l=1:2*Para.Ns
0154 x_fft=zeros(Para.N_R,2*M*Para.kappa);
0155 for index_N_R=1:Para.N_R
0156 r_block=r(index_N_R,(l-1)*M+1:(l-1)*M+Para.kappa*2*M).';
0157 x_fft(index_N_R,:)=1/Para.kappa*1/sqrt(2*M)*fft(r_block).*exp(1j*2*pi/2/M/Para.kappa*(0:2*M*Para.kappa-1)'*(2*M*Para.kappa-1)/2);
0158 end
0159 x_eq_fft=zeros(Para.N_T,2*M*Para.kappa);
0160 for m=1:2*M*Para.kappa
0161 x_eq_fft(:,m)=B(:,:,m)*x_fft(:,m);
0162 end
0163 k=-Para.kappa+1:Para.kappa-1;
0164 for index_N_T=1:Para.N_T
0165
0166 x_temp=x_eq_fft(index_N_T,mod(k,2*M*Para.kappa)+1);
0167 x_temp(1:Para.kappa-1)=-x_temp(1:Para.kappa-1);
0168 x(index_N_T,1,l)=sum(Hk.*x_temp);
0169
0170 for m=2:2*M
0171 x_temp=x_eq_fft(index_N_T,mod(Para.kappa*(m-1)+k,2*M*Para.kappa)+1);
0172 x(index_N_T,m,l)=sum(Hk.*x_temp);
0173 end
0174 end
0175
0176 end
0177 for index_N_T=1:Para.N_T
0178 x(index_N_T,:,:)=squeeze(x(index_N_T,:,:)).*conj(theta);
0179 end
0180
0181 if Para.N_T==1
0182 x=squeeze(x);
0183 end
0184 end
0185
0186 end
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202 end
0203