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.
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