%清空工作区中的所有变量
clear;
%参数设定:
%仿真运行的信噪比点数
M=5;
%各点的信噪比
SNs=[2,4,6,8,10];%(dB)
%链路级数据包的大小
Lp=4984;%(bits)
%仿真运行的结束条件:
%各点运行的最大总数据包数量
Ps=[5000,5000,5000,5000,5000]/1000;
%各点运行的误数据包范围
Pes=50*[100,100,100,100,100]/1000;
%比特速率
Tb=22.5*10^(-6)*3/4984;%(s)
%采样间隔
Ts=20*10^(-6)/2048;%(S)
%符号时间
T_symbo=22.5*10^(-6);
%%%%%%%%%%%%%%%设置结果存储参数:
%各信噪比点的总数据包数目
Ps_run_s=zeros(1,M);
%各信噪比点的总比特数
Bits_run_s=zeros(1,M);
%各信噪比点的总错误数据包数目
Ps_err_s=zeros(1,M);
%各信噪比点的总错误比特数
Bits_err_s=zeros(1,M);
%各信噪比点的误包率
P_err_rate_s=zeros(1,M);
%各信噪比点的误码率
Bit_err_rate_s=zeros(1,M);
%训练序列
train_seq=[ones(1,Lp+8)];
%产生交织码表
interleave_table = interleav_matrix(ones(1,2*(Lp+8)));
%各信噪比点的误包位置记录
%P_err_position_1/2/3/.../M
%各信噪比点的误码位置记录
%Bit_err_position_1/2/3/...M
%设置产生随机数的种子
rand('state',sum(100*clock));
randn('state',sum(7*clock));
%使用循环,以运行M个信噪比点
for I=1:M
%初始化:
%发送的数据包数量
Ps_Tx=0;
%错误的数据包数量
Ps_Rx_err=0;
%发送的总比特数
Bits_Tx=0;
%错误的比特数目
Bits_Rx_err=0;
%该仿真点的信噪比
SN=SNs(I);
%该仿真点最多运行的数据包数目
P_max=Ps(I);
%该仿真点最多运行的错误数据包数目
Pe_max=Pes(I);
%错误数据包的位置
eval(['P_err_position_' num2str(I) '=[];']);
%错误比特的位置
eval(['Bit_err_position_' num2str(I) '=[];']);
%使用循环,以运行最多P_max个数据包
for II=1:P_max
%产生1个长为Lp的数据包:
P_Tx=(rand(1,Lp)>0.5);
block_index=II;
%接口1(卷积编码):
conv_out=convolutional_en(P_Tx);
%接口1.1(交织器):
interleav_out = interleaving(conv_out ,interleave_table);
%接口2(4QAM 调制):
Qam_out=qpsk(interleav_out);
%接口2.1(OFDM模块):
signal=ofdm(Qam_out);%信号进行ofdm调制
%得到要对信道进行抽样的冲激序列,在每个符号的中间位置抽样
train_ofdm_out=[zeros(1,256),zeros(1,1024),1,zeros(1,1023),zeros(1,256),zeros(1,1024),1,zeros(1,1023),zeros(1,256),zeros(1,1024),1,zeros(1,1023)];%ofdm(train_seq);%训练序列进行IFFT变换
%判断当前数据包是否是第一个数据包
if II==1
previous_block=zeros(1,length(signal));
previous_train=zeros(1,length(train_ofdm_out));
end
%基带频谱测试仪
%bspectrum(Ofdm_out,Ts);
%接口3(信道模块):
%信号通过多经瑞利信道
mul_railay_out_signal=mul_ralay_channel(previous_block,signal,Ts,block_index);%
%训练序列过多经瑞利信道
mul_railay_out_train=mul_ralay_channel(previous_train,train_ofdm_out,Ts,block_index);
%为得到准确的信道冲激响应函数而对信道函数进行重新排序
temp1=mul_railay_out_train(1:2304);%第一个符号对应的信道估计序列
temp2=mul_railay_out_train(2305:4608);%第二个符号对应的信道估计序列
temp3=mul_railay_out_train(4609:6912);%第三个符号对应的信道估计序列
mul_railay_out_train=[temp1(1:256),temp1(1281:2304),temp1(257:1280),temp2(1:256),temp2(1281:2304),temp2(257:1280),temp3(1:256),temp3(1281:2304),temp3(257:1280)];
%信号经过AWGN信道
channel_out=myawgn(mul_railay_out_signal,SN);
%接口4(IOFDM模块):
deofdm_out=deofdm(channel_out);
h=deofdm(mul_railay_out_train);
%接口4.1(均衡模块):
%equal_out=equal(deofdm_out,h);
%接口4.2(解调模块):
deqam_out=deqpsk(deofdm_out,h,SN);
%接口5(解交织模块):
deinter_out= de_interleaving( deqam_out ,interleave_table);
%接口5.1(viterbi译码模块):
P_Rx= soft_viterbi(deinter_out);
%接口6(虚拟仪表):
% sigcon(P_Rx);
%置当前包为前一个数据包
previous_block=signal;
previous_train=train_ofdm_out;
%统计错误的比特数、错误比特位置、数据包数、错误包位置
Bit_compare_temp=(P_Rx~=P_Tx);
%误比特
Bits_Rx_err=Bits_Rx_err+sum(Bit_compare_temp)
eval(['Bit_err_position_' num2str(I) '=[Bit_err_position_' num2str(I) ','...
'Bits_Tx+find(Bit_compare_temp==1)];']);
%误包
if (sum(Bit_compare_temp))~=0
Ps_Rx_err=Ps_Rx_err+1;
eval(['P_err_position_' num2str(I) '=[P_err_position_' num2str(I) ','...
'1+Ps_Tx];']);
end
%更新已运行的数据包数目和比特数目
I
Ps_Tx=Ps_Tx+1
Bits_Tx=Bits_Tx+Lp;
%检查误包率是否达到结束条件
if Ps_Rx_err>=Pe_max
break;
end
end
%记录该信噪比点的仿真结果
%总数据包数目
Ps_run_s(I)=Ps_Tx;
%总比特数
Bits_run_s(I)=Bits_Tx;
%错误数据包数目
Ps_err_s(I)=Ps_Rx_err;
%错误比特数目
Bits_err_s(I)=Bits_Rx_err;
%误包率
P_err_rate_s(I)=Ps_Rx_err/Ps_Tx;
%误码率
Bit_err_rate_s(I)=Bits_Rx_err/Bits_Tx
p=polyfit(SNs,Bit_err_rate_s,4);
xi=0:0.1:10;
f=polyval(p,xi);
plot(xi,f);
xlabel('SNR');
ylabel('BER');
title('4QAM性能');
eval(['save(''err_p_position_' num2str(I) '.mat'',''P_err_position_' num2str(I) '''' ')']);
eval(['save(''err_b_position_' num2str(I) '.mat'',''Bit_err_position_' num2str(I) '''' ')']);
save('data.mat','Ps_run_s','Bits_run_s','Ps_err_s','Bits_err_s','P_err_rate_s','Bit_err_rate_s');
end
- 1
- 2
前往页