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

FBMC_OQAM_EqualizerFrequencySpreadingReceiver

PURPOSE ^

Frequency spreading equalization of received FBMC-OQAM signal.

SYNOPSIS ^

function [ x ] = FBMC_OQAM_EqualizerFrequencySpreadingReceiver( r, C, criterion, Para, B )

DESCRIPTION ^

 Frequency spreading equalization of received FBMC-OQAM signal.

 function [ x ] = FBMC_OQAM_EqualizerFrequencySpreadingReceiver( r, C, criterion, Para )

 The function works for MIMO and SISO systems.

 Input arguments:

   r: received signal. Size: vector [para.N_R, nFrameSamples].

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

   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': the specific equalizing matrices given in the function
       argument B should be provided and will be used for equalization.
       Argument C is not regarded.

   Para: structure containing the modulation parameters.

   B: the equalizing matrices at each subcarrier should be provided if
   'Specific' equalizer type is chosen. If not chosen, the matrix B is
   disregarded. Size: vector [Para.nSubcarriers ,1] if Para.N_T == 1 and multi-
   dimensional array [Para.S, Para.N_R, Para.nSubcarriers] otherwise.

 Ouput arguments:

   x: equalized symbols. Size: matrix [Para.nSubcarriers, 2*Para.Ns] if Para.S == 1,
   multidimensional array [para.S, Para.nSubcarriers, 2*Para.Ns] if Para.S > 1.   


 References: 
   [1] M. Bellanger, "FS-FBMC: An alternative scheme for filter bank based
   multicarrier transmission," in 2012 5th International Symposium on
   Communications, Control and Signal Processing, pp. 1–4, May 2012.
   [2] D. Mattera, M. Tanda, and M. Bellanger, "Frequency-spreading
   implementation of OFDM/OQAM systems," in 2012 International Symposium
   on Wireless Communication Systems (ISWCS), pp. 176– 180, Aug 2012.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [ x ] = FBMC_OQAM_EqualizerFrequencySpreadingReceiver( r, C, criterion, Para, B )
