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

📄 mainmimo_ofdma_2tx_ser.m

📁 两发两收的空时分组编码OFDM系统 采用SUI5信道模型
💻 M
字号:
function mainMIMO_OFDMA_2Tx_SER

% ESTI(Fs/BW=8/7), BW=7MHz, Tb=256us

% **************** Set Pameters ********************
% DL PUSC, a slot: one subchannel by 2 OFDMA symbols
% Number of clusters: 120, Number of subcarriers per cluster: 14 (2 pilots, 12 data)
% Nused=1681

% UL PUSC, a slot: one subchannel by 3 OFDMA symbols
% Tile structure: 12 subcarriers,3 symbols per tile(4 pilots, 8 data) 
% Nused=1681

% DL FUSC, a slot: one subchannel by 1 OFDMA symbols
% Number of data subcarriers: 32*48=1536, Number of pilots: 166
% Nused=1703

%addpath(pwd);
%cd data

% ----------Modulation Parameters----------------
modparams.permutation='DL_FUSC'; 
modparams.qam=16;       % constellation
modparams.IDcell=3;
modparams.Guard=1/8;
modparams.sympf=6;     % number of data symbols per frames(Must be even for Alamouti Transmit Diversity)
modparams.numframe=500;   % number of frames in the simulation

% -------Permutation related parameters------
switch modparams.permutation,
    case 'DL_PUSC', % cluster structure
        error('Not Support DL_PUSC Now!');
    case 'DL_FUSC', % Full used, Note: Not use Variable/Constant pilot set here!
        modparams.tx1_outfile='mod_DFUSC_QAM16_Tx1.dat';     % this file contain time domain samples of one frame for Antenna 1
        modparams.tx2_outfile='mod_DFUSC_QAM16_Tx2.dat';     % this file contain time domain samples of one frame for Antenna 2
        modparams.origfile='orig_DFUSC_QAM16.mat';     % this file contain data subcarrier values of one frame
        chanparams.rx1_outfile='chansui5_DFUSC_QAM16_rx1.dat';      % this file contain time domain samples of all frames after channel
        chanparams.rx2_outfile='chansui5_DFUSC_QAM16_rx2.dat';
        awgnparams.rx1_outfile='awgn_sui5_DFUSC_QAM16_rx1.dat';      % this file contain time domain samples of all frames at receiver with awgn
        awgnparams.rx2_outfile='awgn_sui5_DFUSC_QAM16_rx2.dat';
        %awgnparams.rx1_outfile='awgn_snr20_sui5_DFUSC_QAM16_rx1.dat';
        %awgnparams.rx2_outfile='awgn_snr20_sui5_DFUSC_QAM16_rx2.dat';
    case 'UL_PUSC', % tile structure, Note: tile expand 3 symbols, must allocate data for 3 symbols one time
        error('Not Support UL_PUSC Now!');
    otherwise,
        error('Not supported permutation!');
end

% ----------channel SUI parameters---------------
chanparams.chantype=5;
if modparams.permutation=='DL_FUSC',
    chanparams.cohtime=2048*(1+modparams.Guard)*(1+modparams.sympf);      % number of sampling points per OFDM frame(with preamble)
else
    chanparams.cohtime=2048*(1+modparams.Guard)*modparams.sympf;      % number of sampling points per OFDM frame
end
chanparams.tx1_infile=modparams.tx1_outfile;
chanparams.tx2_infile=modparams.tx2_outfile;
chanparams.sampletime=1/8;  % 1/fs in us
chanparams.numframe=modparams.numframe;

% -----------AWGN parameters---------------------
awgnparams.cohtime=chanparams.cohtime;
awgnparams.rx1_infile=chanparams.rx1_outfile;
awgnparams.rx2_infile=chanparams.rx2_outfile;
awgnparams.numframe=modparams.numframe;

% -----------Demodulation parameters-------------
demparams.permutation=modparams.permutation;
demparams.rx1_infile=awgnparams.rx1_outfile;
demparams.rx2_infile=awgnparams.rx2_outfile;
demparams.Guard=modparams.Guard;
demparams.sympf=modparams.sympf;
demparams.qam=modparams.qam;
demparams.origfile=modparams.origfile;
demparams.cohtime=chanparams.cohtime;
demparams.numframe=modparams.numframe;
demparams.chantype=chanparams.chantype;
demparams.sampletime=chanparams.sampletime;
demparams.chanEstAlgo='ls';

% Transmitter
%modofdma(modparams);

% Channel
%chanSUI_corr_2x2(chanparams);

% AWGN
SNRdB=[5:6];       % SNR per bit, i.e. Eb/N0, in dB
%SNRdB=[6];
SNR=10.^(SNRdB/10);   % convert to linear ratio
% ##!Note: 2 antennas, each transmit unity power signal, so total signal power is 2.
NoisePwr=2/log2(modparams.qam)./SNR;    % log2(qam)*Eb/N0=Es/N0
for loop=1:length(SNR)
    addAWGN_2x2(awgnparams,NoisePwr(loop));
end

% Receiver
ser=zeros(1,length(SNRdB));
% open received data file
ipfid_rx1 = fopen(demparams.rx1_infile, 'r');
if ipfid_rx1 < 0
   error('unable to open receiver Rx 1 input data file');
end
ipfid_rx2 = fopen(demparams.rx2_infile, 'r');
if ipfid_rx2 < 0
   error('unable to open receiver Rx 2 input data file');
end
% MSE and SER log file
logfile_mse='temp_mse.txt';
logfid_mse=fopen(logfile_mse,'a');
fprintf(logfid_mse,'\nSimulation MSE result:\n');
fclose(logfid_mse);

logfile_ser='temp_ser.txt';
logfid_ser=fopen(logfile_ser,'a');
fprintf(logfid_ser,'\nSimulation SER result:\n');
fclose(logfid_ser);
for loop=1:length(SNR)
    % ###### Used for Restart simulation after Power Off  ######
    if loop<0,
        for frm=1:demparams.numframe
            [data, datalen] = fread(ipfid_rx1, 2*demparams.cohtime, 'float32');
            if datalen~=2*demparams.cohtime, error('fread Rx 1 channel input data error!'); end
            [data, datalen] = fread(ipfid_rx2, 2*demparams.cohtime, 'float32');
            if datalen~=2*demparams.cohtime, error('fread Rx 2 channel input data error!'); end
        end
        continue;
    end
    % ##########################################################
    [ser(loop),mse(loop)]=demofdma(demparams,NoisePwr(loop),ipfid_rx1,ipfid_rx2);
    
    logfid_ser=fopen(logfile_ser,'a');
    fprintf(logfid_ser,' %f ',ser(loop));
    fclose(logfid_ser);
    
    logfid_mse=fopen(logfile_mse,'a');
    fprintf(logfid_mse,' %f ',mse(loop));
    fclose(logfid_mse);
end


fclose(ipfid_rx1);
fclose(ipfid_rx2);

semilogy(SNRdB,ser,'+-');

⌨️ 快捷键说明

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