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

📄 main.m

📁 OFDM的详细仿真代码
💻 M
📖 第 1 页 / 共 2 页
字号:
clear all;
close all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OFDMA下行链路仿真程序框架

% 变量命名原则:
% 1) 开头大写,表示常量或可调全局变量,控制程序流程
% 2) 小写加下划线,表示临时变量,传递数据

% 变量使用原则:
% 1) 不同用户的临时变量数据封装在cell结构体元素中,这是因为其数据长度可能不同
% 2) 频域矩阵,不同列表示时间(OFDM符号),不同行表示子载波,矩阵第三维表示不同天线的数据
% 3) 时域矩阵,不同列表示时间的样点, 如有不同行则表示时延(如时域信道响应矩阵), 第三维同样表示天线
% 4) 部分常量或可调全局变量,用struct结构体归类

% 函数命名和使用原则:
% 1) 小写加下划线命名
% 2) 部分函数可以根据输入变量个数实现函数功能重载

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 一. 初始化部分

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 1.程序复杂度控制单元, 用结构体TurnOn, 和一些全局参数控制,
% 目的是针对特定需求, 降低运行复杂度, 使之在学术科研中发挥较大作用

% 打开相应模块功能---1,关闭相应模块功能---0


% 如关闭信道估计和补偿模块, 使用理想信道估计
ChannelEst = 1;
TurnOn = struct('ChannelEst',ChannelEst);
TurnOn.TimeDomainEq = 0;

% 使用收发天线数进行控制, 开关多天线模块(包括空时编码和多天线信道).
% 单天线多径信道,其功率时延谱, 多普勒频移等参数由结构体ch确定. 
% 多天线多径信道,同一用户的不同收发天线假设功率时延谱相同, 
% 发送天线数, 可选1,2和4. 发送天线为1则没有空时编码
N_Tx_ant = 1;       
% 接收天线数, 可选1,2和4. 
N_Rx_ant = 1;


% 如果关闭自适应调制模块,则无自适应调制,多用户使用固定子载波分配
% 如果只需要一个用户, 把系统参数定义单元变量N_user设置为1即可
TurnOn.AdptMod = 0;
%  用户数目
N_user = 1;                         


% 如关闭包检测和帧定时同步模块, 定时位置准确
TurnOn.Timing = 1;

% 如关闭频率同步模块, 载波频率偏差为 0 Hz, 不使用频偏纠正算法
TurnOn.FreqSyn = 1;

% 导频相位跟踪, 样值同步和相位噪声模块的开关
TurnOn.PhaseTrace = 0;
%TurnOn.SamplingSyn  = 0;
%TurnOn.PhaseNoise = 0;

% 关闭信道编码模块,统计的BER,PER性能为无编码
TurnOn.ChannelCoding = 0;


% 建议: 不同重点的研究,使用不同的程序结构,关闭认为次要的模块.
% 如要评估系统总的性能,则可以打开所有模块

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 2 参数定义单元
ParaDef = 0 ;           % 0---自定义参数
% 1---使用本实验室设计的B3G下行链路系统参数
% 2---使用802.11a系统参数

if ParaDef == 1
    set_B3G_para;          
elseif  ParaDef == 2
    set_11a_para;      
