Home > WaveComBox > Example > FBMC_OQAM > SISOChannelEstimationTimeVariant.m

SISOChannelEstimationTimeVariant

PURPOSE ^

Channel estimation for SISO FBMC-OQAM under doubly selective channel

SYNOPSIS ^

This is a script file.

DESCRIPTION ^

 Channel estimation for SISO FBMC-OQAM under doubly selective channel

 Example showing how to perform channel estimation and channel
 equalization of a SISO FBMC-OQAM system under time and frequency
 selective channel. Channel estimation relies on the combination of a
 preamble at the beginning of the transmision and pilots scattered in the
 data frame. The scattered pilots are helped by auxiliary pilots inserted
 to cancel imaginary interference at the pilot position.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % Channel estimation for SISO FBMC-OQAM under doubly selective channel
0002 %
0003 % Example showing how to perform channel estimation and channel
0004 % equalization of a SISO FBMC-OQAM system under time and frequency
0005 % selective channel. Channel estimation relies on the combination of a
0006 % preamble at the beginning of the transmision and pilots scattered in the
0007 % data frame. The scattered pilots are helped by auxiliary pilots inserted
0008 % to cancel imaginary interference at the pilot position.
0009 
0010 % This file is part of WaveComBox: www.wavecombox.com and is distributed under
0011 % the terms of the MIT license. See accompanying LICENSE file.
0012 % Original author: François Rottenberg, May 8, 2018.
0013 % Contributors:
0014 % Change log:
0015 
0016 
0017 % Definition of general parameters
0018 Para=InitializeChainParameters( 'FBMC-OQAM' ); % initialize parameters of the FBMC-OQAM chain
0019 Para.ActiveSubcarriers=3:Para.nSubcarriers;
0020 Para.Ns=1000;
0021 Para.Es_N0_dB=20;
0022 Para.Velocity=60;
0023 
0024 % Parameters of the preamble
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 % Parameters of the scattered pilots
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 %% Transmitter
0038 
0039 % Preamble generation
0040 d_preamble=GeneratePreamble(d_TR, Para);
0041 % Data payload
0042 d_data = GenerateData (Para); % Generate real PAM symbols
0043 % Scattered pilot
0044 d_data_pilot=InsertScattteredPilot(d_data,Para);
0045 d=MergePreambleData(d_preamble,d_data_pilot,Para);
0046 s = Modulator(d, Para ); % FBMC-OQAM modulation
0047 
0048 
0049 %% Channel
0050 % C=GenerateRayleighChannelReal('ITU_VehA', Para);
0051 [C, Psi]=GenerateRayleighChannelReal('ITU_VehA', Para, 'Jakes', length(s));
0052 r = Channel_Multipath( s, C ); % Multipath channel
0053 r=Channel_AWGN( r, Para ); % AWGN channel, SNR fixed in Para
0054 
0055 %% Receiver
0056 % FBMC-OQAM demodulation
0057 z = Demodulator( r, Para ); % CP-OFDM demodulation
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'); % First channel estimation relying on the preamble transmission
0062 
0063 x=zeros(Para.nSubcarriers,Para.Ns);
0064 ParaEqualizer.criterion='MMSE'; % Criterion chosen to design each equalizer
0065 [~, ParaEqualizer.B]=Equalizer( z_data_pilot(:,1), C_est, Para, 'SingleTap', ParaEqualizer ); % Computation of the equalizing matrices and equalization of the first symbol
0066 for l=1:2*Para.Ns
0067     if mod(l,PilotSpacingTime)==0 % Check if symbol "l" is a pilot symbol index
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'); % Update of the channel impulse response estimate
0071         ParaEqualizer.criterion='MMSE'; % Criterion chosen to recompute the equalizer
0072         [~, ParaEqualizer.B]=Equalizer( z_data_pilot(:,1), C_est, Para, 'SingleTap', ParaEqualizer ); % Update of the equalizing matrices and equalization of the first symbol
0073     end
0074     % Conventional single-tap equalizer
0075     ParaEqualizer.criterion='Specific'; % Choose ParaEqualizer.B as specific equalizing matrices
0076     [x(:,l), ~] = Equalizer( z_data_pilot(:,l), 0, Para, 'SingleTap', ParaEqualizer );
0077 end
0078 d_hat=real(x);
0079 
0080 %% Compute performance metrics and plot results
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

Generated on Mon 14-Oct-2019 13:48:34 by m2html © 2005