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

📄 adptive_bitpow_allocate_systems1.asv

📁 好东西
💻 ASV
字号:
%%%新方案,接收端先进行合并,将受到jamming影响的子载波去除

clear all
clc
format long
%本次仿真载频为2GHz,带宽1MHz,子载波数64个,cp为8
%子载波间隔为15.625kHz
%一个ofdm符号长度为64us,cp长度为8us
%系统调制级别定为QPSK
%最大doppler频率为50Hz,信道是慢变的
%多径信道为4径,功率延迟谱服从负指数分布~exp(-t/trms),trms=(1/5)*tmax=1.2us时长,各径延迟取为delay=[0 3e-6 6e-6]
t0=clock;
cp_length=16;%cp长度为16
N_carrier=64;%OFDM子载波个数
bandwidth=1000000;%系统带宽为1MHz
t_interval=(1/bandwidth)*N_carrier/(cp_length+N_carrier);%采样间隔64/72us,加上循环前缀后,采样率增加
delta_f=bandwidth/N_carrier;%Hz
% SNR_dB=[0 4 8 12 16 20 24 28 32 35];%Eb/N0
% SJR_dB=[-10 -5 -3 0 3 5 10 15 20 25];%符号信干比
%SNR_dB=[8 12 16 20 24 28 32 35];
SNR_dB=[15];
Pe=1e-3;
groupnumber1=[4 16 32];
ber_snr_persjr_ofdm=zeros(length(groupnumber1),length(SNR_dB)); 
ber_snr_reallocatpow=zeros(length(groupnumber1),length(SNR_dB)); 
lowzero_num=0;
for kk=1:length(groupnumber1)
    groupsize=N_carrier/groupnumber1(kk);
    groupnumber=groupnumber1(kk);
    for i=1:length(SNR_dB)%每个SNR点上仿真若干次
    snr=10^(SNR_dB(i)/10);
    error_bit_ofdm=0;
    total_bit_num=0;%发送总比特数统计
    error_bit_ofdm1=0;%for 二次功率分配
    total_bit_num1=0;%for 二次功率分配
    
    loop_num=5; %共仿真1000次

     for l=1:loop_num
    ofdm_symbol_num=12;%每次仿真产生10个ofdm符号,则每次仿真共有200×64个星座映射符号;QPSK调制下,1个星座映射符号包含2个bit
     map_flag=2;
    %%%%信道参数%%%%%%
%     num=6;
% 
%     delay=[0 1e-6 2e-6 3e-6 4e-6 6e-6];
%     trms=1.5e-6;
%     var_pow=10*log10(exp(-delay/trms));%各径功率衰减,以dB形式给出
%     fd=50;%最大doppler频率为50Hz
%     %t_interval=0.8889e-6;%采样间隔64/72us,加上循环前缀后,采样率增加
%     counter=10000;%200000000;%各径信道的采样点间隔,应该大于信道采样点数。由以上条件现在信道采样点数
%     count_begin=(l-1+100000000)*5*counter;%每次仿真信道采样的开始位置
%     %%%%%%以上为信道参数%%%%%%
%              %%%%以下过程为了得到准确的信道信息%%%%%%
            map_out1=rand(2*N_carrier,ofdm_symbol_num)>0.5;
            [mm,nn]=size(map_out1);
            total_bit_num=total_bit_num+mm*nn;
            map_out1=map_module(map_out1,2);
            
