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