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

FBMC_OQAM_EqualizerMultiTapFS

PURPOSE ^

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

SYNOPSIS ^

function [ x ] = FBMC_OQAM_EqualizerMultiTapFS( z, C, L_eq, criterion, Para, H_arg )

DESCRIPTION ^

 Multiple-tap per-subcarrier equalization of the demodulated FBMC-OQAM
 symbols using the frequency sampling approach to fix tap coefficients.

 function [ x ] = FBMC_OQAM_EqualizerMultiTapFS( z, C, L_e, criterion, Para )
 function [ x ] = FBMC_OQAM_EqualizerMultiTapFS( z, C, L_e, criterion, Para, H_arg )

 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.

   criterion: determines the criterion to use. Several 
 options are possible: 

       'ZF': zero forcing. Error if Para.N_R < Para.N_T. 

       'MMSE': minimum mean squared error. Error if Para.N_R < Para.N_T. 

       'Specific': use H_arg for the channel frequency response only for SISO.

   Para: structure containing the modulation parameters.

   H_arg: optional argument, channel frequency response used if criterion
   set to 'Specific'.

 Ouput arguments:

   x: equalized symbols. Size: matrix [Para.nSubcarriers, 2*Para.Ns] if Para.S ==1 or
   multidimensional array [Para.S,Para.nSubcarriers,2*Para.Ns] if Para.S > 1
   
 References: 
   [1] Louveaux, J. et al., "Equalization and demodulation in
   the receiver (single antenna)," tech. rep., ICT-211887 PHYDYAS, July
   2008. 
   [2] T. Ihalainen, T. H. Stitz, M. Rinne, and M. Renfors, "Channel
   equalization in filter bank based multicarrier modulation for wireless
   communications," EURASIP Journal on Applied Signal Processing, vol.
   2007, no. 1, pp. 140–140, 2007. 
   [3] T. Ihalainen, A. Ikhlef, J. Louveaux and M. Renfors, "Channel
   Equalization for Multi-Antenna FBMC/OQAM Receivers," in IEEE
   Transactions on Vehicular Technology, vol. 60, no. 5, pp. 2070-2085,
   Jun 2011.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [ x ] = FBMC_OQAM_EqualizerMultiTapFS( z, C, L_eq, criterion, Para, H_arg )
