%% OFDM仿真
clc;
clear;
close all;
%% begin
cp=5;
Nfft=64;%N fft个子载波
K=500;
N=Nfft*2;
m=1;
Np=20;
for SNR=0:15
err=0;err1=0;
for k=1:K
x=sign(2*rand(1,N)-1);%生成±1
xx=reshape(x,2,length(x)/2);
x1=(xx(1,:)+1i*xx(2,:))/sqrt(2);%QPSK调制
x2= sqrt(N/2)*ifft(x1);%Nfft个子载波
L=length(x2);
x3=[x2(L-cp+1:L) x2];%加循环前缀
h1=(randn(1,1)+1i*randn(1,1))/sqrt(2);
h2 = multipathRay( Np );
noise=1/(10^(SNR/10));
y=h1*x3+(randn(1,length(x3))+1i*randn(1,length(x3)))/sqrt(2)*sqrt(noise);%Ray信道
yy=filter(h2,1,x3)+(randn(1,length(x3))+1i*randn(1,length(x3)))/sqrt(2)*sqrt(noise);%Ray信道
% 接收机
y1=y(cp+1:cp+L);%去循环前缀
y2=fft(y1,L);%解调OFDM
y3=y2./fft(h1,L);%ZF解调
y4=(sign(real(y3))+1i*sign(imag(y3)))/sqrt(2);
err=err+length(find(y4-x1~=0));
yy1=yy(cp+1:cp+L);%去循环前缀
yy2=fft(yy1,L);%解调OFDM
yy3=yy2./fft(h2,L);%ZF解调
yy4=(sign(real(yy3))+1i*sign(imag(yy3)))/sqrt(2);
err1=err1+length(find(yy4-x1~=0));
end
ber(m)=(err)/(N/2*K);%求BER
ber1(m)=(err1)/(N/2*K);%求BER
m=m+1;
end
SNR=0:15;
figure;semilogy(SNR,ber,'b-^',SNR,ber1,'r-o');
legend('Rayleigh','task 1');
grid on;title('OFDM-ZF仿真');
xlabel('SNR(dB)');ylabel('BER');
%axis([0 15 10^-5 1]);
set(gca,'xtick',[0 2 4 6 8 10 12 14 15]);