📄 mainmimo_ofdma_2tx_ser.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 + -