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

📄 dab1.asv

📁 一个在matlab环境下的DAB仿真程序源码。内含ofdm收发
💻 ASV
字号:
% a=0;
% for i=1:2047
%     a(i+1)=mod(13*a(i)+511,2048);
% end;
% % b=[1:1535];
% for k=256:1792;
% for j=1:2047;
%     if k==a(j);
%         m(k-255)=j;
%     end;
% end;
% end;

clear all;
close all;
tic;
global N 
N=256;
global L 
L=63;
 
global Zeronum
Zeronum=32; %insert zero
num=192; % information number
 
%------------------------------------------ phase reference channel--------------------------------------------------------------%
% n=[1 2 0 1 3 2 2 3 2 1 2 3 1 2 3 3 2 2 2 1 1 3 1 2 3 1 1 1 2 2 1 0 2 2 3 3 0 2 1 3 3 3 3 0 3 0 1 1];
n=[2 3 0 2 2 2];
% h=[0 2 0 0 0 0 1 1 2 0 0 0 2 2 1 1 0 2 0 0 0 0 1 1 2 0 0 0 2 2 1 1 
%   ;0 3 2 3 0 1 3 0 2 1 2 3 2 3 3 0 0 3 2 3 0 1 3 0 2 1 2 3 2 3 3 0 
%   ;0 0 0 2 0 2 1 3 2 2 0 2 2 0 1 3 0 0 0 2 0 2 1 3 2 2 0 2 2 0 1 3
%   ;0 1 2 1 0 3 3 2 2 3 2 1 2 1 3 2 0 1 2 1 0 3 3 2 2 3 2 1 2 1 3 2];
h=[0 2 0 0 0 0 1 1 2 0 0 0 2 2 1 1 0 2 0 0 0 0 1 1 2 0 0 0 2 2 1 1 
  ;0 3 2 3 0 1 3 0 2 1 2 3 2 3 3 0 0 3 2 3 0 1 3 0 2 1 2 3 2 3 3 0 
  ;0 0 0 2 0 2 1 3 2 2 0 2 2 0 1 3 0 0 0 2 0 2 1 3 2 2 0 2 2 0 1 3];
fai_reg=[];
fai=[];

% for k=1:12;
for k=1:2
% for i=1:4;
for i=1:3
% fai_reg(i,:)=(pi/2)*(h(i,:)+n(i+(k-1)*4));
fai_reg(i,:)=(pi/2)*(h(i,:)+n(i+(k-1)*3));
end;
fai=[fai; fai_reg];
end;
fai_s=[];
for i=1:6;
 fai_s=[fai_s fai(i,:)];       %phase
end;
z0=exp(j*fai_s);             %1536 symbol for phase reference 

reference_phase_temp=[zeros(1,Zeronum) z0 zeros(1,Zeronum)];         
  

reference_phase=sqrt(N)*ifft(reference_phase_temp);
 

   
% coarse_freq=[];
% fin_freq=[];
% ml_coarse_freq_var=[];
% ml_freq_var=[];
% freq_offset=[];
% ml_time_offset=[];
% ml_freq_offset=[];
% freq_offset_mean_1=[];
% freq_offset_mean_2=[];
% freq_offset_mean_3=[];
% temp=[];
% sum_temp=[];
% offset=[];
signal_power_temp=[];
signal_power=[];
% bit_erro_ratio=[];
bit_erro_ratio1=[];
% timing_offset=[];
Zk_frame=[];
abrupt_cmp_data=[];
abrupt_fft_data=[];
abrupt_correct_fft_data=[];



 


%--------------------------------------------------TRANSMIT SYMBOL(source)----------------------------------------------------------------%    

       ofdm_frame=[];
          transmit_signal=[];
          transmit_signal_frame=[];
          frame_num=5;          %共200桢
          symnum=9;                   %每桢的符号数
          len=num*symnum*2;
          
          frame_length=(N+L)*(symnum+1);
          tracking_num=1;
          slid_freq_num=2000;
          
          
          for k=1:frame_num;         %产生数据源
