Home > WaveComBox > Toolbox > FBMC_OQAM > ChannelEqualization > FBMC_OQAM_EqualizerMultiTapFullMMSE.m

FBMC_OQAM_EqualizerMultiTapFullMMSE

PURPOSE ^

Multiple-tap per-subcarrier equalization of the demodulated FBMC-OQAM

SYNOPSIS ^

function [ x ] = FBMC_OQAM_EqualizerMultiTapFullMMSE( z, C, L_e, Para )

DESCRIPTION ^

 Multiple-tap per-subcarrier equalization of the demodulated FBMC-OQAM
 symbols using a general MMSE design to optimize tap coefficients.

 function [ x ] = FBMC_OQAM_EqualizerMultiTapMMSE( z, C, L_e, Para )

 The function works for MIMO and SISO systems.

 Input arguments:

   z: demodulated FBMC-OQAM symbols. Size: matrix [Para.nSubcarriers, N] if
   Para.N_R == 1, multidimensional array [Para.N_R, Para.nSubcarriers, N]
   if Para.N_R > 1.   

   C: channel impulse response. Multidimensional array [Para.N_R, Para.N_T, ~].

   L_e: number of taps of equalizer, must be odd.

   Para: structure containing the modulation parameters.

 Ouput arguments:

   x: equalized symbols. Size: matrix [Para.nSubcarriers, 2*Para.Ns]
   
 References: [1] D. S. Waldhauser, L. G. Baltar and J. A. Nossek, "MMSE
   subcarrier equalization for filter bank based multicarrier systems,"
   2008 IEEE 9th Workshop on Signal Processing Advances in Wireless
   Communications, Recife, 2008, pp. 525-529.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [ x ] = FBMC_OQAM_EqualizerMultiTapFullMMSE( z, C, L_e, Para )
0002 % Multiple-tap per-subcarrier equalization of the demodulated FBMC-OQAM
0003 % symbols using a general MMSE design to optimize tap coefficients.
0004 %
0005 % function [ x ] = FBMC_OQAM_EqualizerMultiTapMMSE( z, C, L_e, Para )
0006 %
0007 % The function works for MIMO and SISO systems.
0008 %
0009 % Input arguments:
0010 %
0011 %   z: demodulated FBMC-OQAM symbols. Size: matrix [Para.nSubcarriers, N] if
0012 %   Para.N_R == 1, multidimensional array [Para.N_R, Para.nSubcarriers, N]
0013 %   if Para.N_R > 1.
0014 %
0015 %   C: channel impulse response. Multidimensional array [Para.N_R, Para.N_T, ~].
0016 %
0017 %   L_e: number of taps of equalizer, must be odd.
0018 %
0019 %   Para: structure containing the modulation parameters.
0020 %
0021 % Ouput arguments:
0022 %
0023 %   x: equalized symbols. Size: matrix [Para.nSubcarriers, 2*Para.Ns]
0024 %
0025 % References: [1] D. S. Waldhauser, L. G. Baltar and J. A. Nossek, "MMSE
0026 %   subcarrier equalization for filter bank based multicarrier systems,"
0027 %   2008 IEEE 9th Workshop on Signal Processing Advances in Wireless
0028 %   Communications, Recife, 2008, pp. 525-529.
0029 %
0030 
0031 
0032 % This file is part of WaveComBox: www.wavecombox.com and is distributed under the terms of the MIT license. See accompanying LICENSE file.
0033 % Original author: François Rottenberg, May 4, 2018.
0034 % Contributors:
0035 % Change log:
0036 
0037 if mod(L_e,2)==0
0038     error('L_e should be odd')
0039 end
0040 M=Para.nSubcarriers/2;
0041 
0042 [g, ~] = GeneratePrototypePhydyas(M, Para.kappa);
0043 g       = g.*sqrt(1/M);
0044 g_m=zeros(2*M,2*M*Para.kappa);
0045 for k=0:2*M-1
0046     for m=0:2*M*Para.kappa-1
0047         g_m(k+1,m+1)=g(m+1).*exp(1j*2*pi*k/2/M*(m-(2*M*Para.kappa-1)/2));
0048     end
0049 end
0050 f_m=[zeros(2*M,1) g_m];
0051 
0052 theta=ones(2*M,2*(Para.Ns));
0053 theta(2:2:end,1:2:end)=1j;
0054 theta(1:2:end,2:2:end)=1j;
0055 Para.Es_N0=10.^(Para.Es_N0_dB/10);
0056 N0=Para.Es./Para.Es_N0;
0057 
0058 if Para.N_R==1 && Para.N_T==1
0059     C=squeeze(C);
0060     z=z(:,2*Para.PreambleLength+1:end).*theta;
0061     L=4*Para.kappa+ceil((length(C)-1)/M);
0062     alpha=2*Para.kappa+(L_e-1)/2;
0063     e=zeros(L+L_e-1,1);
0064     e(alpha+1)=1;
0065     G=zeros(L_e,(L_e-1+2*Para.kappa)*M);
0066     for index=1:L_e
0067         G(index,(index-1)*M+1:(index-1)*M+2*Para.kappa*M)=g_m(1,:);
0068     end
0069     R_w=N0*(G*G');
0070     x=zeros(2*M,2*Para.Ns);
0071     for m_0=Para.ActiveSubcarriers
0072         q_eq_m_0_m_0_plus1=downsample(conv(conv(g_m(mod(m_0+1-1,2*M)+1,:),C),f_m(m_0,:)),M);
0073         q_eq_m_0_m_0=downsample(conv(conv(g_m(m_0,:),C),f_m(m_0,:)),M);
0074         q_eq_m_0_m_0_moins1=downsample(conv(conv(g_m(mod(m_0-1-1,2*M)+1,:),C),f_m(m_0,:)),M);        
0075         
0076         Q_eq_m_0_m_0=toeplitz([q_eq_m_0_m_0(1);zeros(L_e-1,1)],[q_eq_m_0_m_0, zeros(1,L_e-1)]);
0077         Q_eq_m_0_m_0_moins1=toeplitz([q_eq_m_0_m_0_moins1(1);zeros(L_e-1,1)],[q_eq_m_0_m_0_moins1, zeros(1,L_e-1)]);
0078         Q_eq_m_0_m_0_plus1=toeplitz([q_eq_m_0_m_0_plus1(1);zeros(L_e-1,1)],[q_eq_m_0_m_0_plus1, zeros(1,L_e-1)]);
0079         R_Q=Q_eq_m_0_m_0*Q_eq_m_0_m_0'+Q_eq_m_0_m_0_plus1*Q_eq_m_0_m_0_plus1'+Q_eq_m_0_m_0_moins1*Q_eq_m_0_m_0_moins1';
0080         
0081         p_transpose=e'*Q_eq_m_0_m_0'/(1/2*R_Q+1/Para.Es*R_w);
0082         x_m_0_l_0=conv(p_transpose,z(m_0,:));
0083         x(m_0,:)=x_m_0_l_0((L_e-1)/2+1:(L_e-1)/2+2*Para.Ns)   ;
0084     end
0085     x=x.*conj(theta);
0086 else
0087     if Para.N_T>Para.N_R
0088         error('N_T>N_R')
0089     else
0090         error('Not yet implemented')
0091     end
0092     
0093 end
0094 
0095 
0096 
0097 
0098 end

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