⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm1.m

📁 梳妆导频的程序使用
💻 M
字号:
%清空工作区中的所有变量 
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)]; 
%各信噪比点的误包位置记录 
%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; 
	  		 
		%接口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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -