main.m
上传用户:gzcxg999
上传日期:2021-07-15
资源大小:190k
文件大小:18k
源码类别:

matlab例程

开发平台:

CHM

  1. clear all;
  2. close all;
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. % OFDMA下行链路仿真程序框架
  5. % 变量命名原则:
  6. % 1) 开头大写,表示常量或可调全局变量,控制程序流程
  7. % 2) 小写加下划线,表示临时变量,传递数据
  8. % 变量使用原则:
  9. % 1) 不同用户的临时变量数据封装在cell结构体元素中,这是因为其数据长度可能不同
  10. % 2) 频域矩阵,不同列表示时间(OFDM符号),不同行表示子载波,矩阵第三维表示不同天线的数据
  11. % 3) 时域矩阵,不同列表示时间的样点, 如有不同行则表示时延(如时域信道响应矩阵), 第三维同样表示天线
  12. % 4) 部分常量或可调全局变量,用struct结构体归类
  13. % 函数命名和使用原则:
  14. % 1) 小写加下划线命名
  15. % 2) 部分函数可以根据输入变量个数实现函数功能重载
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  18. % 一. 初始化部分
  19. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  20. % 1.程序复杂度控制单元, 用结构体TurnOn, 和一些全局参数控制,
  21. % 目的是针对特定需求, 降低运行复杂度, 使之在学术科研中发挥较大作用
  22. % 打开相应模块功能---1,关闭相应模块功能---0
  23. % 如关闭信道估计和补偿模块, 使用理想信道估计
  24. ChannelEst = 1;
  25. TurnOn = struct('ChannelEst',ChannelEst);
  26. TurnOn.TimeDomainEq = 0;
  27. % 使用收发天线数进行控制, 开关多天线模块(包括空时编码和多天线信道).
  28. % 单天线多径信道,其功率时延谱, 多普勒频移等参数由结构体ch确定. 
  29. % 多天线多径信道,同一用户的不同收发天线假设功率时延谱相同, 
  30. % 发送天线数, 可选1,2和4. 发送天线为1则没有空时编码
  31. N_Tx_ant = 1;       
  32. % 接收天线数, 可选1,2和4. 
  33. N_Rx_ant = 1;
  34. % 如果关闭自适应调制模块,则无自适应调制,多用户使用固定子载波分配
  35. % 如果只需要一个用户, 把系统参数定义单元变量N_user设置为1即可
  36. TurnOn.AdptMod = 0;
  37. %  用户数目
  38. N_user = 1;                         
  39. % 如关闭包检测和帧定时同步模块, 定时位置准确
  40. TurnOn.Timing = 1;
  41. % 如关闭频率同步模块, 载波频率偏差为 0 Hz, 不使用频偏纠正算法
  42. TurnOn.FreqSyn = 1;
  43. % 导频相位跟踪, 样值同步和相位噪声模块的开关
  44. TurnOn.PhaseTrace = 0;
  45. %TurnOn.SamplingSyn  = 0;
  46. %TurnOn.PhaseNoise = 0;
  47. % 关闭信道编码模块,统计的BER,PER性能为无编码
  48. TurnOn.ChannelCoding = 0;
  49. % 建议: 不同重点的研究,使用不同的程序结构,关闭认为次要的模块.
  50. % 如要评估系统总的性能,则可以打开所有模块
  51. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  52. % 2 参数定义单元
  53. ParaDef = 0 ;           % 0---自定义参数
  54. % 1---使用本实验室设计的B3G下行链路系统参数
  55. % 2---使用802.11a系统参数
  56. if ParaDef == 1
  57.     set_B3G_para;          
  58. elseif  ParaDef == 2
  59.     set_11a_para;      
  60. elseif  ParaDef == 0   % 用户自定义
  61.     
  62.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  63.     % 2.1 OFDMA收发机系统参数定义单元
  64.     % 命名规律: N_xxx: xxx的数目,为非负整数
  65.     %           T_xxx: xxx的持续时间,为非负实数
  66.     %           Idx_xxx: xxx的编号,为整数向量
  67.     %           一些约定俗成的表示, 如fc载频, Bw信道带宽等
  68.     
  69.     % 1) 当TurnOn.AdptMod = 0 时表示所有子载波用调制方式:(不使用信道编码时)
  70.     % 1--BPSK调制, 2--QPSK调制,3--8PSK调制, 4--16QAM调制,6--64QAM调制
  71.     % 2) 当TurnOn.AdptMod = 1 时表示自适应调制,平均每个子载波上调制的比特数
  72.     % 此时最大只能设置为4, 否则调制器无法处理
  73.     Modulation = 2;       
  74.     
  75.     N_sym = 10;                              %  每帧中OFDM符号数,不包括两个前缀OFDM符号
  76.     N_frame = 10;                           %  仿真的帧个数
  77.     
  78.     % 仿真循环开始的Eb_No,定义为每比特的能量Eb
  79.     % 和噪声的单边功率谱密度No的比值, dB值
  80.     Eb_NoStart = 0;                                                          
  81.     Eb_NoInterval = 2;      % 仿真Eb/No的间隔值(dB)
  82.     Eb_NoEnd = 20;          % 仿真Eb/No的终止值(dB)                        
  83.     
  84.     
  85.     fc = 5e9;                               %  载波频率(Hz)
  86.     Bw = 20e6;                              %  基带系统带宽(Hz)
  87.     fs = 20e6;                              %  基带抽样频率
  88.     T_sample = 1/fs;                        %  基带时域样点间隔(s)
  89.     
  90.     N_subc = 1024;                          %  OFDM 子载波总数
  91.     Idx_used = [-400:-1 1:400];             %  使用的子载波编号
  92.     Idx_pilot = [-400:25:-25 25:25:400];    %  导频子载波编号
  93.     
  94.     %     N_subc = 512;                          %  OFDM 子载波总数
  95.     %     Idx_used = [-200:-1 1:200];             %  使用的子载波编号
  96.     %     Idx_pilot = [-200:25:-25 25:25:200];    %  导频子载波编号
  97.     
  98.     
  99.     % 802.11a的基本参数
  100.     %     N_subc = 64;                          %  OFDM 子载波总数
  101.     %     Idx_used = [-26:-1 1:26];             %  使用的子载波编号
  102.     %     Idx_pilot = [-21:14:-7 7:14:21];    %  导频子载波编号
  103.     
  104.     
  105.     N_used = length(Idx_used);              % 使用的子载波数
  106.     N_pilot = length(Idx_pilot);            % 导频的子载波数
  107.     N_data = N_used - N_pilot;              % 导频的子载波数
  108.     Idx_data = zeros(1,N_data);
  109.     N_tran_sym = 2;
  110.     % 得到数据子载波的编号
  111.     m = 1; n = 1;
  112.     for k  = 1:length(Idx_used)
  113.         if Idx_used(k) ~= Idx_pilot(m);
  114.             Idx_data(n) = Idx_used(k);
  115.             n = n + 1;
  116.         else
  117.             if m ~= N_pilot
  118.                 m = m + 1;
  119.             end
  120.         end
  121.     end
  122.     %  为编程使用方便,调整子载波编号为从1开始,到子载波总数
  123.     Idx_used = Idx_used + N_subc/2 +1;       
  124.     Idx_pilot = Idx_pilot + N_subc/2 +1;
  125.     Idx_data = Idx_data + N_subc/2 +1; 
  126.     % 导频位置值
  127.     PilotValue = ones(N_pilot,1);
  128.     % OFDM循环前缀占有效FFT时间的比例
  129.     PrefixRatio = 1/4;                
  130.     T_sym = T_sample*( (1 + PrefixRatio)*N_subc );
  131.     
  132.     Es = 1;                 % 在16QAM, 64QAM调制方式下,符号能量都被归一化 
  133.     Eb = Es/Modulation;     % 每比特能量
  134.     
  135.     % 假设每个用户的RS码参数相同,均为(204,188,8)                                   
  136.     UserRS_Coding = repmat([255,239,8]',1,N_user);                              
  137.     TraceBackLen = 3;       % 卷积码译码参数
  138.     % 假设每个用户的卷积码trellis 结构体相同
  139.     UserTrellis = repmat( poly2trellis(3,[6 7]),1,N_user );
  140.     N_ant_pair = N_Tx_ant * N_Rx_ant;   % 收发天线对的数目
  141.     
  142.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  143.     
  144.     % 2.2 信道参数定义单元, 每个用户移动台参数不同
  145.     for u = 1:N_user
  146.         % 车辆运动速度, 单位:km/hr , 对应多普勒频移!!
  147.         speed = 0;
  148.         ch{u} = struct('Speed', speed);
  149.         % 多普勒频移, 单位: Hz
  150.         ch{u}.fd = ch{u}.Speed *(1e3/3.6e3)*fc/3e8;  
  151.         % 假定用户的信道功率时延谱不同
  152.         % 每个用户信道每条径的功率
  153.         ch{u}.Power = 10.^([ 0 -6 -12 -18 -24 -30 ]'./10);
  154.         ch{u}.Power = ch{u}.Power/ sum(ch{u}.Power); % 功率归一化
  155.         % 每个用户每条径的时延:ns    
  156.         ch{u}.Delay = [ 0 1400 2800 4200 5600 7000 ]';      % 最大多径时延 7us 室外信道
  157.         %ch{u}.Delay = [ 0 1000 2000 3000 4000 5000 ]';     % 最大多径时延 5us 室外信道
  158.         %ch{u}.Delay = [ 0 100 200 300 400 500 ]';          % 最大多径时延 500ns 室内信道参数
  159.         
  160.         % 每个用户每条径对应的样点数
  161.         ch{u}.Delay_sample = round(ch{u}.Delay  * 1e-9 * fs);                 
  162.         ch{u}.N_path = size(ch{u}.Power,1);          % 径数 
  163.         % 每个用户,各条径对应的莱斯衰落K因子
  164.         % ch{u}.Ricean_K = zeros(N_path,1) ;         
  165.     end
  166.     
  167.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  168.     % 2.3 OFDMA收发机算法选择和参数定义单元
  169.     
  170.     % 1) 信道估计: 单天线信道估计方法
  171.     % 1 - 基本LS算法; 2 - LS的DFT改进算法; 3 - 加判决反馈的LS-DFT
  172.     % 4 - 基本MMSE算法; 5 - MMSE的DFT改进算法; 6 - 加判决反馈的MMSE-DFT
  173.     % 7 - 使用SVD分解算法,8 - Robust算法
  174.     CE_Method = 1 ;                      
  175.     
  176.     % 使用LS或MMSE的DFT改进算法时,所保留的子载波数                                    
  177.     CE_SubcRemain = max(ch{u}.Delay_sample);        % 最大多径时延对应的样点数                 
  178.     % 多天线信道估计方法
  179.     CE_Method2 = 1;
  180.     
  181.     % 2) 自适应调制: ,当TurnOn.AdptMod == 1时, 
  182.     % 1--自适应调制方法1, 给功率增加最小的子载波分配比特和功率, 子载波分配由AllocMethod确定
  183.     % 2--自适应调制方法2, 给误比特性能降低最小的子载波分配比特和增加功率, 子载波分配由AllocMethod确定
  184.     % 3--自适应调制方法3, 按照信道响应降序排列,子载波间争夺比特和功率, 子载波
  185.     % 分配由AllocMethod确定
  186.     % 当TurnOn.AdptMod == 0 时,此不起作用, 无自适应调制,使用固定子载波分配
  187.     AdptMethod = 1;
  188.     
  189.     % 子载波分配方法, 1--相邻分配, 2--交织分配, 3---跳频分配 ,4--自适应子载波分配
  190.     AllocMethod = 1;
  191.     
  192.     % 自适应调制算法中需要的目标误比特率
  193.     TargetBer = 1e-3;
  194.     
  195.     % 3) 空时编码: , 1--空时分组码, 2--空时格码
  196.     ST_Code = 1;   
  197.     
  198.     
  199.     % 4)定时同步:
  200.     PreNoiseLen = 500;      % 为定时算法加的前噪样点数
  201.     PostNoiseLen = 500;     % 后噪样点数
  202.     delta_fc = 10e3;         % 载波频偏 (Hz)
  203.     
  204.     % 帧(粗)定时
  205.     % 帧定时算法, 1--单窗口能量检测方法, 2--双窗口能量检测方法 , 3--延时相关方法帧定时
  206.     FrameTiming = 1;         
  207.     Window1 = 128;          % 帧定时算法的窗口宽度
  208.     Threshold1 = 0.4;       % 帧定时算法门限
  209.     Delay1 = 128;            % 帧定时延时相关算法的延时样点数
  210.     
  211.     % 载波频偏粗估计
  212.     WinStart = 128*4;
  213.     WinSize = 128;
  214.     Delay2 = 128*4;
  215.     
  216.     % 符号定时算法
  217.     Window2 = 256;         % 和已知序列求相关,序列的长度
  218.     TimingAhead = 0;        % 定时提前的样点数
  219.     
  220.     % 载波频偏粗估计
  221.     WinStart2 = 256; 
  222.     WinSize2 = 512;
  223.     Delay3 = 512;
  224.     
  225. end
  226. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  227. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  228. % 二. 仿真主体程序部分
  229. % Eb/No信噪比循环
  230. snr_idx = 1;
  231. for Eb_No_dB = Eb_NoStart:Eb_NoInterval:Eb_NoEnd  
  232.     Eb_No_dB
  233.     Eb_No = 10^(Eb_No_dB/10); 
  234.     var_noise = Eb/(2*Eb_No);       % 噪声样点的功率
  235.     %var_noise = 0.01;              % 测试
  236.     tic;                            % 计算时间开始
  237.     
  238.     % OFDM帧/数据包循环
  239.     for frame = 1:N_frame                       
  240.         
  241.         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  242.         % 1. 信道参数产生部分
  243.         % 产生不同用户(cell区分), 不同收发天线对(矩阵的第三维区分),不同OFDM符号
  244.         % 时间(矩阵列区分), 多径信道不同时延径(矩阵行区分)的时域信道响应
  245.         h_time = cell(1,N_user);
  246.         H_freq = cell(1,N_user);
  247.         
  248.         for u = 1:N_user
  249.             
  250.             % 得到时域信道的参数
  251.             h_time{u} = time_channel_para( ch{u}, N_Tx_ant, N_Rx_ant,N_sym, T_sym, fs, N_subc, ...
  252.                 PrefixRatio,N_frame,frame,N_tran_sym);
  253.             
  254.             % 由信道时域响应,得到信道的频域响应
  255.             H_freq{u} = to_freq_channel( h_time{u}, ch{u} ,N_subc ,N_sym, N_Tx_ant,...
  256.                 N_Rx_ant,N_tran_sym);
  257.             
  258.         end
  259.         
  260.         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  261.         % 2. 发射机部分
  262.         
  263.         % 多用户数据生成模块
  264.         [user_bit,user_bit_cnt]  = user_bit_gen( N_user, N_data ,N_sym , Modulation );
  265.         
  266.         % 信道编码模块, 包括RS编码, 卷积编码等
  267.         coded_user_bit = channel_coding( user_bit , UserRS_Coding , ...
  268.             UserTrellis,TraceBackLen, TurnOn.ChannelCoding );
  269.         
  270.         % 自适应调制和多用户复用模块
  271.         % 有自适应调制 , 使用固定或动态子载波分配
  272.         if TurnOn.AdptMod           
  273.             [user_subc_alloc , mod_subc ,pwr_subc, pad_bit_cnt] = adpt_mod_para... 
  274.                 ( coded_user_bit,N_sym,Idx_data,AllocMethod,AdptMethod ,...
  275.                 H_freq,var_noise,TargetBer );
  276.             
  277.             % 无自适应调制 , 使用固定子载波分配            
  278.         else                        
  279.             [user_subc_alloc , mod_subc ,pwr_subc, pad_bit_cnt]  = adpt_mod_para...
  280.                 ( coded_user_bit,N_sym,Idx_data ,AllocMethod ); 
  281.         end
  282.         
  283.         % 按照给定的每用户,每子载波的调制方式,进行自适应调制
  284.         mod_sym =  modulator(coded_user_bit,user_subc_alloc,mod_subc,...
  285.             pwr_subc, pad_bit_cnt ,N_subc, N_sym,TurnOn.AdptMod );
  286.         
  287.         % 发送分集, 使用空时编码
  288.         st_coded = st_coding( mod_sym,N_Tx_ant,ST_Code);
  289.         
  290.         % 加导频
  291.         pilot_added = pilot_insert(st_coded,Idx_pilot,PilotValue);
  292.         
  293.         % OFDM调制,加前导序列. 如果使用发送分集,则输出多条天线的信号
  294.         [transmit_signal known_training] = ofdm_mod(st_coded,PrefixRatio,N_subc,N_sym,N_used,...
  295.             Idx_used,N_Tx_ant,N_tran_sym);
  296.         
  297.         % 加发送机相位噪声, 下一步完成               
  298.         %       transmit_signal = phase_noise(transmit_signal,TurnOn.PhaseNoise);
  299.         
  300.         % clear mod_sym, coded_user_bit;
  301.         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  302.         % 3. 多天线多径信道部分
  303.         for u = 1:N_user        % 多个用户接收机的循环
  304.             
  305.             % 信道和接收机区分开不同用户的原因:
  306.             % 1) 每个用户(移动台)的信道功率时延谱和衰落系数是不同的, 需要区别
  307.             % 2) 自适应调制和子载波分配算法中, 需要知道每个用户的信道响应
  308.             
  309.             recv_signal = channel( transmit_signal,h_time{u}, ch{u}, N_Tx_ant, N_Rx_ant,...
  310.                 PreNoiseLen,PostNoiseLen , var_noise,N_subc,PrefixRatio,N_sym,...
  311.                 delta_fc,T_sample,N_tran_sym,TurnOn.FreqSyn );
  312.             
  313.             %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  314.             % 4. 接收机部分
  315.             
  316.             % 加接收机相位噪声, 下一步完成    
  317.             % recv_signal = phase_noise(recv_signal ,TurnOn.PhaseNoise);
  318.             
  319.             % 接收机帧定时(包检测,粗定时)
  320.             [recv_frame, err_frame_timing] = frame_timing( recv_signal ,Window1, Threshold1,...
  321.                 Delay1,PreNoiseLen, PostNoiseLen, N_subc, PrefixRatio, N_sym, FrameTiming, N_tran_sym, N_Rx_ant ,...
  322.                 TurnOn.Timing);
  323.             
  324.             % 粗频偏估计 (整数倍的频偏估计). 也可以在频域做,使用freq_syn_freqdomain模块
  325.             [coarse_freq_out, offset1] = freq_syn_timedomain( recv_frame, WinStart, WinSize, Delay2, T_sample,...
  326.                 N_Rx_ant,TurnOn.FreqSyn );
  327.             
  328.             % 符号定时(精定时)
  329.             [timed_sym , err_sym_timing] = sym_timing( coarse_freq_out ,N_subc, PrefixRatio, N_sym, N_tran_sym,...
  330.                 known_training,Window2,TimingAhead, N_Rx_ant, TurnOn.Timing);
  331.             
  332.             % 精频偏估计(分数倍的频偏估计),如果粗频偏估计已经满足估计器的MSE要求, 则可以不使用此模块
  333.             % 调用和粗频偏估计相同的函数,只是输入参数不同
  334.             [fine_freq_out,offset2] = freq_syn_timedomain( timed_sym,WinStart2, WinSize2, Delay3, T_sample,...
  335.                 N_Rx_ant,TurnOn.FreqSyn );
  336.             
  337.             % 可选的时域均衡器,下一步完成.如果使用了频域均衡, 则不需要
  338.             % equalized_sym = equalizer_timedomain(timed_sym ,TurnOn.TimeDomainEq);
  339.             
  340.             % OFDM解调,去前导序列
  341.             [training_sym ,data_sym] = ofdm_demod(fine_freq_out,PrefixRatio,N_subc,N_sym,N_tran_sym,N_Rx_ant);
  342.             
  343.             % 如果在时域不进行整数倍的频偏估计, 则在频域进行.下一步完成.
  344.             %             freq_offset_corrected = freq_syn_freqdomain( data_sym,TurnOn.FreqSyn );
  345.             
  346.             % 频域信道估计器, 如果使用了时域均衡, 则不使用此模块
  347.             % channel_est = zeros(N_subc,1);
  348.             % [channel_est(Idx_used,1) , mse_ce] = estimator( training_sym(Idx_used,1) , known_training(Idx_used,2) , ...
  349.             %              CE_Method , CE_SubcRemain , H_freq{u}(Idx_used,2));
  350.             
  351.             [channel_est , mse_ce] = channel_estimator( training_sym ,CE_Method,CE_Method2,...
  352.                 CE_SubcRemain,H_freq{u},known_training,N_Tx_ant,N_Rx_ant, N_subc,N_used,Idx_used,...
  353.                 Modulation,var_noise,TurnOn.ChannelEst );
  354.             
  355.             % 使用数据OFDM符号中的导频进行载波相位跟踪和补偿,下一步完成
  356.             % phase_err_corrected = phase_tracing( data_sym,freq_offset_corrected ,TurnOn.PhaseTrace );
  357.             
  358.             % 使用数据OFDM符号中的导频抽样频偏的估计和补偿, 下一步完成         
  359.             %             sampling_err_corrected = sampling_syn( data_sym,phase_err_corrected ,TurnOn.SamplingSyn );
  360.             
  361.             % 在频域加入理想信道响应,测试目的
  362.             %             rev = zeros(N_subc, N_sym  , N_Rx_ant );
  363.             %             for n_r = 1:N_Rx_ant
  364.             %                 for n_t = 1:N_Tx_ant
  365.             %                     rev(:,:,n_r) = rev(:,:,n_r) + data_sym(:,:,n_t).*...
  366.             %                                     repmat(H_freq{u}(:,1,(n_t-1)*N_Rx_ant + n_r), 1, N_sym );
  367.             %                 end
  368.             %             end
  369.             %              data_sym = rev;
  370.             
  371.             % 接收机分集处理和空时解码
  372.             
  373.             st_decoded = st_decoding( data_sym,channel_est,N_Tx_ant, N_Rx_ant ,ST_Code ,Idx_data);
  374.             
  375.             % 根据每用户,每子载波的调制方式,进行解调
  376.             demod_user_bit = demodulator( st_decoded, user_subc_alloc{u} ,mod_subc{u} ,...
  377.                 pad_bit_cnt(u),N_sym,TurnOn.AdptMod);            
  378.             
  379.             % 信道解码, 包括RS解码, 卷积码Viterbi编码等
  380.             decoded_user_bit{u} = channel_decoding ( demod_user_bit , UserRS_Coding(:,u) ,... 
  381.                 UserTrellis(u) ,TraceBackLen, user_bit_cnt(u) , TurnOn.ChannelCoding );
  382.             
  383.             % 本帧,本信噪比下,本用户的性能统计
  384.             bit_err = sum(abs(decoded_user_bit{u} - user_bit{u}));
  385.             
  386.             if TurnOn.FreqSyn 
  387.                 freq_err = delta_fc - (offset1 + offset2);
  388.             else
  389.                 freq_err = 0;
  390.             end   
  391.             
  392.             user_bit_err{u}(frame,snr_idx) = bit_err ;
  393.             mse_ce_acc{u}(frame,snr_idx) = mse_ce;
  394.             frame_timing_acc{u}(frame,snr_idx) = err_frame_timing ;
  395.             freq_syn_acc{u}(frame,snr_idx) = freq_err ;
  396.             
  397.             
  398.         end                  % 多个用户接收机的循环结束 
  399.         
  400.         % 实时显示仿真性能
  401.         fprintf('Eb/No:%d dBtFrame No.:%d  Err Bits:%dtCh.Est. MSE:%f  Timing Err(Sample):%dtFreq.Syn. Err(Hz):%dn',...
  402.             Eb_No_dB, frame, bit_err, mse_ce, err_frame_timing , freq_err);
  403.         
  404.     end                      % OFDM帧/数据包循环结束     
  405.     
  406.     timer(snr_idx) = toc     % 计算时间结束
  407.     snr_idx = snr_idx + 1;
  408.     
  409.     save saved_data.mat;     % 保存数据
  410.     
  411. end                      % Eb/No信噪比循环结束                     
  412. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  413. % 5. 性能评估部分,可以保存需要的数据,并对目标性能数据进行操作
  414. % 如画图, 比较,进一步计算得到结论等
  415. performance_eval;
  416. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  417. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  418. % 仿真程序结尾