% OFDM LSE Channel Estimation
%
% --------------------------------------------------------------------------------
%
% Author: Hamid Ramezani
% Summary: the performance of LSE channel estimation will be evaluated based on bit error rate in received data
% MATLAB Release: R14
%
% Description: the comb pilot aided channel estimation in ofdm modulation is considered. the power of pilot subchannels is under the control.
% The data experience frequency selective channel then the AWGN noise is added to make the situation worse. The bit error rate is ploted versus SNR.
%
% --m file
% in this Mfile, I want to investigate the performance of LSE algorithm in
% OFDM channel estimation
%
% for further information see the
% [Xiaodong Cai and Georgios B. Giannakis,
% error Probability Minimizing Pilots for
% OFDM with M-PSK Modulation over Rayliegh-Fading
% Channels,?IEEE Transactions on Vehicular
% technology, vol. 53, No. 1, pp 146-155, Jan. 2004.]
% initialize
clear
clc
% parameter definition
N=256; % total number of subchannels
P=256/8; % total number of Pilots
S=N-P; % totla number of data subchannels
GI=N/4; % guard interval length
M=2; % modulation
PilotInterval=8; % pilot position interval
L=16; % channel length
nIteration=500; % number of iteration in each evaluation
SNR_V=[0:3:27]; % signal to noise ratio vector in dB
ber=zeros(1,length(SNR_V)); % initializing bit error rate
% Pilot Location and strength
Ip=[1:PilotInterval:N]; % location of pilots
Is=setxor(1:N,Ip); % location of data
Ep=2; % energy in pilot symbols in comparison
% to energy in data symbols
% fft matrix
F=exp(2*pi*sqrt(-1)/N .* meshgrid([0:N-1],[0:N-1]).* repmat([0:N-1]',[1,N]));
for( i=1 : length(SNR_V))
SNR=SNR_V(i)
for(k=1 : nIteration)
% generating random channel coefficients
h(1:L,1)=random('Normal',0,1,L,1) + ...%产生多径信道
j * random('Normal',0,1,L,1);
h=h./sum(abs(h)); % normalization
% Tr Data
TrDataBit=randint(N,1,M);%产生均匀分布0~M-1的整数
TrDataMod=qammod(TrDataBit,M);
TrDataMod(Ip)=Ep * TrDataMod(Ip);
TrDataIfft=ifft(TrDataMod,N);
TrDataIfftGi=[TrDataIfft(N- GI + 1 : N);TrDataIfft];%加循环前缀
% tx Data
TxDataIfftGi=filter(h,1,TrDataIfftGi); % channel effect
% adding awgn noise
TxDataIfftGiNoise=awgn(TxDataIfftGi, SNR - db(std(TxDataIfftGi))); % normalization to signal power db函数带有平方
TxDataIfft=TxDataIfftGiNoise(GI+1:N+GI);%去循环前缀
TxDataMod=fft(TxDataIfft,N);
% Channel estimation
Spilot=TrDataMod(Ip); % trnasmitted pilots
Ypilot=TxDataMod(Ip); % received pilots
G=(Ep * length(Ip))^-1* ctranspose(sqrt(Ep)*diag(Spilot)*ctranspose(F(1:L, Ip)));%ctranspose(F(1:L, Ip))=(F(1:L, Ip))'
hHat=G*Ypilot; % estimated channel coefficient in time domain
TxDataBit=qamdemod(TxDataMod./(fft(hHat,N)),M);
% bit error rate computation
[nErr bErr(i,k)]=symerr(TxDataBit(Is),TrDataBit(Is));
end
end
f1=figure(1);
set(f1,'color',[1 1 1]);
semilogy(SNR_V,mean(bErr'),'b->')
xlabel('SNR in dB');
ylabel('Bit Error Rate')