clc;
clear;
close all;
warning off;
addpath 'func\'
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Radius = 100;
Nh = 20;
Nv = 20;
%天线间距
Scale1 = round(100*(rand(Nh,1)/2+0.5))/100;
Scale2 = round(100*(rand(Nv,1)/2+0.5))/100;
%是否加入多径,多径信道H1
%速度
v = 200;
%载波频率
fc = 83.5e6;
%光速
c = 3e8;
fd = v*fc/c;
%采样间隔为1us
timeval = 1e-5;
%多径时延
delay_multi = [0,1,3,6]*timeval;
%多径增益
Pow_avg = [0,-20,-40,-60];
%多径个数
Nmultipath = length(Pow_avg);
%多径平均延迟
delay_avg = 100e-6;
%多普勒频偏
Fre_offset = 0.0001;
%发送功率
sendpower = 800;%mW
%传输距离m
d_ = 10;
%穿过的墙壁损耗列向量db
w_ = [0] ;
%穿过的地板损耗列向量db
f_ = [0] ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Nc = 8;
Sub = Nc;
Len = 1024;
%信号带宽
BW = 83.5e3;
T = 1/BW;
TG = T/4;
%间隔
BWs = 3.75e3;
%信号采样率
Fd = 8;
SNR_dB = [0:8];
%仿真指标保持变量
Err_Rate = zeros(1,length(SNR_dB));
%PILOT设置
pilot_type = 1;
%仿真循环次数,循环次数越大,仿真效果越好
nloop = [40,40,40,40,40,60,60,100,100];
%turbo编码参数
N = 512;
M = 167;
%FFT
fftlen = 512;
%每个SNR点上仿真若干次
for i=1:length(SNR_dB)
i
Error = 0;
err_all = 0;
for iii=1:nloop(i)
iii
rng(iii);
%%
%以单天线方式产生测试信号
msg = rand(Len*Nc/4,1)>=0.5;
%turbo编码
seridata1 = func_turbo_code(msg,N,M);
seridata = [seridata1,zeros(1,Len*Nc-length(seridata1))]';
%QPSK映射
[Qpsk0,Dqpsk_pilot,symbol_bit] = func_piQPSK_mod(seridata);
%变换为矩阵
Qpsk_matrix = reshape(Qpsk0,fftlen,Nc);
[Pilot_in,pilot_num,Pilot_seq,pilot_space] = func_insert_pilot(Dqpsk_pilot,Qpsk_matrix,pilot_type,T,TG);
Pilot_in = fft(Pilot_in);
%sub carrier mapping
Pilot_in = func_subcarrierMap(Pilot_in);
%IFFT transform,产生OFDM信号
ifft_out = ifft(Pilot_in);
%插入包含间隔
Guard_int = ceil(BWs/fftlen);
Guard_int_ofdm = func_guard_interval_insert(ifft_out,fftlen,Guard_int);
%将矩阵数据转换为串行进行输出
Guard_int_ofdm_out = reshape(Guard_int_ofdm,1,(fftlen+Guard_int)*(Nc+pilot_num));
%%
[Hm,Hmmatrix] = func_mychannels(Radius,Scale1,Scale2,Nh,Nv);
%Step2:多径参数
[passchan_ofdm_symbol] = func_conv_channels(Hmmatrix,Guard_int_ofdm_out,Nmultipath,Pow_avg,delay_multi,Fre_offset,timeval,iii);
%Step3:噪声信道
%大尺度衰落
receivepower = func_largefade(sendpower,d_,w_,f_);
snr = 10^(SNR_dB(i)/10);
sgma = sqrt(receivepower*timeval/(2*snr)/2);
Rec_ofdm_symbol = awgn(passchan_ofdm_symbol,SNR_dB(i),'measured');
Rec_ofdm_symbol = Rec_ofdm_symbol + normrnd(0,sgma,size(Rec_ofdm_symbol));
%%
%开始接收
Guard_int_remove = func_guard_interval_remove(Rec_ofdm_symbol,(fftlen+Guard_int),Guard_int,(Nc+pilot_num));
%FFT
fft_out = fft(Guard_int_remove);
%sub carrier demapping
fft_out = func_desubcarrierMap(fft_out);
fft_out = ifft(fft_out);
%信道估计
%ls
[Sig_Lrmmse,Hs] = func_ls_estimation(fft_out,pilot_space,Pilot_seq,pilot_num);
%解调
Dqpsk = func_pideMapping(Sig_Lrmmse,fftlen*Nc);
%turbo解码
Dqpsk_decode = [func_turbo_decode(2*Dqpsk(1:end-(Len*Nc-length(seridata1)))-1,N,M)]';
%计算误码率
err_num = Len*Nc/4-length(find(msg==Dqpsk_decode(1:Len*Nc/4)));
Error = Error + err_num;
end
%计算误码率
err_all = err_all+Len*Nc/4;
Err_Rate(i) = Error/err_all/nloop(i);
end
%误码率
figure
semilogy(SNR_dB,Err_Rate,'b-o');
grid on
xlabel('SNR');
ylabel('BER');
axis([-0.0001,8,1e-5,1]);
save R802_11b.mat SNR_dB Err_Rate