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