0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 Para=InitializeChainParameters( 'CP-OFDM' )
0017 Para.Ns=1000;
0018 Para.Es_N0_dB=20;
0019 Para.Velocity=30;
0020
0021
0022 Para.PreamblePilotSubcarriers=Para.ActiveSubcarriers(1:2:end);
0023 Para.PreambleLength=1;
0024 A=sqrt(length(Para.ActiveSubcarriers)/(length(Para.PreamblePilotSubcarriers) ));
0025 d_TR=A.*((randi([0 1],Para.nSubcarriers,1))*2-1);
0026
0027
0028 PilotSpacingTime=4;
0029 PilotSpacingFrequency=4;
0030 Para.ScatteredPilotSubcarriers=Para.ActiveSubcarriers(1:PilotSpacingFrequency:end);
0031 Para.ScatteredPilotSymbols=PilotSpacingTime:PilotSpacingTime:Para.Ns;
0032 Para.Ep=4*Para.Es;
0033
0034
0035
0036
0037 d_preamble=GeneratePreamble(d_TR, Para);
0038
0039 d_data = GenerateData (Para);
0040
0041 d_data_pilot=InsertScattteredPilot(d_data,Para);
0042
0043 d=MergePreambleData(d_preamble,d_data_pilot,Para);
0044 s = Modulator(d, Para );
0045
0046
0047
0048
0049 [C, Psi]=GenerateRayleighChannelReal('ITU_VehA', Para, 'Jakes', length(s));
0050 r = Channel_Multipath( s, C );
0051 r=Channel_AWGN( r, Para );
0052
0053
0054
0055 z = Demodulator( r, Para );
0056 [ z_preamble,z_data_pilot ] = SeparatePreambleData(z,Para);
0057
0058
0059 L=length(C(1,1,:,1));
0060 C_est=ChannelEstimator(z_preamble,L,d_TR,Para,'Preamble');
0061
0062 d_hat=zeros(Para.nSubcarriers,Para.Ns);
0063 ParaEqualizer.criterion='MMSE';
0064 [~, ParaEqualizer.B]=Equalizer( z_data_pilot(:,1), C_est, Para, 'SingleTap', ParaEqualizer );
0065 for l=1:Para.Ns
0066 if mod(l,PilotSpacingTime)==0
0067 d_TR=zeros(Para.nSubcarriers,1);
0068 d_TR(Para.ScatteredPilotSubcarriers)=d_data_pilot(Para.ScatteredPilotSubcarriers,l);
0069 C_est=ChannelEstimator(z_data_pilot(:,l),L, d_TR, Para,'ScatteredPilots');
0070 ParaEqualizer.criterion='MMSE';
0071 [~, ParaEqualizer.B]=Equalizer( z_data_pilot(:,1), C_est, Para, 'SingleTap', ParaEqualizer );
0072 end
0073
0074 ParaEqualizer.criterion='Specific';
0075 [d_hat(:,l), ~] = Equalizer( z_data_pilot(:,l), 0, Para, 'SingleTap', ParaEqualizer );
0076 end
0077
0078
0079 MSE = MSEComputes( d_data_pilot, d_hat, Para );
0080 geo_average_MSE_dB = 10*log10(mean(MSEComputes( d_data_pilot, d_hat, Para )))
0081 arith_average_MSE_dB = mean(10*log10(MSEComputes( d_data_pilot, d_hat, Para )))
0082
0083 figure
0084 plot(Para.ActiveSubcarriers, 10*log10(MSE),'xb','markersize',8,'linewidth',1.5)
0085 xlabel('Subcarrier index')
0086 ylabel('MSE [dB]')
0087 xlim([min(Para.ActiveSubcarriers) max(Para.ActiveSubcarriers)])
0088
0089
0090
0091
0092