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

📄 set_ofdm_data_parm.m

📁 ofdm系统仿真
💻 M
字号:
%ofdm data symbol parameters
function [ofdm_data_parm_const, ofdm_data_parm_var] = set_ofdm_data_parm

    global sys_parm;
    global ofdm_data_parm_const;
    global ofdm_data_parm_var;
    
    %Initial ofdm_data_parm_const==========================================
    ofdm_data_parm_const = struct(...
        'UsedNumSubc', 56, ...
        'UsedSubcIdx', [1:28, 37:64], ...
        'NullNumSubc', 8, ...
        'NullSubcIdx', [29:36], ...
        'ShortTrainingSymbol', [0, 0,  1+j, 0, 0, 0, -1-j, 0, ...
                                0, 0,  1+j, 0, 0, 0, -1-j, 0, ...
                                0, 0, -1-j, 0, 0, 0,  1+j, 0, ...
                                0, 0, -1-j, 0, 0, 0,  1+j, 0, ...
                                0, 0, -1-j, 0, 0, 0, -1-j, 0, ...
                                0, 0, -1-j, 0, 0, 0,  1+j, 0, ...
                                0, 0,  1+j, 0, 0, 0,  1+j, 0], ...
        'LongTrainingSymbol', [ 1,  1, -1, -1,  1,  1, -1,  1, ...
                               -1,  1,  1,  1,  1,  1,  1, -1, ...
                               -1,  1,  1, -1,  1, -1,  1,  1, ...
                                1,  1,  1, -1, -1,  1,  1, -1, ...
                                1, -1,  1, -1, -1, -1, -1, -1, ...
                                1,  1, -1, -1,  1, -1,  1, -1, ...
                                1, -1, -1,  1,  1, -1, -1, -1], ...
        'CPLength', 16, ...
        'StartNoiseSamples', 500, ...
        'EndNoiseSamples', 500, ...
        'UsePilot', 1, ...
        'PilotSubcPatt', [1:9:28, 37:9:64; ...
                          1:9:28, 37:9:64; ...
                          %zeros(1, 8); ...
                          1:9:28, 37:9:64], ...
        'PilotSubcSymbol', [1, 1, -1, -1, 1, 1, -1, -1; ...
                            1, 1, -1, -1, 1, 1, -1, -1; ...
                            %zeros(1, 8); ...
                            1, 1, -1, -1, 1, 1, -1, -1], ...
        'PilotScramble', 0, ...
        'Modulation', 1, ...  % 0: BSK, 1: 4PSK, 2: 16QAM, 3: 64QAM
        'ModulationBits', [1, 2, 4, 6] ...
    );
    
    %Value validate==============================================================
    if ofdm_data_parm_const.UsedNumSubc + ofdm_data_parm_const.NullNumSubc ~= sys_parm.TotNumSubc
        fprintf('Error in sum of UsedNumSubc and NullNumSubc!');
        pause;
    elseif ofdm_data_parm_const.UsedNumSubc ~= length(ofdm_data_parm_const.UsedSubcIdx)
        fprintf('Error in UsedNumSubc!');
        pause;
    elseif ofdm_data_parm_const.NullNumSubc ~= length(ofdm_data_parm_const.NullSubcIdx)
        fprintf('Error in NullNumSubc!');
        pause;
    end
    
    if ~isempty(intersect(ofdm_data_parm_const.UsedSubcIdx, ofdm_data_parm_const.NullSubcIdx))
        fprintf('UsedSubIdx overlap with the NullSubcIdx!');
        pause;
    elseif union(ofdm_data_parm_const.UsedSubcIdx, ofdm_data_parm_const.NullSubcIdx) ~= [1:sys_parm.TotNumSubc]
        fprintf('UsedSubIdx combined with NullSubcIdx is not full!');
        pause;
    end
    
    if length(ofdm_data_parm_const.ShortTrainingSymbol) ~= ofdm_data_parm_const.UsedNumSubc
        fprintf('Err in ShortTrainingSymbol!');
        pause;        
    else
        %Normalize the amplitude of the short training symbol
        var = sum(abs(ofdm_data_parm_const.ShortTrainingSymbol).^2);
        ofdm_data_parm_const.ShortTrainingSymbol = sqrt(ofdm_data_parm_const.UsedNumSubc / var) * ofdm_data_parm_const.ShortTrainingSymbol;
    end
    
    if length(ofdm_data_parm_const.LongTrainingSymbol) ~= ofdm_data_parm_const.UsedNumSubc
        fprintf('Err in LongTrainingSymbol!');
        pause;        
    end    
    
    if ofdm_data_parm_const.UsePilot
        for n = 1:size(ofdm_data_parm_const.PilotSubcPatt, 1)
            if ~isempty(intersect(ofdm_data_parm_const.PilotSubcPatt(n, :), ofdm_data_parm_const.NullSubcIdx))
                fprintf('PilotSubcPatt overlap with NullSubcIdx!');
                pause;                  
            end
        end

        if size(ofdm_data_parm_const.PilotSubcPatt) ~= size(ofdm_data_parm_const.PilotSubcSymbol)
            fprintf('Err in PilotSubc pattern and symbol!');
            pause;  
        else
            %Calculate the ofdm symbol's pilot num in specific time
            PattNum = (ofdm_data_parm_const.PilotSubcPatt > 0);
            PattNum = sum(PattNum, 2);
            SymNum = (ofdm_data_parm_const.PilotSubcSymbol ~= 0);
            SymNum = sum(SymNum, 2);
            %Compare the pilot num in PilotSubcPatt and PilotSubcSymbol
            if PattNum ~= SymNum
                fprintf('Err in PilotSubc pattern and symbol!');
                pause; 
            else
                ofdm_data_parm_const.PilotScramble = PattNum;
            end
        end    
    end
    
    
    %Initial ofdm_data_parm_var==========================================
    ofdm_data_parm_var = struct(...
        'Index', 0, ...
        'HavePilot', 0, ...
        'NumPilotSubc', 0, ...
        'PilotSubcIdx', 0, ...
        'PilotSymbol', 0, ...
        'NumDataSubc', 0, ...
        'DataSubcIdx', 0, ...
        'TransmitPower', 0, ...
        'NumBits', 0 ...
    );    

    if ~ofdm_data_parm_const.UsePilot
        %Parameters of pilot
        ofdm_data_parm_var.HavePilot = 0;
        ofdm_data_parm_var.NumPilotSubc = 0;
        ofdm_data_parm_var.PilotSubcIdx = [];
        ofdm_data_parm_var.PilotSymbol = [];
        ofdm_data_parm_var.NumDataSubc = ofdm_data_parm_const.UsedNumSubc;
        ofdm_data_parm_var.DataSubcIdx = ofdm_data_parm_const.UsedSubcIdx;   
        %Transmit power
        ofdm_data_parm_var.TransmitPower = ones(1, ofdm_data_parm_var.NumDataSubc);
        %Calculate how much bits in each ofdm symbol
        mod_type = ofdm_data_parm_const.Modulation + 1;
        ofdm_data_parm_var.NumBits = ofdm_data_parm_const.ModulationBits(mod_type) * ofdm_data_parm_var.NumDataSubc;
    end
end

⌨️ 快捷键说明

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