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

📄 ofdm1.m

📁 1、ofdm信道仿真 2、基于梳妆导频的OFDM信道估计
💻 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 + -