0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 Para=InitializeChainParameters( 'FBMC-OQAM' );
0023 Para.Ns=100;
0024 K=15;
0025 N=30;
0026 Para.Es_N0_dB=20;
0027 Para.N_R=N;
0028 Para.N_T=K;
0029 Para.S=min(Para.N_T,Para.N_R);
0030
0031
0032 d = GenerateData (Para);
0033 s = Modulator(d, Para );
0034
0035
0036
0037
0038 r=0.7;
0039 row=r.^[0:1:N-1];
0040 C_BS = toeplitz(row);
0041 [V,D] = eig(C_BS);
0042 C_BS_1_2=V*sqrt(D)*V';
0043
0044
0045 beta=ones(K,1)-0.5*rand(K,1);
0046 beta=beta./sum(beta)*K;
0047 D_beta=diag(beta);
0048
0049
0050
0051
0052
0053
0054
0055 delays=1e-9*[0 300 8900 12900 17100 20000];
0056 powers=[-2.5 0 -12.8 -10 -25.2 -16];
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 Ts=Para.T/Para.nSubcarriers;
0069 delays=round(delays/Ts)+1;
0070 nbtaps=length(powers);
0071 L=max(delays);
0072 p_b=zeros(1,L);
0073 variances=10.^(powers/10);
0074 variances=variances/sum(variances);
0075 for i=1:nbtaps
0076 p_b(delays(i))=p_b(delays(i))+ variances(i);
0077 end
0078
0079 L=length(p_b);
0080 D_beta_b=zeros(K,K,L);
0081 D_1_2=zeros(K*L,K);
0082 for k=1:K
0083 for b=1:L
0084 D_beta_b(k,k,b)=beta(k)*(p_b(b));
0085 end
0086 end
0087
0088 for b=1:L
0089 D_1_2(1+(b-1)*K:K+(b-1)*K,:)=sqrt(D_beta_b(:,:,b));
0090 end
0091
0092
0093 Psi=diag(0:L-1);
0094 Phi=kron(-1j*Psi,eye(K,K));
0095 D=D_1_2'*D_1_2;
0096 D_av=D\D_1_2'*1j*Phi*D_1_2;
0097 D_rms=sqrt(-inv(D)*(D_1_2'*Phi^2*D_1_2)-D_av^2);
0098
0099
0100 C=zeros(N,K,L);
0101 for b=1:L
0102 C(:,:,b)=C_BS_1_2*1/sqrt(2)*(randn(N,K)+1j*randn(N,K))*sqrt(D_beta_b(:,:,b));
0103 end
0104
0105
0106 r = Channel_Multipath( s, C );
0107 r=Channel_AWGN( r, Para );
0108
0109
0110 z = Demodulator( r, Para );
0111
0112
0113 ParaEqualizer.criterion='ZF';
0114 [ x, B ] = Equalizer( z, C, Para, 'SingleTap', ParaEqualizer );
0115 d_hat=real(x);
0116
0117
0118
0119 MSE = MSEComputes( d, d_hat, Para );
0120
0121
0122 MSE_theo_approx = FBMC_OQAM_MSESingleTapTheorApprox( B, C, Para );
0123
0124
0125 [eta_tilde, zeta_tilde]=ComputeEtaTilde(Para);
0126
0127
0128 delta_tilde_prev=N/K-1;
0129 precision=1;
0130 while abs(precision)>1e-3
0131 delta_tilde=1/K*trace(C_BS/( delta_tilde_prev^(-1)*C_BS +eye(N,N)));
0132 precision=delta_tilde-delta_tilde_prev;
0133 delta_tilde_prev=delta_tilde;
0134 end
0135 delta=delta_tilde^(-1);
0136 alpha=1/K*trace(inv(D))*delta_tilde^(-2);
0137 gamma=delta_tilde^(-2);
0138 alpha_tilde=1/K*trace(C_BS*(inv( delta*C_BS +eye(N,N)))^2 );
0139 gamma_tilde=1/K*trace(C_BS^2*(inv( delta*C_BS +eye(N,N)))^2 );
0140
0141 Para.Es_N0=10.^(Para.Es_N0_dB/10);
0142 sigma_2=Para.Es./Para.Es_N0;
0143 MSE_bar_ZF=sigma_2/2*alpha*alpha_tilde/(1-gamma*gamma_tilde)...
0144 +eta_tilde*trace(D_av^2)/K+...
0145 +eta_tilde*alpha*gamma_tilde/(1-gamma*gamma_tilde)*trace(D*D_rms^2)/K;
0146
0147
0148
0149
0150 figure
0151 plot(Para.ActiveSubcarriers, 10*log10(MSE),'xb','markersize',8,'linewidth',1.5)
0152 hold on
0153 plot(Para.ActiveSubcarriers,10*log10(MSE_theo_approx(Para.ActiveSubcarriers)),'-b','markersize',8,'linewidth',1.5)
0154 plot(Para.ActiveSubcarriers,10*log10(MSE_bar_ZF)*ones(length(Para.ActiveSubcarriers),1),'--b','markersize',8,'linewidth',1.5)
0155 xlabel('Subcarrier index')
0156 ylabel('MSE [dB]')
0157 xlim([min(Para.ActiveSubcarriers) max(Para.ActiveSubcarriers)])
0158 legend('ZF - simu', 'ZF - approx','ZF - asymptotic')
0159 ylim([-20 0])