%               input=randint(1,1024);
%               pn_add_data=pn_add(input);
%               punc_code_temp=conv_en_FIC_III(pn_add_data);
%               punc_code=[punc_code punc_code_temp];
      
         
%           for frame_no=1:frame_num;
         
            [ofdm_frame]=transmit( N,L,len,num,symnum,Zeronum,z0);                   %产生OFDM一帧的数据 一个OFDM帧有symnum个OFDM符号,第一个符号为相位参考
            
            %m=(symnum+1)*(frame_no-1);
           % Zk_frame=[Zk_frame;Zk([2:symnum+1],:)];                                                       %每帧只取后面的数据,没有相位参考符号 
      
            transmit_signal=[transmit_signal,ofdm_frame];                                            %产生frame_num帧  总数据源
          end;
          
          
          
          
        transmit_signal_power=sum(abs(transmit_signal).^2)/length(transmit_signal);       %统计OFDM发射信号的平均功率
        
                                
    
        
 %------------------------------------------------------------------------------------------------------------------------------------
 
           coarse_fft_data_temp=[];
           fin_fft_data_temp=[];
  

        SNR=25;

%         cnt=zeros(1,SNR) ;
%      
%         cntf0=zeros(1,SNR) ;
%         cntf1=zeros(1,SNR) ;
%         cntf2=zeros(1,SNR) ;
%         cntf3=zeros(1,SNR) ;
%         Pef0=zeros(1,SNR);
%         Pef1=zeros(1,SNR);
%         Pef2=zeros(1,SNR);
%         Pef3=zeros(1,SNR);
        
        
        
        %for snr=1:SNR;
snr=10
      
       %-----------------------------------------------初使化--------------------------------------%
                ml_freq_vco(snr,1)=0;  coarse_ml_freq_vco(snr,:)=zeros(1,frame_num);  fin_freq_correct=0;
            
                phase_vco(snr,:)=zeros(1,frame_num);   a1(snr,:)=zeros(1,frame_num);   
                
                a2(snr,:)=zeros(1,frame_num);  b1(snr,:)=zeros(1,frame_num);  
                
                b2(snr,:)=zeros(1,frame_num);     fin_freq(snr,:)=zeros(1,frame_num);freq_correct(snr,:)=zeros(1,frame_num);
                
                coarse_ml_freq_vco_correct(snr)=0;    fft_data1_temp=[];
                ml_time_trace=[];
                
             

                
                
      %--------------------------------------------------------------------------------------------%
 
                freq_offset=4.2;%0.1*snr;
           [transmit_signal_freq]=channel(frame_num,symnum,N,L,transmit_signal,freq_offset);   %帧信号加频偏和不加频偏
            
            power=sum(abs(transmit_signal_freq).^2)/length(transmit_signal_freq);
        
            n=7;        %循环前缀产生的功率损失和过采样的损失
            
            [noise_p(snr),w_1]=awgn_noise(n,1,transmit_signal_power,transmit_signal_freq) ;                 %产生高斯噪声
      
            
            
            transmit_signal_freq_w=transmit_signal_freq+w_1;                                    %加性高斯噪声
            
      
            
      
            for k=1:frame_num;
            
            transmit_signal_frame(k,:) =transmit_signal_freq_w((k-1)*frame_length+1:k*frame_length); %接收端分割为帧信号
      
          
        end;

%--------------------------------------------------------------------------------------------------------------------------------------------            
          

       
 
     
                
%-------------------------------------------仅有粗偏估计-----------------------------------------------------------------%
    
%------------------------------------------------------------------捕获-------------------------------------------------------------------------------%  
       
                
         [coarse_ml_time_offset(snr,:),coarse_ml_freq_offset_1(snr,:)]=ML(transmit_signal_frame(1,:),snr+3+n,L,N);   %对第一帧进行ML估计
            
         coarse_ml_freq_vco(snr,1)=(round(mean(coarse_ml_freq_offset_1(snr,:))*10^2))*10^(-2);
      
             
            [coarse_timing_fft_data_cmp1,coarse_timing_phase_fft_data_cmp1,coarse_timing_phase_correct_cmp1,coarse_timing_frame_correct_L_cmp1, coarse_ml_time_correct_cmp1(snr,:)]=...
            coarse_freq_offset_compensate(frame_num,symnum+1,N,L,0,coarse_ml_time_offset(snr,:), coarse_ml_freq_vco(snr,1),transmit_signal_frame(1,:)); %对第一帧进行补偿
        
            
           
            
            [Td(snr,1),coarse_integer_freq_offset(snr,1)]=integer_freq_offset_fin_timing_estimate(N,L,coarse_timing_phase_fft_data_cmp1,reference_phase_temp);    %由该帧的相位参考符号估计出来的精符号定时和整数倍频偏
            
%             if Td(snr,s) ==0
%                   SymbolTrace_temp(snr,:)=64*ones(1,symnum+1);
% 
%             else
             SymbolTrace_temp(1,:) =coarse_ml_time_offset(snr,:)-mod( 256, Td(snr,1))*ones(1,symnum+1);%+fix(SymFinTiming(snr,s+1))*ones(1,symnum+1);
