+ Post New Thread
Results 1 to 5 of 5
-
12th March 2018, 09:12 #1
- Join Date
- Mar 2018
- Posts
- 6
- Helped
- 0 / 0
- Points
- 45
- Level
- 1
What is best method for channel estimation in IEEE802.11n with 108 data and 6 pilot?
Hi all,
Does anyone know what is the best algorithm for channel estimation in "IEEE 802.11n" with (108 data sub-carrier and 6 pilots)?
Because when I use the Channel Estimation based on Pilot-Assisted Linear Interpolation for IEEE802.11a/g with 4 pilot, my code work as well according to this formula:
But for 6 pilots not work for IEEE802.11n.
Does anyone have any suggestions?
-
12th March 2018, 09:12
-
12th March 2018, 23:16 #2
- Join Date
- Oct 2013
- Posts
- 189
- Helped
- 66 / 66
- Points
- 1,928
- Level
- 10
- Blog Entries
- 5
Re: What is best method for channel estimation in IEEE802.11n with 108 data and 6 pil
The "best" algorithm really depends on your requirements; it depends on the nature of the channel and the resources you have available to perform the computation.
It also depends on which part(s) of the 802.11n standard you want to support. For example, if you want to support MIMO and/or STBC, then your channel estimation/equalisation procedure is likely to be more complex.
If you are only interested in single-antenna systems (i.e. no MIMO or STBC or MRC), then there is no structural difference between 802.11n and 802.11g in this context. Any technique that worked for 802.11g can be adapted to work for 802.11n.
1 members found this post helpful.
-
12th March 2018, 23:16
-
13th March 2018, 09:10 #3
- Join Date
- Mar 2018
- Posts
- 6
- Helped
- 0 / 0
- Points
- 45
- Level
- 1
Re: What is best method for channel estimation in IEEE802.11n with 108 data and 6 pil
First, thank you for your good advice to me.
I'm interested to use an only single antenna, after getting the result without error, change to the MIMO system.
First: Initialize the parameters for the 802.11n - 40MHz - channel: 114 sub-carriers (108 data, 6 pilots [-53 -25 -11 +11 +25 +53]).
Code:Bit_Num = 6; %64QAM - FFT_Num = 128; %FFT size - Carrier_Num = 108; - OFDM_per_Symbol = 1; - CP=32; % N-FFT/4 - LI = 18; %B/W -11 to +11 pilots , there are 18 data - Np = 6; %Nsp: No. pilot carrier Carriers = 1:Carrier_Num+Np; - N_Num = Bit_Num*Carrier_Num*OFDM_per_Symbol;
***
In the RX side, First, I did Packet detection and GI Removal, Then Time offset estimation and FFT transform.
ُSo, when I want to start to channel estimation with normal structure and with above formula for 6 pilots, I have an error, that I can not continue to next step for Demodulate. Because the formula work as well with 4 pilots. But when change to 6, I have an error "Matrix dimensions must agree." related to make the FFT system, because dimensions of FFTtmp is 108, but dimensions of HLs(channel estimation) with above formula is 102. that I do not know, how to I can resolve this problem???
-
13th March 2018, 09:10
-
13th March 2018, 21:40 #4
- Join Date
- Oct 2013
- Posts
- 189
- Helped
- 66 / 66
- Points
- 1,928
- Level
- 10
- Blog Entries
- 5
Re: What is best method for channel estimation in IEEE802.11n with 108 data and 6 pil
As I said before, the principle is exactly the same. Did you write the original code, or is this something you found online and are trying to adapt? If you understand the original version, you should be able to adapt it for your requirements.
Your descriptions are very vague. It is difficult to help you any further unless you upload your full code.
-
14th March 2018, 08:47 #5
- Join Date
- Mar 2018
- Posts
- 6
- Helped
- 0 / 0
- Points
- 45
- Level
- 1
Re: What is best method for channel estimation in IEEE802.11n with 108 data and 6 pil
this code is orginal by made me. just I want to next step adept with other parameters.
my problem with this section (channel estimation), I know for 4 pilots with these loops, with 3 repeats with 16 iterations make 48 data carrier for 802.11a/g.
But with 6 pilots, does not work these loops, because 6-1=5, and for iteration, the value is not an integer: 108/5=21.5
Code:%%%%%%%% OFDM transceiver with 802.11n %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%% Mohammad Hosseinvand %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% February 2018 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% %40Mhz %FFT: 128 %64QAM %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% Sub carriers (total/data): 114 total%%%%%%%%%%%%%%% %%%%%%%% Number of Pilots:6 {-53,-25,-11,11,25,53} %%%%%%%%% %%%%% Signal is TX on sub-carriers -58 to -2 and 2 to 58 %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% clear all; clc; %% *** Initialize the parameters *** %802.11n 40MHz channel: 114 sub-carriers (108 data, 6 pilot) Bit_Num = 6; %64QAM = 2^6 FFT_Num = 128; %FFT length Carrier_Num = 108; %Nsd: No. data carrier OFDM_per_Symbol = 1; %CP=32; % N-FFT/4 = 128/4=32 %LI = 18; %B/W -11 to +11 pilots , there are 18 data Np = 6; % No. pilot carrier Carriers = 1:Carrier_Num+Np; % Total no. carreirs 114 N_Num = Bit_Num*Carrier_Num*OFDM_per_Symbol; %% ***Generate the random binary stream for transmit-Transmitter starts*** BitTx= round(rand(1,(N_Num))); %% ***Modulate (generates 64QAM symbols)*** N_Num=length(BitTx); SymQAMtmp=reshape(BitTx,6,N_Num/6).'; SymQAMtmptmp=bi2de(SymQAMtmp,2,'left-msb'); QAMTable = [ -7-7j, 7-7j, -1-7j, 1-7j, -5-7j, 5-7j,... -3-7j, 3-7j, -7+7j, 7+7j, -1+7j, 1+7j,... -5+7j, 5+7j, -3+7j, 3+7j, -7-1j, 7-1j,... -1-1j, 1-1j, -5-1j, 5-1j, -3-1j, 3-1j,... -7+1j, 7+1j, -1+1j, 1+1j, -5+1j, 5+1j,... -3+1j, 3+1j, -7-5j, 7-5j, -1-5j, 1-5j,... -5-5j, 5-5j, -3-5j, 3-5j, -7+5j, 7+5j,... -1+5j, 1+5j, -5+5j, 5+5j, -3+5j, 3+5j,... -7-3j, 7-3j, -1-3j, 1-3j, -5-3j, 5-3j,... -3-3j, 3-3j, -7+3j, 7+3j, -1+3j, 1+3j,... -5+3j, 5+3j, -3+3j, 3+3j]; SymQAM=QAMTable(SymQAMtmptmp+1); %% ***Generate the preamble signal*** fsMHz = 40; % sampling frequency nFFTSize = 128; % for each symbol bits a1 to a114 are assigned to subcarrier % index [–58 to –2 +2 to +58] % Short preamble subcarrierIndex = [-58:-2 2:58]; %for 40Mhz and FFT 128 S1 = [zeros(1,6) 0 0 1+1j 0 0 0 -1-1j 0 0 0 1+1j 0 0 0 -1-1j 0 0 0 -1-1j 0 0 0 1+1j 0 0 0 ... 0 0 0 0 -1-1j 0 0 0 -1-1j 0 0 0 1+1j 0 0 0 1+1j 0 0 0 1+1j 0 0 0 1+1j 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 1+1j 0 0 0 -1-1j 0 0 0 1+1j 0 0 0 -1-1j 0 0 0 -1-1j 0 0 0 1+1j ... 0 0 0 0 0 0 0 -1-1j 0 0 0 -1-1j 0 0 0 1+1j 0 0 0 1+1j 0 0 0 1+1j 0 0 0 1+1j 0 0 zeros(1,5)]; S1 = sqrt(19/4)*(S1); % Long preamble S2 = [zeros(1,8),1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,... -1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,... 1,1,1,1,-1,-1,-1,1,0,0,0,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,... 1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,... -1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,zeros(1,7)]; S1_td=ifft(S1,128); S2_td=ifft(S2,128); %STEP3 Adding CP to the time domain preamble symbol 1 and symbol 2 CP= ceil(FFT_Num/4); S2_tdcp=[S2_td(end-CP+1:end) S2_td S2_td]; % concatenating multiple symbols to form 10 short preamble S1_tdcp = [S1_td S1_td S1_td(1:32)]; preamble = [S1_tdcp S2_tdcp]; %% ***Generate the pilot signal*** train_sym1= round(rand(1,(2*OFDM_per_Symbol))); train_sym2= round(rand(1,(2*OFDM_per_Symbol))); t= 2*(train_sym1.*2-1)+(train_sym2.*2-1); treal= t(1:2:2*OFDM_per_Symbol); timage= t(2:2:2*OFDM_per_Symbol); training_symbols1= treal+1i*timage; training_symbols2= training_symbols1.'; training_symbols=repmat(training_symbols2,1,Np); %kData = [-58:-54,-52:-26,-24:-12,-10:-2,2:10,12:24,26:52,54:58]; pilot = [1,29,43,62,76,104]; %start position of pilots/**shift border from -58 to 1 to start first pilot and so on ... because of positive vector in Matlab %pilot = [6,34,48,67,81,109]; %% ***P/S transform*** SymQAM1=reshape(SymQAM,Carrier_Num,OFDM_per_Symbol).'; %% ***Insert the pilot symbols*** signal=1:Carrier_Num+Np; signal(pilot)=[]; SymQAM2(:,pilot)=training_symbols; SymQAM2(:,signal)=SymQAM1; SymQAM3=SymQAM2.'; %% ***IFFT transform*** SymIFFT=ifft(SymQAM3,FFT_Num,1); %% ***GI Insertion*** SymTxtmp= zeros(FFT_Num+CP,OFDM_per_Symbol); SymTxtmp(1:CP,:)= SymIFFT(FFT_Num-CP+1:FFT_Num,:); SymTxtmp(CP+1:CP+FFT_Num,:)= SymIFFT; SymTx=reshape(SymTxtmp,1,(FFT_Num+CP)*OFDM_per_Symbol); %% *************** Transmitter ends ***************************** %% *************** Receiver starts ****************************** %% ***Packet detection*** SymRxdel=[zeros(1,CP) SymTx(1:length(SymTx)-CP)]; % Delayed y = xcorr(SymTx,SymRxdel); [m,n]=max(y); t_offset_Packet_detection = n-1; SymRx= y(t_offset_Packet_detection+1:end); %% ***GI Removal*** SymRxtmp= reshape(SymTx,FFT_Num+CP,OFDM_per_Symbol); SymRx= SymRxtmp(CP+1:CP+FFT_Num,:); SymRx=reshape(SymRx,1,128); %% ***Time offset estimation*** Toff=input('Enter time offset any numeric number(for example 100):'); SymRx2=[zeros(1,Toff),SymRx]; if length(SymRx2)>length(S1_tdcp) pad = length(SymRx2)-length(S1_tdcp); S1_tdcp = [S1_tdcp zeros(1,pad)]; elseif length(SymRx2)<length(S1_tdcp) pad = length(S1_tdcp)-length(SymRx2); SymRx2 = [SymRx2 zeros(1,pad)]; end out_len = length(SymRx2); out = zeros(1,out_len); tmp = S1_tdcp; for k = 1:out_len out(k) = SymRx2*tmp'; tmp = [0 tmp(1:end-1)]; end [m,n]=max(out); t_offset_Time_estimation = n-1; %% ***FFT transform*** SymRx=reshape(SymRx,FFT_Num,OFDM_per_Symbol); SymFFT=fft(SymRx,FFT_Num,1); SymFFT=SymFFT(1:Carrier_Num+Np,:); %% ***Channel Estimation*** % extract pilots from received signal SymFFT1=SymFFT.'; Rx_training_symbols= SymFFT1(:,pilot); Rx_training_symbols0= reshape(Rx_training_symbols,OFDM_per_Symbol*Np,1); % reshape original pilots training_symbols0= reshape(training_symbols,1,OFDM_per_Symbol*Np); training_symbols1= diag(training_symbols0); training_symbols2= inv(training_symbols1); Hls= (training_symbols2)*Rx_training_symbols0; Hls1= reshape(Hls,OFDM_per_Symbol,Np); HLs=[]; HLs2=[]; %%%%%%%% my problem with this section, I know for 4 pilot with this loop, with 3 repeat with 16 iteration make 48 data carrier for 802.11a/generates %%%%%%%% But with 6 pliots,doest not work this loops, because 6-1=5,and for iteration value is not integer: 108/5=21.5 for k=1:Np-1 HLs2=[]; for j=1:16 HLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(j-1)/LI+Hls1(:,k); HLs2=[HLs2,HLs1]; end HLs=[HLs,HLs2]; end HLs=[HLs,HLs2]; SymFFT1=SymFFT.'; SymFFT2=SymFFT1(:,signal); SymFFT3= SymFFT2./HLs; SymFFT=SymFFT3.'; %% ***Demodulate*** SymDeQAMtmp=reshape(SymFFT,1,OFDM_per_Symbol*Carrier_Num); m=real(SymDeQAMtmp); n=abs(real(SymDeQAMtmp)); p=imag(SymDeQAMtmp); q=abs(imag(SymDeQAMtmp)); s=2*(m==n)-1; t=2*(p==q)-1; SymDeQAMtmpshift=SymDeQAMtmp+((-2)*(s+1i*t)); bit0=imag(SymDeQAMtmp); bit1=imag(SymDeQAMtmpshift); bit2=real(SymDeQAMtmp); bit3=real(SymDeQAMtmpshift); SymDeQAMtmptmp=zeros(Bit_Num,OFDM_per_Symbol*Carrier_Num); SymDeQAMtmptmp(1,:)=bit0; SymDeQAMtmptmp(2,:)=bit1; SymDeQAMtmptmp(3,:)=bit2; SymDeQAMtmptmp(4,:)=bit3; for j=1:(Bit_Num*OFDM_per_Symbol*Carrier_Num) if SymDeQAMtmptmp(j)>0 SymDeQAMtmptmp(j)=0; else SymDeQAMtmptmp(j)=1; end end SymDeQAM=reshape(SymDeQAMtmptmp,1,Bit_Num*OFDM_per_Symbol*Carrier_Num);
+ Post New Thread
Please login