0002 % Multiple-tap per-subcarrier equalization of the demodulated FBMC-OQAM
0003 % symbols using the frequency sampling approach to fix tap coefficients.
0004 %
0005 % function [ x ] = FBMC_OQAM_EqualizerMultiTapFS( z, C, L_e, criterion, Para )
0006 % function [ x ] = FBMC_OQAM_EqualizerMultiTapFS( z, C, L_e, criterion, Para, H_arg )
0007 %
0008 % The function works for MIMO and SISO systems.
0009 %
0010 % Input arguments:
0011 %
0012 %   z: demodulated FBMC-OQAM symbols. Size: matrix [Para.nSubcarriers, N] if
0013 %   Para.N_R == 1, multidimensional array [Para.N_R, Para.nSubcarriers, N]
0014 %   if Para.N_R > 1.
0015 %
0016 %   C: channel impulse response. Multidimensional array [Para.N_R, Para.N_T, ~].
0017 %
0018 %   L_e: number of taps of equalizer, must be odd.
0019 %
0020 %   criterion: determines the criterion to use. Several
0021 % options are possible:
0022 %
0023 %       'ZF': zero forcing. Error if Para.N_R < Para.N_T.
0024 %
0025 %       'MMSE': minimum mean squared error. Error if Para.N_R < Para.N_T.
0026 %
0027 %       'Specific': use H_arg for the channel frequency response only for SISO.
0028 %
0029 %   Para: structure containing the modulation parameters.
0030 %
0031 %   H_arg: optional argument, channel frequency response used if criterion
0032 %   set to 'Specific'.
0033 %
0034 % Ouput arguments:
0035 %
0036 %   x: equalized symbols. Size: matrix [Para.nSubcarriers, 2*Para.Ns] if Para.S ==1 or
0037 %   multidimensional array [Para.S,Para.nSubcarriers,2*Para.Ns] if Para.S > 1
0038 %
0039 % References:
0040 %   [1] Louveaux, J. et al., "Equalization and demodulation in
0041 %   the receiver (single antenna)," tech. rep., ICT-211887 PHYDYAS, July
0042 %   2008.
0043 %   [2] T. Ihalainen, T. H. Stitz, M. Rinne, and M. Renfors, "Channel
0044 %   equalization in filter bank based multicarrier modulation for wireless
0045 %   communications," EURASIP Journal on Applied Signal Processing, vol.
0046 %   2007, no. 1, pp. 140–140, 2007.
0047 %   [3] T. Ihalainen, A. Ikhlef, J. Louveaux and M. Renfors, "Channel
0048 %   Equalization for Multi-Antenna FBMC/OQAM Receivers," in IEEE
0049 %   Transactions on Vehicular Technology, vol. 60, no. 5, pp. 2070-2085,
0050 %   Jun 2011.
0051 
0052 
0053 % This file is part of WaveComBox: www.wavecombox.com and is distributed under the terms of the MIT license. See accompanying LICENSE file.
0054 % Original author: François Rottenberg, May 4, 2018.
0055 % Contributors:
0056 % Change log:
0057 
0058 M=Para.nSubcarriers/2;
0059 
0060 P=(L_eq-1)/2;
0061 Omega_p=2*pi*(-P:P)/(L_eq+1);
0062 
0063 if mod(L_eq,2)==0
0064     error('L_eq should be odd')
0065 end
0066 
0067 theta=ones(2*M,2*Para.Ns);
0068 theta(2:2:end,1:2:end)=1j;
0069 theta(1:2:end,2:2:end)=1j;
0070 
0071 if Para.N_R==1 && Para.N_T==1
0072     z=z.*theta;
0073     H=squeeze(fft(C,2*M*(L_eq+1)/2));
0074     if length(H(:,1))==1
0075         H=H.';
0076     end
0077     x=zeros(2*M,2*Para.Ns);
0078     A=exp(-1j*Omega_p'*(-P:P));
0079     A_inv=A\eye(L_eq,L_eq);
0080     B=zeros(L_eq,2*M);
0081     switch criterion
0082         case 'ZF'
0083             for m=0:2*M-1
0084                 point_in_f=mod(m*(L_eq+1)/2+(-P:P),2*M*(L_eq+1)/2) +1;
0085                 H_target=H(point_in_f);
0086                 G=1./H_target;
0087                 B(:,m+1)=A_inv*G;
0088                 B(:,m+1)=(-1).^((m)*(-P:P)').*B(:,m+1);
0089             end
0090         case 'MMSE'
0091             % Noise power
0092             Es_N0=10.^(Para.Es_N0_dB/10);
0093             for m=0:2*M-1
0094                 point_in_f=mod(m*(L_eq+1)/2+(-P:P),2*M*(L_eq+1)/2) +1;
0095                 H_target=H(point_in_f);
0096                 G=conj(H_target)./(abs(H_target).^2+1/Es_N0);
0097                 B(:,m+1)=A_inv*G;
0098                 B(:,m+1)=(-1).^((m)*(-P:P)').*B(:,m+1);
0099             end
0100         case 'Specific'
0101             H=H_arg;
0102             for m=0:2*M-1
0103                 point_in_f=mod(m*(L_eq+1)/2+(-P:P),2*M*(L_eq+1)/2) +1;
0104                 H_target=H(point_in_f);
0105                 G=1./H_target;
0106                 B(:,m+1)=A_inv*G;
0107                 B(:,m+1)=(-1).^((m)*(-P:P)').*B(:,m+1);
0108             end
0109         otherwise
0110             error('Equalizer type not existing')
0111     end
0112     for m=Para.ActiveSubcarriers
0113         temp=conv(z(m,:),(B(:,m)));
0114         x(m,:)=temp(P+1:P+2*Para.Ns);
0115     end
0116     x=x.*conj(theta);
0117 else
0118     if Para.N_T>Para.N_R
0119         error('N_T>N_R')
0120     else
0121         H=zeros(Para.N_R,Para.N_T,2*M*(L_eq+1)/2);
0122         for index_N_R=1:Para.N_R
0123             z(index_N_R,:,:)=squeeze(z(index_N_R,:,:)).*theta;
0124             for index_N_T=1:Para.N_T
0125                 H(index_N_R,index_N_T,:)=fft(squeeze(C(index_N_R,index_N_T,:)),2*M*(L_eq+1)/2).';
0126             end
0127         end
0128         A=exp(-1j*Omega_p'*(-P:P));
0129 %         A_kron=kron(A,eye(Para.N_T,Para.N_T));
0130         A_inv=inv(A);
0131         A_kron_inv=kron(A_inv,eye(Para.N_T,Para.N_T));
0132         
0133         B=zeros(L_eq*Para.N_T,Para.N_R,2*M);
0134         G=zeros(L_eq*Para.N_T,Para.N_R);
0135         for m=0:2*M-1
0136             for p=-P:P
0137                 point_in_f=mod(m*(L_eq+1)/2+p,2*M*(L_eq+1)/2) +1;
0138                 switch criterion
0139                     case 'ZF'
0140                         G((p+P)*Para.N_T+1:(p+P)*Para.N_T+Para.N_T,:)=(H(:,:,point_in_f)'*H(:,:,point_in_f))\H(:,:,point_in_f)';
0141                     case 'MMSE'
0142                         % Noise power
0143                         Es_N0=10.^(Para.Es_N0_dB/10);
0144                         G((p+P)*Para.N_T+1:(p+P)*Para.N_T+Para.N_T,:)=eye(Para.N_T,Para.N_T)/(H(:,:,point_in_f)'*H(:,:,point_in_f)+1/Es_N0*Para.N_T*eye(Para.N_T,Para.N_T))*H(:,:,point_in_f)';                        
0145                     case 'Specific'
0146                         error('Equalizer type not implemented for MIMO')
0147                     otherwise
0148                         error('Equalizer type not existing')
0149                 end
0150             end
0151             B(:,:,m+1)=A_kron_inv*G;
0152             B(:,:,m+1)=kron(diag((-1).^(m*(-P:P))),eye(Para.N_T,Para.N_T))*B(:,:,m+1);
0153         end
0154         x=zeros(Para.S,2*M,2*Para.Ns);
0155         for m=Para.ActiveSubcarriers
0156             temp=squeeze(B(:,:,m));
0157             W_eq=zeros(Para.N_T,Para.N_R,L_eq);
0158             for b=0:L_eq-1
0159                 W_eq(:,:,b+1)=temp(1+b*Para.N_T:Para.N_T+b*Para.N_T,:);
0160             end
0161             temp=MatrixConv( W_eq,squeeze(z(:,m,:)) );
0162             x(:,m,:)=temp(:,P+1:P+2*Para.Ns);
0163         end
0164         for index_S=1:Para.S
0165             x(index_S,:,:)=squeeze(x(index_S,:,:)).*conj(theta);
0166         end
0167         
0168         if Para.S==1
0169             x=squeeze(x);
0170         end
0171     end
0172     
0173 end
0174 
0175 
0176 
0177 
0178 end

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