Tracks and corrects phase noise following algorithm described in [1]. function [x, phi]=FBMC_OQAM_PhaseTrackerMBPS( z, Para, B, PhaseAmbiguityCompensation ) The function works for SISO systems. Input arguments: z: demodulated FBMC-OQAM symbols. Size: matrix [2*Para.M,2*Para.Ns] 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, J. Louveaux, S.-P. Gorza and F. Horlin, "Simple Feedforward Carrier Phase Estimation for Optical FBMC/OQAM Systems," IEEE Photon. Technol. Lett., vol. 28, no. 24, pp. 2823-2826, Dec. 2016.
0001 function [x, phi]=FBMC_OQAM_PhaseTrackerMBPS( z, Para, B, PhaseAmbiguityCompensation ) 0002 % Tracks and corrects phase noise following algorithm described in [1]. 0003 % 0004 % function [x, phi]=FBMC_OQAM_PhaseTrackerMBPS( z, Para, B, PhaseAmbiguityCompensation ) 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 % Para: structure containing the modulation parameters. 0013 % 0014 % Ouput arguments: 0015 % 0016 % x: equalized symbols. Size: matrix [2*Para.M, 2*Para.Ns]. 0017 % 0018 % phi: estimated phase. Size: vector [2*Para.Ns, 1]. 0019 % 0020 % References: [1] T.-H. Nguyen, J. Louveaux, S.-P. Gorza and F. Horlin, 0021 % "Simple Feedforward Carrier Phase Estimation for Optical FBMC/OQAM 0022 % Systems," IEEE Photon. Technol. Lett., vol. 28, no. 24, pp. 2823-2826, 0023 % Dec. 2016. 0024 % 0025 0026 % This file is part of WaveComBox: www.wavecombox.com and is distributed under the terms of the MIT license. See accompanying LICENSE file. 0027 % Original author: T.-H. Nguyen, May 22, 2018. 0028 % Contributors: François Rottenberg, June 19, 2018 0029 % Change log: 0030 0031 M=Para.nSubcarriers/2; 0032 Ns=Para.Ns; 0033 M_PAM=Para.M_PAM; 0034 mod_norm=sqrt(Para.Es/2/(1./Para.M_PAM.*sum(abs(pammod([0:Para.M_PAM-1],Para.M_PAM)).^2))); 0035 0036 0037 phi=zeros(2*Ns,1); 0038 if Para.N_R==1 && Para.N_T==1 0039 x=zeros(2*M,2*Ns); 0040 for l=1:2*Ns 0041 z_bps(1,:) = z(:,l); 0042 0043 phi_bps = linspace(-pi/2, pi/2, B); 0044 rx_temp = zeros(B,length(z_bps)); 0045 rx_dec = zeros(B,length(z_bps)); 0046 dis = zeros(1,B); 0047 for k = 1 : B 0048 rx_temp(k,:) = z_bps.*exp(1i*phi_bps(k)); 0049 rx_dec(k, :) = pammod(pamdemod(rx_temp(k, :)/mod_norm,M_PAM),M_PAM).*mod_norm; 0050 dis(k) = sum(abs(real(rx_temp(k,:)) - rx_dec(k,:))); 0051 end 0052 [~, ind] = min(dis); 0053 phi(l) = -phi_bps(ind); 0054 x(:,l)=exp(-1j*phi(l)).*z(:,l); 0055 end 0056 if PhaseAmbiguityCompensation 0057 x=zeros(2*M,2*Ns); 0058 epsilon1 = 0.05; 0059 epsilon2 = 1.3; 0060 phi_cor = PhaAmbiguityBPS(phi, epsilon1, epsilon2); 0061 for l = 1:2*Ns 0062 x(:,l)=exp(-1j*phi_cor(l)).*z(:,l); 0063 end 0064 end 0065 else 0066 error('Function not implemented for N_T>1, N_R>1') 0067 end 0068 0069 end 0070