Home > WaveComBox > Example > FBMC_OQAM > OpticalFiberChain.m

OpticalFiberChain

PURPOSE ^

FBMC-OQAM optical fiber communication chain. The channel

SYNOPSIS ^

This is a script file.

DESCRIPTION ^

 FBMC-OQAM optical fiber communication chain. The channel
 impairments include chromatic dispersion, phase noise, carrier frequency
 and timing offset. The signal processing tasks at the receiver include
 synchronization, channel estimation, channel equalization and phase noise
 tracking

 This file is part of WaveComBox: www.wavecombox.com and is distributed under
 the terms of the MIT license. See accompanying LICENSE file.
 Original author: François Rottenberg, October 1, 2018.
 Contributors:
 Change log:

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % FBMC-OQAM optical fiber communication chain. The channel
0002 % impairments include chromatic dispersion, phase noise, carrier frequency
0003 % and timing offset. The signal processing tasks at the receiver include
0004 % synchronization, channel estimation, channel equalization and phase noise
0005 % tracking
0006 %
0007 % This file is part of WaveComBox: www.wavecombox.com and is distributed under
0008 % the terms of the MIT license. See accompanying LICENSE file.
0009 % Original author: François Rottenberg, October 1, 2018.
0010 % Contributors:
0011 % Change log:
0012 
0013 
0014 % Definition of general Parameters
0015 Para=InitializeChainParameters( 'FBMC-OQAM' ) % initialize parameters of the FBMC-OQAM chain
0016 Para.ActiveSubcarriers= 2:Para.nSubcarriers;
0017 Para.Ns=200;
0018 Para.Es_N0_dB=20;
0019 Para.M_PAM=4;
0020 
0021 Para.T = 1/30e9*Para.nSubcarriers; % sampling period
0022 clight      = 299792458 ; % light speed (m/s)
0023 lambda      = 1550e-9 ; % m
0024 Para.CenterFrequency = clight/lambda ; % m
0025 
0026 % Parameters of the preamble
0027 Para.PreamblePilotSubcarriers=Para.ActiveSubcarriers(1:2:end);
0028 Para.PreambleLength=2;
0029 A=sqrt(length(Para.ActiveSubcarriers)/(length(Para.PreamblePilotSubcarriers) ));
0030 d_TR=A.*((randi([0 1],Para.nSubcarriers,1))*2-1);
0031 
0032 
0033 %% Transmitter
0034 
0035 % Preamble generation
0036 d_preamble=GeneratePreamble(d_TR, Para,'synchro');
0037 % Data payload
0038 d_data=GenerateData (Para); % Generate data symbols
0039 % Synthesis filterbank
0040 d=MergePreambleData(d_preamble,d_data,Para);
0041 s = Modulator(d, Para ); % FBMC-OQAM modulation
0042 
0043 %% Channel
0044 L_fiber     = 100e3; % m => Change here for CD
0045 D           = 17e-6; % s/(m*m)
0046 r = Channel_ChromaticDispersion( s, L_fiber, D, Para );
0047 PN_linewidth   = 200*1e3; % Hz
0048 r = Channel_PhaseNoise(s,PN_linewidth,Para); % add phase noise
0049 [ r, Delta_omega, Delta_tau ]=Channel_Desynchronization( r, Para);
0050 r=Channel_AWGN( r, Para ); % AWGN channel, SNR fixed in Para
0051 
0052 %% Receiver
0053 % Synchronization
0054 [ r_corrected, Delta_tau_hat, Delta_omega_hat ] = Synchronization( r, Para, d_TR );
0055     
0056 % Analysis filterbank
0057 z = Demodulator( r_corrected, Para ); % FBMC demodulation
0058 [ z_preamble,z_data ] = SeparatePreambleData(z,Para);
0059 
0060 % Channel estimation
0061 L=Para.nSubcarriers/8;
0062 causality=0; % The synchronization algorithms centers the received frame, which may make the channel impulse response not causal
0063 C_est=ChannelEstimator(z_preamble,L,d_TR,Para,'Preamble', causality);
0064 
0065 % Conventional single-tap equalizer
0066 ParaEqualizer.criterion='MMSE'; % Criterion chosen to design each equalizer
0067 [ x, B ] = Equalizer( z_data, C_est, Para, 'SingleTap', ParaEqualizer );
0068 
0069 % ML PN tracker
0070 [x, phi]=PhaseTracker( x, Para, 'ML' );
0071 
0072 d_hat=real(x);
0073 
0074 %% Compute performance metrics and plot results
0075 
0076 % MSE of estimated symbols
0077 MSE = MSEComputes( d_data, d_hat, Para );
0078 NMSE_dB=10*log10(2*Para.Es*mean(MSE));
0079 
0080 figure, 
0081 plot(x(Para.ActiveSubcarriers,:),'b.'); 
0082 title (['Received constellation before real conversion, EVM = ', num2str(NMSE_dB), 'dB'])
0083 
0084 figure
0085 plot(real(x(Para.ActiveSubcarriers,1:2:end)),real(x(Para.ActiveSubcarriers,2:2:end)),'b.'); 
0086

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