elseif  ParaDef == 0   % 用户自定义
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 2.1 OFDMA收发机系统参数定义单元
    % 命名规律: N_xxx: xxx的数目,为非负整数
    %           T_xxx: xxx的持续时间,为非负实数
    %           Idx_xxx: xxx的编号,为整数向量
    %           一些约定俗成的表示, 如fc载频, Bw信道带宽等
    
    % 1) 当TurnOn.AdptMod = 0 时表示所有子载波用调制方式:(不使用信道编码时)
    % 1--BPSK调制, 2--QPSK调制,3--8PSK调制, 4--16QAM调制,6--64QAM调制
    % 2) 当TurnOn.AdptMod = 1 时表示自适应调制,平均每个子载波上调制的比特数
    % 此时最大只能设置为4, 否则调制器无法处理
    Modulation = 2;       
    
    N_sym = 10;                              %  每帧中OFDM符号数,不包括两个前缀OFDM符号
    N_frame = 10;                           %  仿真的帧个数
    
    % 仿真循环开始的Eb_No,定义为每比特的能量Eb
    % 和噪声的单边功率谱密度No的比值, dB值
    Eb_NoStart = 0;                                                          
    Eb_NoInterval = 2;      % 仿真Eb/No的间隔值(dB)
    Eb_NoEnd = 20;          % 仿真Eb/No的终止值(dB)                        
    
    
    fc = 5e9;                               %  载波频率(Hz)
    Bw = 20e6;                              %  基带系统带宽(Hz)
    fs = 20e6;                              %  基带抽样频率
    T_sample = 1/fs;                        %  基带时域样点间隔(s)
    
    N_subc = 1024;                          %  OFDM 子载波总数
    Idx_used = [-400:-1 1:400];             %  使用的子载波编号
    Idx_pilot = [-400:25:-25 25:25:400];    %  导频子载波编号
    
    %     N_subc = 512;                          %  OFDM 子载波总数
    %     Idx_used = [-200:-1 1:200];             %  使用的子载波编号
    %     Idx_pilot = [-200:25:-25 25:25:200];    %  导频子载波编号
    
    
    % 802.11a的基本参数
    %     N_subc = 64;                          %  OFDM 子载波总数
    %     Idx_used = [-26:-1 1:26];             %  使用的子载波编号
    %     Idx_pilot = [-21:14:-7 7:14:21];    %  导频子载波编号
    
    
    N_used = length(Idx_used);              % 使用的子载波数
    N_pilot = length(Idx_pilot);            % 导频的子载波数
    N_data = N_used - N_pilot;              % 导频的子载波数
    Idx_data = zeros(1,N_data);
    N_tran_sym = 2;
    % 得到数据子载波的编号
    m = 1; n = 1;
    for k  = 1:length(Idx_used)
        if Idx_used(k) ~= Idx_pilot(m);
            Idx_data(n) = Idx_used(k);
            n = n + 1;
        else
            if m ~= N_pilot
                m = m + 1;
            end
        end
    end
    %  为编程使用方便,调整子载波编号为从1开始,到子载波总数
    Idx_used = Idx_used + N_subc/2 +1;       
    Idx_pilot = Idx_pilot + N_subc/2 +1;
    Idx_data = Idx_data + N_subc/2 +1; 
    % 导频位置值
    PilotValue = ones(N_pilot,1);
    % OFDM循环前缀占有效FFT时间的比例
    PrefixRatio = 1/4;                
    T_sym = T_sample*( (1 + PrefixRatio)*N_subc );
    
    Es = 1;                 % 在16QAM, 64QAM调制方式下,符号能量都被归一化 
    Eb = Es/Modulation;     % 每比特能量
    
    % 假设每个用户的RS码参数相同,均为(204,188,8)                                   
    UserRS_Coding = repmat([255,239,8]',1,N_user);                              
    TraceBackLen = 3;       % 卷积码译码参数
    % 假设每个用户的卷积码trellis 结构体相同
    UserTrellis = repmat( poly2trellis(3,[6 7]),1,N_user );
    N_ant_pair = N_Tx_ant * N_Rx_ant;   % 收发天线对的数目
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    % 2.2 信道参数定义单元, 每个用户移动台参数不同
    for u = 1:N_user
        % 车辆运动速度, 单位:km/hr , 对应多普勒频移!!
        speed = 0;
        ch{u} = struct('Speed', speed);
        % 多普勒频移, 单位: Hz
        ch{u}.fd = ch{u}.Speed *(1e3/3.6e3)*fc/3e8;  
        % 假定用户的信道功率时延谱不同
        % 每个用户信道每条径的功率
        ch{u}.Power = 10.^([ 0 -6 -12 -18 -24 -30 ]'./10);
        ch{u}.Power = ch{u}.Power/ sum(ch{u}.Power); % 功率归一化
        % 每个用户每条径的时延:ns    
        ch{u}.Delay = [ 0 1400 2800 4200 5600 7000 ]';      % 最大多径时延 7us 室外信道
        %ch{u}.Delay = [ 0 1000 2000 3000 4000 5000 ]';     % 最大多径时延 5us 室外信道
        %ch{u}.Delay = [ 0 100 200 300 400 500 ]';          % 最大多径时延 500ns 室内信道参数
        
        % 每个用户每条径对应的样点数
        ch{u}.Delay_sample = round(ch{u}.Delay  * 1e-9 * fs);                 
        ch{u}.N_path = size(ch{u}.Power,1);          % 径数 
        % 每个用户,各条径对应的莱斯衰落K因子
        % ch{u}.Ricean_K = zeros(N_path,1) ;         
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 2.3 OFDMA收发机算法选择和参数定义单元
    
    % 1) 信道估计: 单天线信道估计方法
    % 1 - 基本LS算法; 2 - LS的DFT改进算法; 3 - 加判决反馈的LS-DFT
    % 4 - 基本MMSE算法; 5 - MMSE的DFT改进算法; 6 - 加判决反馈的MMSE-DFT
    % 7 - 使用SVD分解算法,8 - Robust算法
    CE_Method = 1 ;                      
    
    % 使用LS或MMSE的DFT改进算法时,所保留的子载波数                                    
    CE_SubcRemain = max(ch{u}.Delay_sample);        % 最大多径时延对应的样点数                 
    % 多天线信道估计方法
    CE_Method2 = 1;
    
    % 2) 自适应调制: ,当TurnOn.AdptMod == 1时, 
    % 1--自适应调制方法1, 给功率增加最小的子载波分配比特和功率, 子载波分配由AllocMethod确定
    % 2--自适应调制方法2, 给误比特性能降低最小的子载波分配比特和增加功率, 子载波分配由AllocMethod确定
    % 3--自适应调制方法3, 按照信道响应降序排列,子载波间争夺比特和功率, 子载波
    % 分配由AllocMethod确定
    % 当TurnOn.AdptMod == 0 时,此不起作用, 无自适应调制,使用固定子载波分配
    AdptMethod = 1;
    
    % 子载波分配方法, 1--相邻分配, 2--交织分配, 3---跳频分配 ,4--自适应子载波分配
    AllocMethod = 1;
    
    % 自适应调制算法中需要的目标误比特率
    TargetBer = 1e-3;
    
    % 3) 空时编码: , 1--空时分组码, 2--空时格码
    ST_Code = 1;   
    
    
    % 4)定时同步:
    PreNoiseLen = 500;      % 为定时算法加的前噪样点数
    PostNoiseLen = 500;     % 后噪样点数
    delta_fc = 10e3;         % 载波频偏 (Hz)
    
    % 帧(粗)定时
    % 帧定时算法, 1--单窗口能量检测方法, 2--双窗口能量检测方法 , 3--延时相关方法帧定时

⌨️ 快捷键说明

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