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

📄 transmitter.m

📁 ofdm系统仿真
💻 M
字号:
%OFDM transmitter
function [tx_signal, inf_bits, tx_bits] = transmitter(sys_parm)

    global ofdm_data_parm_const;
    global ofdm_data_parm_var;
    
    %Initinal
    tx_signal = [];
    PackLenth = 0;
    bit_index = 0;
    ofdm_data_parm_var.Index = 0;
    
    for n = 1 : sys_parm.NumOFDMSymbols
        %Update the ofdm_data_parm_var   
        update_ofdm_data_parm_var;
        
        PackLenth = PackLenth + ofdm_data_parm_var.NumBits;
    end
    
    %General the information bits
    inf_bits = randint(1, PackLenth / 2);
    %Define trellis.
    trellis = poly2trellis(7, [155 171]); 
    %Encode a string of ones.
    tx_bits = convenc(inf_bits, trellis); 
    
    ofdm_data_parm_var.Index = 0;    
    
    %For loop
    for n = 1 : sys_parm.NumOFDMSymbols
        %Update the ofdm_data_parm_var
        update_ofdm_data_parm_var;
        
        raw_bits = tx_bits(bit_index + 1 : bit_index + ofdm_data_parm_var.NumBits);
        bit_index = bit_index + ofdm_data_parm_var.NumBits;
        
        %Modulation
        switch ofdm_data_parm_const.Modulation
            case 0 %BSK
                mod_in = bi2de(reshape(raw_bits, 1, ofdm_data_parm_var.NumDataSubc)', 'left-msb')';
                mod_out = pskmod(mod_in, 2);
            case 1 %4PSK
                mod_in = bi2de(reshape(raw_bits, 2, ofdm_data_parm_var.NumDataSubc)', 'left-msb')';
                mod_out = pskmod(mod_in, 4);                    
            case 2 %16QAM
                mod_in = bi2de(reshape(raw_bits, 4, ofdm_data_parm_var.NumDataSubc)', 'left-msb')';
                mod_out = qammod(mod_in, 16) / sqrt(10);           
            case 3 %64QAM
                mod_in = bi2de(reshape(raw_bits, 6, ofdm_data_parm_var.NumDataSubc)', 'left-msb')';
                mod_out = qammod(mod_in, 64) / sqrt(42);             
        end
        
        %Add pilot and modify the transmit power
        ifft_in = zeros(1, sys_parm.TotNumSubc);
        mod_out = mod_out .* ofdm_data_parm_var.TransmitPower;
        ifft_in(ofdm_data_parm_var.DataSubcIdx) = mod_out;
        if ofdm_data_parm_var.HavePilot
            ifft_in(ofdm_data_parm_var.PilotSubcIdx) = ofdm_data_parm_var.PilotSymbol;
        end
        
        %OverSamp
        if sys_parm.OverSamp > 1
            insert_zeros = zeros(1, (sys_parm.OverSamp - 1) * sys_parm.TotNumSubc);
            ifft_in_up = ifft_in(1: sys_parm.TotNumSubc / 2);
            ifft_in_down = ifft_in(sys_parm.TotNumSubc / 2 + 1: sys_parm.TotNumSubc);
            ifft_in = [ifft_in_up, insert_zeros, ifft_in_down];
        end
        
        %IFFT operation and add cp
        ifft_out = ifft(ifft_in);
        ifft_out = [ifft_out(sys_parm.OverSamp * sys_parm.TotNumSubc - ofdm_data_parm_const.CPLength + 1: sys_parm.OverSamp * sys_parm.TotNumSubc), ifft_out];
        
        %Update the tx_signal
        tx_signal = [tx_signal, ifft_out];
    end
    
    if sys_parm.NeedReceiver == 1
        %Construction of the preamble
        preamble = tx_gen_preamble(sys_parm);

        %Concatenate preamble and data part and normalize the average signal power to 1
        tx_signal = [preamble, tx_signal] * sys_parm.TotNumSubc * sys_parm.OverSamp / sqrt(ofdm_data_parm_const.UsedNumSubc);
        
%         %Window the ofdm signal
%         raisecosfir = rcosfir(0.5, 3, 5, 1);
%         tx_signal = filter(raisecosfir, 1, interp(tx_signal, 5));
%         tx_signal = decimate(tx_signal, 5);
%         tx_signal = tx_signal / std(tx_signal);
    else
        %Concatenate preamble and data part and normalize the average signal power to 1
        tx_signal = [tx_signal] * sys_parm.TotNumSubc * sys_parm.OverSamp / sqrt(ofdm_data_parm_const.UsedNumSubc);        
       
        figure(1);
        %Plot the PSD of the tx signal
        tx_signal_1 = tx_signal / max(abs(tx_signal));
        PW=pwelch(tx_signal_1, [], [], length(tx_signal_1) * 4);
        plot(10*log10(abs(fftshift(PW))), 'b');
        
        hold on;
        
        %Plot the PSD of the tx signal after windows
        raisecosfir = rcosfir(0.8, 3, 5, 1);
        tx_signal_2 = filter(raisecosfir, 1, interp(tx_signal, 5));
        tx_signal_2 = decimate(tx_signal_2, 5);
        tx_signal_2 = tx_signal_2 / max(abs(tx_signal_2));
        PW=pwelch(tx_signal_2, [], [], length(tx_signal_2) * 4);
        plot(10 * log10(abs(fftshift(PW))), 'r');
        
        figure(2);
        %Calculate the papr
        tx_signal_3 = reshape(tx_signal, sys_parm.OverSamp * sys_parm.TotNumSubc + ofdm_data_parm_const.CPLength, sys_parm.NumOFDMSymbols).';
        tx_signal_3(:, 1 : ofdm_data_parm_const.CPLength) = [];
        papr = max(abs(tx_signal_3) .^ 2, [], 2);
        papr = sort(floor(papr + 0.5));
        papr_value = papr(1);
        papr_value_num = 1;
        for id = 2 : length(papr)
            if papr(id) ~= papr_value(end)
                papr_value = [papr_value, papr(id)];
                papr_value_num = [papr_value_num, 1];
            else
                papr_value_num(end) = papr_value_num(end) + 1;
            end
        end
        papr_value = 10 * log10(papr_value);
        for id = 1 : length(papr_value_num)
            papr_num(id) = sum(papr_value_num(id : end)); 
        end
        papr_num = papr_num / sum(papr_value_num);
        semilogy(papr_value, papr_num, 'r');
        grid on;
    end
end










⌨️ 快捷键说明

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