length_frame=7168;
number_frame=560;
number_bits=7168*560;
pilot=3+3j;
[signal,bit]=constellation;
for snr=0:1:16
%-------------------------transmit section---------------------------------
for frame=1:number_frame
msg=randint(1,length_frame);
[qam_signal]=transmission(length_frame,signal,bit,snr,msg);%mapping every 4bits into complex nember
ofdm_frame=zeros(1,2048);%insert pilot
for i=0:255
ofdm_frame(i*8+1)=pilot;
ofdm_frame((8*i+2):8*(i+1))=qam_signal(1+7*i:7*(i+1));
end
transmit_signal=sqrt(2048)*ifft(ofdm_frame,2048); %ifft implementation
transmit_signal=[transmit_signal(1985:2048) transmit_signal];%length cp=64
%--------------------channel section------------------------------------------------------
%channel
sd=sqrt(1.25*10^(-0.1*snr));
%snr=10^(m/10); Eb=10;N0=Eb/snr;sigma=sqrt(N0);
delaymultipath = [0 2 9 14 26 42];
P=[-3.92,-4.82,-8.82,-11.92,-11.72,-27.82];
for i=1:6 %change db into amplitude
pn(i)= sqrt(10^(P(i)/10));
h_n(delaymultipath(i)+1)=pn(i);%put values on their corresponding positsion
end
for i=1:43 %normalization
h(i)=abs(h_n(i))^2;
end
h=sqrt(sum(h));
h_n=h_n/h;
noise=zeros(1,2154);%create noise
for i=1:2154
noise(i)=sd*randn(1)+j*sd*randn(1);
end
H_k=fft(h_n,2048); %fourier transform, prepare for zero forcing estimation
receive_signal=conv(h_n,transmit_signal);
receive_signal=receive_signal+noise;
%------------------receive section-----------------------------------------
receive_signal=receive_signal(65:end);%remove cp
receive_signal=receive_signal(1:2048);%remove the impact of convolution
re_signal=(1/sqrt(2048))*fft(receive_signal,2048);
%for i=1:2048
%D_k(i)=re_signal(i)/H_k(i);
%end
for i=0:255
y(i+1)=re_signal(8*i+1);%pilot estimation,extract pilot
end
%interpolation
x=1:8:2041;
xi=1:1:2041;
yi=interp1(x,y,xi);
yi(2042:2048)=yi(2041);
D_k=zeros(1,2048);
H_k=yi/pilot;
for i=1:2048
D_k(i)=re_signal(i)/H_k(i);%zero forcing
end
for i=0:255 %remmove pilot
D_k(8*i+1)=0;
end
z=find(D_k==0);
D_k(z)=[];
a=real(D_k);
b=imag(D_k);
axis([-5 5 -5 5]);
plot(a,b,'*');
title('16-QAM in awgn + multipath channel (pilot)')
demod=demodulation(length_frame,signal,bit,snr,D_k);%using demodulation sub function
[number_errors(frame),ratio]=biterr(demod,msg);%compare
end
sum_errors=sum(number_errors);
ber(snr+1)=sum_errors/number_bits;
fprintf('total number of errors=%d\n',sum_errors);
fprintf('ber=%12.8f\n',ber(snr+1));
end
x=0:16;
semilogy(x,ber);
grid;
- 1
- 2
前往页