Home > WaveComBox > Toolbox > FBMC_OQAM > PerformanceAnalysis > FBMC_OQAM_MSESingleTapTheorApprox.m

FBMC_OQAM_MSESingleTapTheorApprox

PURPOSE ^

Computes FBMC-OQAM theoretical MSE for single-tap pre-equalizing and equalizing matrices [1].

SYNOPSIS ^

function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C, Para, A, A_1, A_2 )

DESCRIPTION ^

 Computes FBMC-OQAM theoretical MSE for single-tap pre-equalizing and equalizing matrices [1].

 function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C,
 Para ) preamble_type) 
 function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C,
 Para, A ) preamble_type) 
 function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C,
 Para, A, A_1 ) preamble_type)
 function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C,
 Para, A, A_1, A_2 ) preamble_type)

 The function works for SISO and MIMO time-invariant systems. The MSE
 expression is exact for frequency non selective channels and is generally
 very accurate for frequency selective channels. The MSE is aggregated
 over all spatial streams.

 Input arguments:

   B: equalizing matrices at each subcarrier. Size: vector [Para.nSubcarriers, 1]
   if Para.N_T == Para.N_R == 1 and multidimensional array
   [Para.S,Para.N_R,Para.nSubcarriers] otherwise

   C: channel impulse response. Vector if Para.N_R == 1 and
   multidimensional array [Para.N_R, Para.N_T, ~] if Para.N_R > 1.

   Para: structure containing the modulation parameters.

   A: (optional, by default identity) pre-equalizing matrices at each
   subcarrier. Size: vector [Para.nSubcarriers, 1] if Para.N_T == Para.N_R == 1 and
   multidimensional array [Para.T,Para.S,Para.nSubcarriers] otherwise

   A_1: (optional, by default 0) first frequency derivative of
   pre-equalizing matrices at each subcarrier. Size: vector [Para.nSubcarriers, 1]
   if Para.N_T == Para.N_R == 1 and multidimensional array
   [Para.T,Para.S,Para.nSubcarriers] otherwise

   A_2: (optional, by default 0) second frequency derivative of
   pre-equalizing matrices at each subcarrier. Size: vector [Para.nSubcarriers, 1]
   if Para.N_T == Para.N_R == 1 and multidimensional array
   [Para.T,Para.S,Para.nSubcarriers] otherwise

 Outputs arguments:

   MSE_theo: MSE at each subcarrier. Size: vector [Para.nSubcarriers, 1]


   References: [1]    F. Rottenberg, X. Mestre, F. Horlin and J. Louveaux,
   "Single-Tap Precoders and Decoders for Multi-User MIMO FBMC-OQAM under
   Strong Channel Frequency Selectivity," IEEE Transactions on Signal
   Processing, 2017, vol. 65, no. 3, pp. 587-600.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C, Para, A, A_1, A_2 )
