Tracks and corrects phase noise following adaptive ML described in [1]. function [x, phi]=FBMC_OQAM_PhaseTrackerAML( z, linewidth, type, Para ) The function works for SISO systems. Input arguments: z: demodulated FBMC-OQAM symbols. Size: matrix [2*Para.M,2*Para.Ns] linewidth: phase noise linewidth [Hz] Para: structure containing the modulation parameters. Ouput arguments: x: equalized symbols. Size: matrix [2*Para.M, 2*Para.Ns]. phi: estimated phase. Size: vector [2*Para.Ns, 1]. References: [1] T.-H. Nguyen, F. Rottenberg, S.-P. Gorza, J. Louveaux and F. Horlin, "Efficient Chromatic Dispersion Compensation and Carrier Phase Tracking for Optical Fiber FBMC/OQAM Systems," J. Lightw. Technol., vol. 35, no. 14, pp. 2909-2916, Jul. 2017.
0001 function [x, phi]=FBMC_OQAM_PhaseTrackerAML( z, Para ) 0002 % Tracks and corrects phase noise following adaptive ML described in [1]. 0003 % 0004 % function [x, phi]=FBMC_OQAM_PhaseTrackerAML( z, linewidth, type, Para ) 0005 % 0006 % The function works for SISO systems. 0007 % 0008 % Input arguments: 0009 % 0010 % z: demodulated FBMC-OQAM symbols. Size: matrix [2*Para.M,2*Para.Ns] 0011 % 0012 % linewidth: phase noise linewidth [Hz] 0013 % 0014 % Para: structure containing the modulation parameters. 0015 % 0016 % Ouput arguments: 0017 % 0018 % x: equalized symbols. Size: matrix [2*Para.M, 2*Para.Ns]. 0019 % 0020 % phi: estimated phase. Size: vector [2*Para.Ns, 1]. 0021 % 0022 % References: [1] T.-H. Nguyen, F. Rottenberg, S.-P. Gorza, J. Louveaux 0023 % and F. Horlin, "Efficient Chromatic Dispersion Compensation and Carrier 0024 % Phase Tracking for Optical Fiber FBMC/OQAM Systems," J. Lightw. 0025 % Technol., vol. 35, no. 14, pp. 2909-2916, Jul. 2017. 0026 % 0027 0028 % This file is part of WaveComBox: www.wavecombox.com and is distributed under the terms of the MIT license. See accompanying LICENSE file. 0029 % Original author: T.-H. Nguyen, May 22, 2018. 0030 % Contributors: François Rottenberg, June 20, 2018. 0031 % Change log: 0032 0033 M=Para.nSubcarriers/2; 0034 Ns=Para.Ns; 0035 M_PAM=Para.M_PAM; 0036 mod_norm=sqrt(Para.Es/2/(1./Para.M_PAM.*sum(abs(pammod([0:Para.M_PAM-1],Para.M_PAM)).^2))); 0037 0038 G = 0.009; % Weighting factor for AML, optimized depending on the Ns, linewidth 0039 0040 phi=zeros(2*Ns,1); 0041 phi_l_1=0; 0042 if Para.N_R==1 && Para.N_T==1 0043 x=zeros(2*M,2*Ns); 0044 for l=1:2*Ns 0045 z_tilde=exp(-1j*phi_l_1).*z(:,l); 0046 temp=real(z_tilde); 0047 d_hard_decision=pammod(pamdemod(temp/mod_norm,M_PAM),M_PAM).*mod_norm; 0048 0049 term1 = real(z_tilde).*(-sin(phi_l_1)) + imag(z_tilde).*cos(phi_l_1); 0050 term2 = real(z_tilde).*(cos(phi_l_1)) + imag(z_tilde).*sin(phi_l_1); 0051 term3 = d_hard_decision.*term1; 0052 errorterm = sum(-(term1.*term2) + (term3)); 0053 epsilon = G * errorterm; 0054 0055 phi_l=phi_l_1+epsilon; 0056 phi_l_1=phi_l; 0057 phi(l)=phi_l; 0058 x(:,l)=exp(-1j*phi(l)).*z(:,l); 0059 end 0060 0061 else 0062 error('Function not implemented for N_T>1, N_R>1') 0063 end 0064 0065 end 0066