0002 % Frequency spreading equalization of received FBMC-OQAM signal.
0003 %
0004 % function [ x ] = FBMC_OQAM_EqualizerFrequencySpreadingReceiver( r, C, criterion, Para )
0005 %
0006 % The function works for MIMO and SISO systems.
0007 %
0008 % Input arguments:
0009 %
0010 %   r: received signal. Size: vector [para.N_R, nFrameSamples].
0011 %
0012 %   C: tme-invariant channel impulse response. Multidimensional array
0013 %   [Para.N_R, Para.N_T, ~].
0014 %
0015 %   criterion: determines the criterion to use. Several
0016 % options are possible:
0017 %
0018 %       'ZF': zero forcing. Error if Para.N_R < Para.N_T.
0019 %
0020 %       'MMSE': minimum mean squared error. Error if Para.N_R < Para.N_T.
0021 %
0022 %       'Specific': the specific equalizing matrices given in the function
0023 %       argument B should be provided and will be used for equalization.
0024 %       Argument C is not regarded.
0025 %
0026 %   Para: structure containing the modulation parameters.
0027 %
0028 %   B: the equalizing matrices at each subcarrier should be provided if
0029 %   'Specific' equalizer type is chosen. If not chosen, the matrix B is
0030 %   disregarded. Size: vector [Para.nSubcarriers ,1] if Para.N_T == 1 and multi-
0031 %   dimensional array [Para.S, Para.N_R, Para.nSubcarriers] otherwise.
0032 %
0033 % Ouput arguments:
0034 %
0035 %   x: equalized symbols. Size: matrix [Para.nSubcarriers, 2*Para.Ns] if Para.S == 1,
0036 %   multidimensional array [para.S, Para.nSubcarriers, 2*Para.Ns] if Para.S > 1.
0037 %
0038 %
0039 % References:
0040 %   [1] M. Bellanger, "FS-FBMC: An alternative scheme for filter bank based
0041 %   multicarrier transmission," in 2012 5th International Symposium on
0042 %   Communications, Control and Signal Processing, pp. 1–4, May 2012.
0043 %   [2] D. Mattera, M. Tanda, and M. Bellanger, "Frequency-spreading
0044 %   implementation of OFDM/OQAM systems," in 2012 International Symposium
0045 %   on Wireless Communication Systems (ISWCS), pp. 176– 180, Aug 2012.
0046 
0047 % This file is part of WaveComBox: www.wavecombox.com and is distributed under the terms of the MIT license. See accompanying LICENSE file.
0048 % Original author: François Rottenberg, May 4, 2018.
0049 % Contributors:
0050 % Change log:
0051 
0052 
0053 switch Para.kappa
0054     case 2
0055         HkOneSided = sqrt(2)/2;
0056         Hk = [fliplr(HkOneSided) 1 HkOneSided];
0057     case 3
0058         HkOneSided = [0.91143783 0.41143783];
0059         Hk = [fliplr(HkOneSided) 1 HkOneSided];
0060     case 4
0061         HkOneSided = [0.971960 sqrt(2)/2 0.235147];
0062         Hk = [fliplr(HkOneSided) 1 HkOneSided];
0063     otherwise
0064         error('Parameters of kappa not supported')
0065 end
0066 M=Para.nSubcarriers/2;
0067 
0068 theta=ones(2*M,2*(Para.Ns));
0069 theta(2:2:end,1:2:end)=1j;
0070 theta(1:2:end,2:2:end)=1j;
0071 
0072 if Para.N_R==1 && Para.N_T==1
0073     C=squeeze(C);
0074     H=(fft(C,2*M*Para.kappa));
0075     switch criterion
0076         case 'ZF'
0077             B=1./H;
0078         case 'MMSE'
0079             % Noise power
0080             Es_N0=10.^(Para.Es_N0_dB/10);
0081             B=conj(H)./(abs(H).^2+1/Es_N0);
0082         case 'Specific'
0083             if exist('B','var')==0
0084                error('Argument B missing for criterion "Specific"') 
0085             end
0086         case 'MF'
0087             B=1./H;
0088         otherwise
0089             error('Equalizer type not existing')
0090     end
0091     x=zeros(2*M,2*Para.Ns);
0092     r=r(2*Para.PreambleLength*M+1:end);
0093     for l=1:2*Para.Ns
0094         r_block=r((l-1)*M+1:(l-1)*M+Para.kappa*2*M).';
0095         x_fft=1/Para.kappa*1/sqrt(2*M)*fft(r_block).*exp(1j*2*pi/2/M/Para.kappa*(0:2*M*Para.kappa-1)'*(2*M*Para.kappa-1)/2);
0096         for m=1:2*M*Para.kappa
0097             x_fft(m)=x_fft(m).*B(m);
0098         end
0099         k=-Para.kappa+1:Para.kappa-1;
0100         % Particular case for m=1
0101         x_temp=x_fft(mod(k,2*M*Para.kappa)+1);
0102         x_temp(1:Para.kappa-1)=-x_temp(1:Para.kappa-1);
0103         x(1,l)=sum(Hk.*x_temp.');
0104         % Other cases
0105         for m=2:2*M
0106             x_temp=x_fft(mod(Para.kappa*(m-1)+k,2*M*Para.kappa)+1);
0107             x(m,l)=sum(Hk.*x_temp.');
0108         end
0109     end
0110     x=x.*conj(theta);
0111     
0112     
0113     
0114 else
0115     if Para.N_T>Para.N_R
0116         error('Error: N_T>N_R')
0117     else        
0118         H=zeros(Para.N_R,Para.N_T,2*M*Para.kappa);
0119         for index_N_R=1:Para.N_R
0120             for index_N_T=1:Para.N_T
0121                 H(index_N_R,index_N_T,:)=fft(squeeze(C(index_N_R,index_N_T,:)),2*M*Para.kappa).';
0122             end
0123         end
0124         B=zeros(Para.N_T, Para.N_R, 2*M*Para.kappa);
0125         switch criterion
0126             case 'ZF'
0127                 for m=1:2*M*Para.kappa
0128                     H_m=H(:,:,m);
0129                     B(:,:,m)=(H_m'*H_m)\H(:,:,m)';
0130                 end
0131             case 'MMSE'
0132                 % Noise power
0133                 Es_N0=10.^(Para.Es_N0_dB/10);
0134                 for m=1:2*M*Para.kappa
0135                     H_m=H(:,:,m);
0136                     B(:,:,m)=eye(Para.N_T,Para.N_T)/(H_m'*H_m+1/Es_N0*Para.N_T*eye(Para.N_T,Para.N_T))*H_m';
0137                 end
0138             case 'MF'
0139                 for m=1:2*M*Para.kappa
0140                     H_m=H(:,:,m);
0141                     B(:,:,m)= (diag(diag(H_m'*H_m)))\H_m';
0142                 end
0143             case 'Specific'
0144                 if exist('B','var')==0
0145                     error('Argument B missing for criterion "Specific"')
0146                 end
0147             otherwise
0148                 error('Equalizer type not existing')
0149         end
0150         
0151         x=zeros(Para.N_T,2*M,2*Para.Ns);
0152         r=r(:,2*Para.PreambleLength*M+1:end);
0153         for l=1:2*Para.Ns
0154             x_fft=zeros(Para.N_R,2*M*Para.kappa);
0155             for index_N_R=1:Para.N_R
0156                 r_block=r(index_N_R,(l-1)*M+1:(l-1)*M+Para.kappa*2*M).';
0157                 x_fft(index_N_R,:)=1/Para.kappa*1/sqrt(2*M)*fft(r_block).*exp(1j*2*pi/2/M/Para.kappa*(0:2*M*Para.kappa-1)'*(2*M*Para.kappa-1)/2);
0158             end
0159             x_eq_fft=zeros(Para.N_T,2*M*Para.kappa);
0160             for m=1:2*M*Para.kappa
0161                 x_eq_fft(:,m)=B(:,:,m)*x_fft(:,m);
0162             end
0163             k=-Para.kappa+1:Para.kappa-1;
0164             for index_N_T=1:Para.N_T
0165                 % Particular case for m=1
0166                 x_temp=x_eq_fft(index_N_T,mod(k,2*M*Para.kappa)+1);
0167                 x_temp(1:Para.kappa-1)=-x_temp(1:Para.kappa-1);
0168                 x(index_N_T,1,l)=sum(Hk.*x_temp);
0169                 % Other cases
0170                 for m=2:2*M
0171                     x_temp=x_eq_fft(index_N_T,mod(Para.kappa*(m-1)+k,2*M*Para.kappa)+1);
0172                     x(index_N_T,m,l)=sum(Hk.*x_temp);
0173                 end
0174             end
0175 
0176         end
0177         for index_N_T=1:Para.N_T
0178             x(index_N_T,:,:)=squeeze(x(index_N_T,:,:)).*conj(theta);
0179         end
0180         
0181         if Para.N_T==1
0182             x=squeeze(x);
0183         end
0184     end
0185     
0186 end
0187 
0188 
0189 
0190 
0191 
0192 
0193 
0194 
0195 
0196 
0197 
0198 
0199 
0200 
0201 
0202 end
0203

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