%             end;
            coarse_ml_freq_vco(snr,1)=coarse_integer_freq_offset(snr,1)+coarse_ml_freq_vco(snr,1); % 粗小数倍频偏和整数倍频偏实现的频偏的捕获
            
%             if coarse_timing_offset_temp(snr,k)== coarse_ml_time_offset(snr,1);
%                 cnt(1,snr)=cnt(1,snr)+1;
%              
%             else
%                 cnt(1,snr)=cnt(1,snr);
%             end;
%             
%            
%             
%             if abs(abs(coarse_integer_freq_offset(snr,k)) -4)==0;
%                 cntf0(1,snr)=cntf0(1,snr)+1;
%                 cntf3(1,snr)=cntf3(1,snr);
%                 cntf1(1,snr)=cntf1(1,snr);
%             
%             elseif abs(abs(coarse_integer_freq_offset(snr,k)) -4)==1
%                  
%                  cntf1(1,snr)=cntf1(1,snr)+1;
%                  cntf3(1,snr)=cntf3(1,snr);
%                  cntf0(1,snr)=cntf0(1,snr);
%                
%              
%             else
%                 cntf0(1,snr)=cntf0(1,snr);
%                 cntf1(1,snr)=cntf1(1,snr);
%               
%                 cntf3(1,snr)=cntf3(1,snr)+1;
%             end;
        
%                 if freq_offset>=0.5
%                     if coarse_integer_freq_offset(snr,k)==0
%                         cnt(1,snr)=cnt(1,snr)+1;
%                     else
%                         cnt(1,snr)=cnt(1,snr);
%                     end;
%                 elseif freq_offset<0.5
%                         if coarse_integer_freq_offset(snr,k)==0
%                         cnt(1,snr)=cnt(1,snr)+1;
%                         else
%                         cnt(1,snr)=cnt(1,snr);
%                         end;
%                 end;
     

            
        
%           Pe(1,snr) =cnt(1,snr)/frame_num;
%           Pef0(1,snr)= cntf0(1,snr)/frame_num;
%           Pef1(1,snr)= cntf1(1,snr)/frame_num;
%         
%           Pef3(1,snr)= cntf3(1,snr)/frame_num;
          %   end; %snr
        
%         plot([0.1:0.1:1],Pe);
%         toc;
%         a=Pe;
       
     
     
            
           %-------------------------------------------------------跟踪---------------------------------------------
            
             for k=0:frame_num-2;
                 
      
               
            [ml_coarse_fft_data,ml_phase_fft_data,ml_coarse_path_correct,coarse_path_correct_L,coarse_ml_time_3]=...
            coarse_freq_offset_compensate(frame_num,symnum+1,N,L,k+1,SymbolTrace_temp(k+1,:),coarse_ml_freq_vco(snr,k+1),transmit_signal_frame(k+2,:));
            
            coarse_ML_frame(k+2,:)=coarse_path_correct_L;                         %第三帧经过补偿的数据
            
            [coarse_ml_time_offset(snr,:),coarse_ml_freq_offset(snr,:)]=ML(coarse_ML_frame(k+2,:),snr+3+n,L,N);   %对第三帧进行ML估计
            
           [Td(snr,k+2),integer_freq_offset_trace(snr)]=integer_freq_offset_fin_timing_estimate(N,L,ml_phase_fft_data,reference_phase_temp);    %由第二帧的相位参考符号估计出来的精符号定时和整数倍频偏
           
            SymbolTrace_temp(k+2,:) =coarse_ml_time_offset(snr,:)-mod( 256, Td(snr,k+2))*ones(1,symnum+1);%+fix(SymFinTiming(snr,s+1))*ones(1,symnum+1);
           
           [fin_freq(snr,k+1),fin_phase_ACC(snr,k+2)]=fin_freq_offset_estimate(symnum+1,N,L,k+1,ml_coarse_path_correct,reference_phase);     %由第三帧估计出的细小偏    
            
            coarse_ml_freq_vco_correct(snr)=(round(mean(coarse_ml_freq_offset(snr,:))*10^2))*10^(-2);
            coarse_ml_freq_vco(snr,k+2)= coarse_ml_freq_vco(snr,1)+coarse_ml_freq_vco_correct(snr)+fin_freq(snr,k+1);
            

            

       end;

    ml_time_trace=[];
      %end;

          

        
     
                
            
            




⌨️ 快捷键说明

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