0002 % Computes FBMC-OQAM theoretical MSE for single-tap pre-equalizing and equalizing matrices [1].
0003 %
0004 % function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C,
0005 % Para ) preamble_type)
0006 % function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C,
0007 % Para, A ) preamble_type)
0008 % function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C,
0009 % Para, A, A_1 ) preamble_type)
0010 % function [ MSE_theo_approx ] = FBMC_OQAM_MSESingleTapTheorApprox( B, C,
0011 % Para, A, A_1, A_2 ) preamble_type)
0012 %
0013 % The function works for SISO and MIMO time-invariant systems. The MSE
0014 % expression is exact for frequency non selective channels and is generally
0015 % very accurate for frequency selective channels. The MSE is aggregated
0016 % over all spatial streams.
0017 %
0018 % Input arguments:
0019 %
0020 %   B: equalizing matrices at each subcarrier. Size: vector [Para.nSubcarriers, 1]
0021 %   if Para.N_T == Para.N_R == 1 and multidimensional array
0022 %   [Para.S,Para.N_R,Para.nSubcarriers] otherwise
0023 %
0024 %   C: channel impulse response. Vector if Para.N_R == 1 and
0025 %   multidimensional array [Para.N_R, Para.N_T, ~] if Para.N_R > 1.
0026 %
0027 %   Para: structure containing the modulation parameters.
0028 %
0029 %   A: (optional, by default identity) pre-equalizing matrices at each
0030 %   subcarrier. Size: vector [Para.nSubcarriers, 1] if Para.N_T == Para.N_R == 1 and
0031 %   multidimensional array [Para.T,Para.S,Para.nSubcarriers] otherwise
0032 %
0033 %   A_1: (optional, by default 0) first frequency derivative of
0034 %   pre-equalizing matrices at each subcarrier. Size: vector [Para.nSubcarriers, 1]
0035 %   if Para.N_T == Para.N_R == 1 and multidimensional array
0036 %   [Para.T,Para.S,Para.nSubcarriers] otherwise
0037 %
0038 %   A_2: (optional, by default 0) second frequency derivative of
0039 %   pre-equalizing matrices at each subcarrier. Size: vector [Para.nSubcarriers, 1]
0040 %   if Para.N_T == Para.N_R == 1 and multidimensional array
0041 %   [Para.T,Para.S,Para.nSubcarriers] otherwise
0042 %
0043 % Outputs arguments:
0044 %
0045 %   MSE_theo: MSE at each subcarrier. Size: vector [Para.nSubcarriers, 1]
0046 %
0047 %
0048 %   References: [1]    F. Rottenberg, X. Mestre, F. Horlin and J. Louveaux,
0049 %   "Single-Tap Precoders and Decoders for Multi-User MIMO FBMC-OQAM under
0050 %   Strong Channel Frequency Selectivity," IEEE Transactions on Signal
0051 %   Processing, 2017, vol. 65, no. 3, pp. 587-600.
0052 %
0053 
0054 % This file is part of WaveComBox: www.wavecombox.com and is distributed under the terms of the MIT license. See accompanying LICENSE file.
0055 % Original author: François Rottenberg, May 3, 2018.
0056 % Contributors:
0057 % Change log:
0058 
0059 N_R=Para.N_R;
0060 N_T=Para.N_T;
0061 S=Para.S;
0062 M=Para.nSubcarriers/2;
0063 if exist('A','var')==0
0064     A=zeros(N_T,S,2*M);
0065     for m=1:2*M
0066         A(:,:,m)=1./sqrt(S)*eye(N_T);
0067     end
0068 else
0069     A=A./sqrt(S);
0070 end
0071 if exist('A_1','var')==0
0072     A_1=zeros(N_T,S,2*M);
0073 else
0074     A_1=A_1./sqrt(S);
0075 end
0076 if exist('A_2','var')==0
0077     A_2=zeros(N_T,S,2*M);
0078 else
0079     A_2=A_2./sqrt(S);
0080 end
0081 
0082 
0083 %% Theoretical approximation of the MSE [TSP1]
0084 
0085 % Compute CFR and its derivatives
0086 L=length(C(1,1,:));
0087 H=zeros(N_R,N_T,2*M);
0088 H_1=zeros(N_R,N_T,2*M);
0089 H_2=zeros(N_R,N_T,2*M);
0090 for i=1:N_R
0091     for j=1:N_T        
0092         H(i,j,:)=fft(squeeze(C(i,j,:)),2*M).';
0093         H_1(i,j,:)=-sqrt(-1)*fft((0:L-1).*squeeze(C(i,j,:)).',2*M).';
0094         H_2(i,j,:)=-fft((0:L-1).^2.*squeeze(C(i,j,:)).',2*M).';
0095     end
0096 end
0097 
0098 % Compute pulse-related quantities eta_tilde
0099 [eta_tilde, zeta_tilde]=ComputeEtaTilde(Para);
0100 % Noise power
0101 Para.Es_N0=10.^(Para.Es_N0_dB/10);
0102 N0=Para.Es./Para.Es_N0;
0103 
0104 % Compute MSE at each active subcarrier
0105 MSE_theo_approx=zeros(2*M,1);
0106 for m=Para.ActiveSubcarriers
0107     if N_T==1 && N_R==1
0108         H_m=H(m);
0109         H1_m=H_1(m);
0110         H2_m=H_2(m);
0111         B_m=B(m);
0112         A_m=A(m);
0113         A1_m=A_1(m);
0114         A2_m=A_2(m);
0115     else
0116         H_m=H(:,:,m);
0117         H1_m=H_1(:,:,m);
0118         H2_m=H_2(:,:,m);
0119         B_m=B(:,:,m);
0120         A_m=A(:,:,m);
0121         A1_m=A_1(:,:,m);
0122         A2_m=A_2(:,:,m);
0123     end
0124     I=1./sqrt(Para.S)*eye(S,S);
0125     MSE_theo_approx(m)= Para.Es/2*trace( (B_m*H_m*A_m-I)*(B_m*H_m*A_m-I)'  )...
0126         +Para.Es*eta_tilde*trace((B_m*H1_m*A_m)*(B_m*H1_m*A_m)')...
0127         +Para.Es*eta_tilde*real( trace((B_m*H_m*A_m-I)*(B_m*H2_m*A_m)') )...
0128         +Para.Es*2*(eta_tilde+zeta_tilde)*trace(imag(B_m*H_m*A_m)*imag(B_m*(H1_m*A1_m+H_m*A2_m))' ) ...
0129         +Para.Es*2*(eta_tilde+zeta_tilde)*trace(imag(B_m*H_m*A1_m)*imag(B_m*(H1_m*A_m+H_m*A1_m))' ) ...
0130         +N0/2*trace(B_m*B_m');
0131 end
0132 
0133 
0134 
0135 end
0136

Generated on Mon 24-Jun-2019 13:51:48 by m2html © 2005