%             %%%以下程序为了得到信道频率响应HHk
%             ofdm_modulation_out1=sqrt(N_carrier)*ifft(map_out1,N_carrier);
%             ofdm_cp_out1=insert_cp(ofdm_modulation_out1,cp_length);
%             [passchan_ofdm_symbol1,Hk]=multipath_chann(ofdm_cp_out1,num,var_pow,delay,fd,t_interval,counter,count_begin,cp_length);
%             sig_temp=cut_cp(passchan_ofdm_symbol1,cp_length);
%             ofdm_demodulation_out1=fft(sig_temp,N_carrier)/sqrt(N_carrier);
%             HHk=ofdm_demodulation_out1./map_out1;
%             %%%以上程序为了得到信道频率响应HHk
%             [nn,mm]=size(ofdm_cp_out1);
%             spow2=0;
%             for k=1:nn
%                 for b=1:mm
%                     spow2=spow2+real(ofdm_cp_out1(k,b))^2+imag(ofdm_cp_out1(k,b))^2;
%                 end
%             end
%             %spow1=spow2/(nn*mm);%信号平均能量
%             spow1=1;
%             %%%%以上过程为了得到准确的信道信息%%%%%%
%             
%             
%             
%             
%     %%%%%%%%%以下为不做二次功率分配,原参考文献方法%%%%%%%%%%%%
%     [poweralloctpower,bitalloctvector,gama]=bitandpoweralloct2(N_carrier,groupnumber,HHk,snr,Pe,ofdm_symbol_num);%自适应分配比特和功率
%     [m,n]=size(poweralloctpower);
%     
%     for mm=1:m
%         for nn=1:n
%             if poweralloctpower(mm,nn)<0
%                 lowzero_num=lowzero_num+1;
%             end
%         end
%     end
%                 
%     bit_maxnum_ofdmsig=groupsize*max(sum(bitalloctvector));
%     bit_source=zeros(bit_maxnum_ofdmsig,ofdm_symbol_num);
%     bit_num_ofdmsig=zeros(1,ofdm_symbol_num);
%     map_out=zeros(N_carrier,ofdm_symbol_num);
%            
%             for nn=1:ofdm_symbol_num
%                 for v=1:1:groupnumber
%                     map_flag=bitalloctvector(v,nn);
%                     sourcebit=zeros(1,bitalloctvector(v,nn)*groupsize);
%                     for w=1:1:groupsize
%                         if bitalloctvector(v,nn)>6
%                             input=zeros(1,bitalloctvector(v,nn));
%                         elseif bitalloctvector(v,nn)<1
%                             input=[];
%                         else
%                             input=(rand(1,bitalloctvector(v,nn)))>0.5;
%                         end
%                         sourcebit(1,1+(w-1)*bitalloctvector(v,nn):(w-1)*bitalloctvector(v,nn)+bitalloctvector(v,nn))=input;
%                         %按照map_flag指示完成各种星座映射,input为输入比特块
%                     end
%                     
%                     bit_source((v-1)*groupsize*map_flag+1:(v-1)*groupsize*map_flag+groupsize*map_flag,nn)=sourcebit';
%                     bit_num_ofdmsig(nn)=bit_num_ofdmsig(nn)+bitalloctvector(v,nn)*groupsize;
%                     if length(sourcebit)==0
%                         map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=zeros(groupsize,1);
%                     else
%                     %map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=sqrt(poweralloctpower(v,nn))*map_module(sourcebit',bitalloctvector(v,nn));
%                     map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=map_module_adp(sourcebit',bitalloctvector(v,nn));
%                     end
%                 end
%             end
%             map_out1=zeros(size(map_out));
%             %%%%%%%%以下根据功率分配值做分配功率%%%%%%%%%%
%             for nn=1:ofdm_symbol_num
%                 for v=1:groupnumber
%                     if poweralloctpower(v,nn)~=0
%                        for w=1:groupsize
%                          map_out1((v-1)*groupsize+w,nn)=sqrt(poweralloctpower(v,nn))*map_out((v-1)*groupsize+w,nn);    
%                        end
%                     end
%                 end
%             end
    


   ofdm_modulation_out=sqrt(N_carrier)*ifft(map_out1,N_carrier);%作64点逆FFT运算,完成ofdm调制,前面乘系数sqtr(64)是为了保持ifft前后的符号能量不变
   
      ofdm_cp_out=insert_cp(ofdm_modulation_out,cp_length);%插入循环前缀 
      %%%%%%%%以下计算噪声方差%%%%%%%%%%
            [nn,mm]=size(ofdm_cp_out);
            spow2=0;
            for k=1:nn
                for b=1:mm
                    spow2=spow2+real(ofdm_cp_out1(k,b))^2+imag(ofdm_cp_out1(k,b))^2;
                end
            end
            spow1=spow2/(nn*mm);%信号平均能量
           
% %            % sgma=sqrt(spow1/(2*snr)/map_flag);
%             if map_flag==0
%                 sgma=sqrt(spow1/(2*snr));
%             else
%             %sgma=sqrt(spow1/(2*snr)/map_flag);%sgma如何计算,与当前SNR和信号平均能量有关系
%             sgma=sqrt(spow1/(2*snr));
%             end
           sgma=sqrt(spow1/(2*snr)/map_flag);%计算高斯白噪声方差


   % [passchan_ofdm_symbol,Hk]=multipath_chann(ofdm_cp_out,num,var_pow,delay,fd,t_interval,counter,count_begin,cp_length);
    
    passnoise_ofdm_symbol=add_noise(sgma,passchan_ofdm_symbol);%加入随机高斯白噪声,receive_ofdm_symbol为最终接收机收到的ofdm符号块
  
     
    cutcp_ofdm_symbol=cut_cp(passnoise_ofdm_symbol,cp_length);%去除循环前缀
    
    ofdm_demodulation_out=fft(cutcp_ofdm_symbol,N_carrier)/sqrt(N_carrier);%作128点FFT运算,完成ofdm解调
    %receive_ofdm_symbol=ofdm_demodulation_out;
%     receive_ofdm_symbol=ofdm_demodulation_out./HHk;
%     receive_ofdm_symbol1=zeros(size(receive_ofdm_symbol));
%         for nn=1:ofdm_symbol_num
%             for v=1:groupnumber
%                 if poweralloctpower(v,nn)~=0
%                     for w=1:groupsize
%                         receive_ofdm_symbol1((v-1)*groupsize+w,nn)=receive_ofdm_symbol((v-1)*groupsize+w,nn)/sqrt(poweralloctpower(v,nn));    
%                     end
%                 end
%             end
%         end
  receive_bit_sig=de_map_module(receive_ofdm_symbol,map_flag);
 
    
    %以下过程统计接收信号中的错误比特数
           [mn,nn]=size(bit_source);
           err_num=sum(sum(rem(bit_source+receive_bit_sig,2)));
           error_bit_ofdm=error_bit_ofdm+err_num;
 %%%%%%%%%以上为不做二次功率分配,原参考文献方法%%%%%%%%%%%%         
           
           
           
           
           
           
% %%%%%%%%%%%以下为做功率二次分配的方法%%%%%%%%%%%%%%%%
%     [poweralloctpower,bitalloctvector,gama]=bitandpoweralloct2(N_carrier,groupnumber,HHk,snr,Pe,ofdm_symbol_num);%自适应分配比特和功率
%     %[poweralloctpower,bitalloctvector,gama]=reallocat_power(N_carrier,groupnumber,HHk,snr,Pe,ofdm_symbol_num);%做功率二次分配
%     bit_maxnum_ofdmsig=groupsize*max(sum(bitalloctvector));
%     bit_source=zeros(bit_maxnum_ofdmsig,ofdm_symbol_num);
%     bit_num_ofdmsig=zeros(1,ofdm_symbol_num);
%     map_out=zeros(N_carrier,ofdm_symbol_num);
%            
%             for nn=1:ofdm_symbol_num
%                 for v=1:1:groupnumber
%                     map_flag=bitalloctvector(v,nn);
%                     sourcebit=zeros(1,bitalloctvector(v,nn)*groupsize);
%                     for w=1:1:groupsize
%                         if bitalloctvector(v,nn)>6
%                             input=zeros(1,bitalloctvector(v,nn));
%                         elseif bitalloctvector(v,nn)<1
%                             input=[];
%                         else
%                             input=(rand(1,bitalloctvector(v,nn)))>0.5;
%                         end
%                         sourcebit(1,1+(w-1)*bitalloctvector(v,nn):(w-1)*bitalloctvector(v,nn)+bitalloctvector(v,nn))=input;
%                         %按照map_flag指示完成各种星座映射,input为输入比特块
%                     end
%                     
%                     bit_source((v-1)*groupsize*map_flag+1:(v-1)*groupsize*map_flag+groupsize*map_flag,nn)=sourcebit';
%                     bit_num_ofdmsig(nn)=bit_num_ofdmsig(nn)+bitalloctvector(v,nn)*groupsize;
%                     if length(sourcebit)==0
%                         map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=zeros(groupsize,1);
%                     else
%                     %map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=sqrt(poweralloctpower(v,nn))*map_module(sourcebit',bitalloctvector(v,nn));
%                     map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=map_module_adp(sourcebit',bitalloctvector(v,nn));
%                     end
%                 end
%             end
%             map_out1=zeros(size(map_out));
%             %%%%%%%%以下根据功率分配值做分配功率%%%%%%%%%%
%             for nn=1:ofdm_symbol_num
%                 for v=1:groupnumber
%                     if poweralloctpower(v,nn)~=0
%                        for w=1:groupsize
%                          map_out1((v-1)*groupsize+w,nn)=sqrt(poweralloctpower(v,nn))*map_out((v-1)*groupsize+w,nn);    
%                        end
%                     end
%                 end
%             end
%     total_bit_num1=total_bit_num1+sum(bit_num_ofdmsig);
% 
% 
%    ofdm_modulation_out=sqrt(N_carrier)*ifft(map_out1,N_carrier);%作64点逆FFT运算,完成ofdm调制,前面乘系数sqtr(64)是为了保持ifft前后的符号能量不变
%    ofdm_cp_out=insert_cp(ofdm_modulation_out,cp_length);%插入循环前缀 
%       %%%%%%%%以下计算噪声方差%%%%%%%%%%
%             
%             map_flag=sum(bit_num_ofdmsig)/(N_carrier*ofdm_symbol_num);
%            % sgma=sqrt(spow1/(2*snr)/map_flag);
%             if map_flag==0
%                 sgma=sqrt(spow1/(2*snr));
%             else
%             %sgma=sqrt(spow1/(2*snr)/map_flag);%sgma如何计算,与当前SNR和信号平均能量有关系
%             sgma=sqrt(spow1/(2*snr));
%             end
%          
% 
% 
%     [passchan_ofdm_symbol,Hk]=multipath_chann(ofdm_cp_out,num,var_pow,delay,fd,t_interval,counter,count_begin,cp_length);
%     
%     passnoise_ofdm_symbol=add_noise(sgma,passchan_ofdm_symbol);%加入随机高斯白噪声,receive_ofdm_symbol为最终接收机收到的ofdm符号块
%   
%      
%     cutcp_ofdm_symbol=cut_cp(passnoise_ofdm_symbol,cp_length);%去除循环前缀
%     
%     ofdm_demodulation_out=fft(cutcp_ofdm_symbol,N_carrier)/sqrt(N_carrier);%作128点FFT运算,完成ofdm解调
%     %receive_ofdm_symbol=ofdm_demodulation_out;
%     receive_ofdm_symbol=ofdm_demodulation_out./HHk;
%     receive_ofdm_symbol1=zeros(size(receive_ofdm_symbol));
%         for nn=1:ofdm_symbol_num
%             for v=1:groupnumber
%                 if poweralloctpower(v,nn)~=0
%                     for w=1:groupsize
%                         receive_ofdm_symbol1((v-1)*groupsize+w,nn)=receive_ofdm_symbol((v-1)*groupsize+w,nn)/sqrt(poweralloctpower(v,nn));    
%                     end
%                 end
%             end
%         end
%   receive_bit_sig=de_map_module_adp(receive_ofdm_symbol1,bitalloctvector,groupsize,groupnumber,bit_num_ofdmsig);
% 
%     
%     %以下过程统计接收信号中的错误比特数
%            [mn,nn]=size(bit_source);
%            err_num=sum(sum(rem(bit_source+receive_bit_sig,2)));
%            error_bit_ofdm1=error_bit_ofdm1+err_num;
% %%%%%%%%%%%以上为做功率二次分配的方法%%%%%%%%%%%%%%%%                                  
end%for l=1:loop_num

ber_snr_persjr_ofdm(kk,i)=error_bit_ofdm/total_bit_num;
ber_snr_reallocatpow(kk,i)=error_bit_ofdm1/total_bit_num1;
fre_eff_persnr(kk,i)=total_bit_num/(loop_num*ofdm_symbol_num*(1/bandwidth)*N_carrier)/bandwidth;
fre_eff_persnr_reallocatpow(kk,i)=total_bit_num1/(loop_num*ofdm_symbol_num*(1/bandwidth)*N_carrier)/bandwidth;

save bitalloc_data ber_snr_persjr_ofdm ber_snr_reallocatpow fre_eff_persnr fre_eff_persnr_reallocatpow
end%for i=1:length(SNR_dB)

end %for kk
elapse_time=etime(clock,t0);
ber_snr_persjr_ofdm
% figure(1)
% % semilogy(SNR_dB_theo,ber_theo(1,:),'b')
% % hold on
% semilogy(SNR_dB,ber_snr_persjr_ofdm(1,:),'r-*'),hold on
% semilogy(SNR_dB,ber_snr_persjr_ofdm(2,:)/2,'g-o')
% semilogy(SNR_dB,ber_snr_persjr_ofdm(3,:)/6,'m-+')
% hold off
% xlabel('SNR(dB)');
% ylabel('仿真结果,实际Pe=1e-3');
% 
% figure(2)
% plot(SNR_dB,fre_eff_persnr(1,:),'r-*'),hold on
% % plot(SNR_dB,fre_eff_persnr(1,:),'r-*',SNR_dB,fre_eff_persnr(2,:),'g-o',SNR_dB,fre_eff_persnr(3,:),'m-+')
% plot(SNR_dB,fre_eff_persnr(2,:),'g-o')
% plot(SNR_dB,fre_eff_persnr(3,:),'m-')
% xlabel('SNR(dB)');
% ylabel('Spectral Efficiency(bps/Hz)');
% hold off

⌨️ 快捷键说明

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