Multi User Massive MIMO scenario

Reference Massive MIMO scenario, For TDD mode, since The wireless channel is estimated from the pilots in the uplink transmission. The channel estimated in the uplink phase is then used to calculate the feedback parameters (beamforming) for the downlink transmission which facilitates multi-user MIMO transmissions with a high number of antennas, as there is no pilot overhead needed in the downlink transmission phase, my question is why the performance of TDD is still low as compared to FDD for low number as well as high number of antennas, if UE velocity is set to low ? In other words, performance of FDD is better for Low speed UE as well as for High speed UE, whereas I expect TDD to Perform better for low speed UE as in TDD there is no pilot overhead needed in the downlink transmission phase.

Regards,
Farhan

Dear Fahan,
Could you show the details of your configurations here?
Best regards

% Massive MIMO Simulation Scenario
%
% The scenario consists of two base stations (BSs). Each BS performs a
% downlink transmission to four connected users using massive MIMO. The first
% BS employs ZF precoding, while the second BS employs MRT. As the number of
% BS antennas increases, the sum throughput of MRT approaches that of ZF.

%% Topology
scStr.topology.nodes = [‘BS1,BS2,UE1,UE2,UE3,UE4,UE5,UE6,UE7,UE8’];
scStr.topology.primaryLinks = [‘BS1:UE1,’ …
‘BS1:UE2,’ …
‘BS1:UE3,’ …
‘BS1:UE4,’ …
‘BS2:UE5,’ …
‘BS2:UE6,’ …
‘BS2:UE7,’ …
‘BS2:UE8,’ …
‘UE1:BS1,’ …
‘UE2:BS1,’ …
‘UE3:BS1,’ …
‘UE4:BS1,’ …
‘UE5:BS2,’ …
‘UE6:BS2,’ …
‘UE7:BS2,’ …
‘UE8:BS2’ …
];

scStr.topology.jointTxRxLinks = [’’];
scStr.topology.interferenceGeneration = ‘Automatic’;
scStr.topology.attenuation = 300;
scStr.topology.interferingLinks = [ ];

%% General Simulation Parameters
% Set link types to simulate
scStr.simulation.simulateDownlink = true;
scStr.simulation.simulateUplink = true;
scStr.simulation.simulateD2D = false;

% set duplexing mode (frame structure)
scStr.simulation.frameStructure = ‘FDD’; % may be ‘TDD’ or ‘FDD’

scStr.simulation.plotResultsFor = [1];
scStr.simulation.plotOverSNR = false;
scStr.simulation.plotPAPR = false;

scStr.simulation.saveData = false;

scStr.simulation.sweepParam = {‘simulation.nAntennasBaseStation’};
scStr.simulation.sweepValue = [4, 8, 12, 16, 24, 32, 64];
scStr.simulation.applySweepingTo = [1];

scStr.simulation.nFrames = 100;

%% Physical Transmission Parameters
scStr.simulation.centerFrequency = 2.5e9;

scStr.simulation.txPowerBaseStation = [0];
scStr.simulation.txPowerUser = [0];

% Antennas settings
scStr.simulation.codebook = ‘LTE’;
scStr.simulation.nAntennasBaseStation = [16];
scStr.simulation.antennaConfiguration = {[4,4]};
scStr.simulation.nAntennasUser = [1];

scStr.simulation.userVelocity = [5/3.6];

scStr.simulation.pathloss = [100];

% Nonlinearity model
scStr.simulation.nonlinearity = false;
scStr.simulation.amplifierOBO = [1];
scStr.simulation.smoothnessFactor = [3];

%% Channel Parameters
scStr.channel.dopplerModel = ‘Jakes’;
scStr.channel.timeSubsamplingFactor = 10;
scStr.channel.correlatedFrames = true;
scStr.channel.spatialCorrelation = ‘none’;
scStr.channel.nPaths = 50;
scStr.channel.powerDelayProfile = ‘PedestrianA’;
scStr.channel.K = 0;
scStr.channel.delta = 1;

scStr.channel.spatialChannelModel = false;
scStr.channel.nSpatialPaths = [10];
scStr.channel.angleMeanAOA = [90,60,45];
scStr.channel.angleMeanZOA = [45];
scStr.channel.angleSigmaAOA = [5];
scStr.channel.angleSigmaZOA = [5];
scStr.channel.kFactor = [5];
scStr.channel.antennaSpacing = [1/2];

%% Channel Estimation and Equalization Parameters
scStr.simulation.channelEstimationMethod = ‘Approximate-Perfect’;
scStr.simulation.noisePowerEstimation = false;
scStr.simulation.pilotPatternDownlink = ‘LTE Uplink’;
scStr.simulation.pilotPatternUplink = ‘LTE Uplink’;
scStr.simulation.pilotSpacingFrequency = 12;
scStr.simulation.pilotSpacingTime = 6;
scStr.simulation.pilotSequenceLength = 6;
scStr.simulation.receiverTypeMIMO = ‘MMSE’;

%% MIMO Parameters
% Layer mapping
scStr.layerMapping.mode = ‘LTE’;

scStr.layerMapping.table.Uplink = {1;2;[1,2]};
scStr.layerMapping.table.Downlink = {1;2;[1,2]};

% MIMO mode
scStr.modulation.transmissionMode = ‘custom’;
scStr.schedule.multiuserMode.Downlink = {‘ZF-MUMIMO’, ‘MRT-MUMIMO’};
scStr.schedule.multiuserMode.Uplink = {‘ZF-MUMIMO’, ‘MRC-MUMIMO’};
scStr.modulation.delayDiversity = 1;

%% Feedback Parameters
scStr.feedback.delay = 0;
scStr.feedback.averager.Type = ‘miesm’;
scStr.feedback.enable = true;
scStr.feedback.pmi = false;
scStr.feedback.ri = false;
scStr.feedback.cqi = true;

scStr.modulation.cqiTable = 0;
scStr.modulation.nStreams = [1];
scStr.modulation.precodingMatrix{1} = nan; % No need to set it when multiuserMode is MUMIMO
scStr.modulation.mcs = [8];
scStr.modulation.MUSTIdx = [2];

%% Modulation Parameters
% Waveform
scStr.modulation.waveform = {‘OFDM’};
scStr.modulation.spreadingTransformDownlink = ‘none’;
scStr.modulation.spreadingTransformUplink = ‘none’;
% Parameters for FBMC
scStr.modulation.prototypeFilter = ‘PHYDYAS-OQAM’;

% Parameters for UFMC
scStr.modulation.nSubcarriersPerSubband = [12];

% Numerology setup
scStr.modulation.numberOfSubcarriers = [72];
scStr.modulation.subcarrierSpacing = [15e3];
scStr.modulation.nSymbolsTotal = [15];
scStr.modulation.nGuardSymbols = [1];
scStr.modulation.samplingRate = ‘Automatic’;

%% Channel Coding Parameters
scStr.coding.code = {‘Turbo’};
scStr.coding.decoding = {‘Max-Log-MAP’};
scStr.coding.decodingIterations = [8];
scStr.coding.LLRsCalculationMethod = ‘Max-Log’;
scStr.coding.softBufferRatio = [1];

%% Schedule
scStr.schedule.fixedScheduleDL{1} = [‘UE1:72,UE2:UE1,UE3:UE1,UE4:UE1’];
scStr.schedule.fixedScheduleDL{2} = [‘UE5:72,UE6:UE5,UE7:UE5,UE8:UE5’];
scStr.schedule.fixedScheduleUL{1} = [‘UE1:72,UE2:UE1,UE3:UE1,UE4:UE1’];
scStr.schedule.fixedScheduleUL{2} = [‘UE5:72,UE6:UE5,UE7:UE5,UE8:UE5’];

% Massive MIMO Simulation Scenario
%
% The scenario consists of two base stations (BSs). Each BS performs a
% downlink transmission to four connected users using massive MIMO. The first
% BS employs ZF precoding, while the second BS employs MRT. As the number of
% BS antennas increases, the sum throughput of MRT approaches that of ZF.

%% Topology
scStr.topology.nodes = [‘BS1,BS2,UE1,UE2,UE3,UE4,UE5,UE6,UE7,UE8’];
scStr.topology.primaryLinks = [‘BS1:UE1,’ …
‘BS1:UE2,’ …
‘BS1:UE3,’ …
‘BS1:UE4,’ …
‘BS2:UE5,’ …
‘BS2:UE6,’ …
‘BS2:UE7,’ …
‘BS2:UE8,’ …
‘UE1:BS1,’ …
‘UE2:BS1,’ …
‘UE3:BS1,’ …
‘UE4:BS1,’ …
‘UE5:BS2,’ …
‘UE6:BS2,’ …
‘UE7:BS2,’ …
‘UE8:BS2’ …
];

scStr.topology.jointTxRxLinks = [’’];
scStr.topology.interferenceGeneration = ‘Automatic’;
scStr.topology.attenuation = 300;
scStr.topology.interferingLinks = [ ];

%% General Simulation Parameters
% Set link types to simulate
scStr.simulation.simulateDownlink = true;
scStr.simulation.simulateUplink = true;
scStr.simulation.simulateD2D = false;

% set duplexing mode (frame structure)
scStr.simulation.frameStructure = ‘TDD’; % may be ‘TDD’ or ‘FDD’

scStr.simulation.plotResultsFor = [1];
scStr.simulation.plotOverSNR = false;
scStr.simulation.plotPAPR = false;

scStr.simulation.saveData = false;

scStr.simulation.sweepParam = {‘simulation.nAntennasBaseStation’};
scStr.simulation.sweepValue = [4, 8, 12, 16, 24, 32, 64];
scStr.simulation.applySweepingTo = [1];

scStr.simulation.nFrames = 100;

%% Physical Transmission Parameters
scStr.simulation.centerFrequency = 2.5e9;

scStr.simulation.txPowerBaseStation = [0];
scStr.simulation.txPowerUser = [0];

% Antennas settings
scStr.simulation.codebook = ‘LTE’;
scStr.simulation.nAntennasBaseStation = [16];
scStr.simulation.antennaConfiguration = {[4,4]};
scStr.simulation.nAntennasUser = [1];

scStr.simulation.userVelocity = [5/3.6];

scStr.simulation.pathloss = [100];

% Nonlinearity model
scStr.simulation.nonlinearity = false;
scStr.simulation.amplifierOBO = [1];
scStr.simulation.smoothnessFactor = [3];

%% Channel Parameters
scStr.channel.dopplerModel = ‘Jakes’;
scStr.channel.timeSubsamplingFactor = 10;
scStr.channel.correlatedFrames = true;
scStr.channel.spatialCorrelation = ‘none’;
scStr.channel.nPaths = 50;
scStr.channel.powerDelayProfile = ‘PedestrianA’;
scStr.channel.K = 0;
scStr.channel.delta = 1;

scStr.channel.spatialChannelModel = false;
scStr.channel.nSpatialPaths = [10];
scStr.channel.angleMeanAOA = [90,60,45];
scStr.channel.angleMeanZOA = [45];
scStr.channel.angleSigmaAOA = [5];
scStr.channel.angleSigmaZOA = [5];
scStr.channel.kFactor = [5];
scStr.channel.antennaSpacing = [1/2];

%% Channel Estimation and Equalization Parameters
scStr.simulation.channelEstimationMethod = ‘Approximate-Perfect’;
scStr.simulation.noisePowerEstimation = false;
scStr.simulation.pilotPatternDownlink = ‘LTE Uplink’;
scStr.simulation.pilotPatternUplink = ‘LTE Uplink’;
scStr.simulation.pilotSpacingFrequency = 12;
scStr.simulation.pilotSpacingTime = 6;
scStr.simulation.pilotSequenceLength = 6;
scStr.simulation.receiverTypeMIMO = ‘MMSE’;

%% MIMO Parameters
% Layer mapping
scStr.layerMapping.mode = ‘LTE’;

scStr.layerMapping.table.Uplink = {1;2;[1,2]};
scStr.layerMapping.table.Downlink = {1;2;[1,2]};

% MIMO mode
scStr.modulation.transmissionMode = ‘custom’;
scStr.schedule.multiuserMode.Downlink = {‘ZF-MUMIMO’, ‘MRT-MUMIMO’};
scStr.schedule.multiuserMode.Uplink = {‘ZF-MUMIMO’, ‘MRC-MUMIMO’};
scStr.modulation.delayDiversity = 1;

%% Feedback Parameters
scStr.feedback.delay = 0;
scStr.feedback.averager.Type = ‘miesm’;
scStr.feedback.enable = true;
scStr.feedback.pmi = false;
scStr.feedback.ri = false;
scStr.feedback.cqi = true;

scStr.modulation.cqiTable = 0;
scStr.modulation.nStreams = [1];
scStr.modulation.precodingMatrix{1} = nan; % No need to set it when multiuserMode is MUMIMO
scStr.modulation.mcs = [8];
scStr.modulation.MUSTIdx = [2];

%% Modulation Parameters
% Waveform
scStr.modulation.waveform = {‘OFDM’};
scStr.modulation.spreadingTransformDownlink = ‘none’;
scStr.modulation.spreadingTransformUplink = ‘none’;
% Parameters for FBMC
scStr.modulation.prototypeFilter = ‘PHYDYAS-OQAM’;

% Parameters for UFMC
scStr.modulation.nSubcarriersPerSubband = [12];

% Numerology setup
scStr.modulation.numberOfSubcarriers = [72];
scStr.modulation.subcarrierSpacing = [15e3];
scStr.modulation.nSymbolsTotal = [15];
scStr.modulation.nGuardSymbols = [1];
scStr.modulation.samplingRate = ‘Automatic’;

%% Channel Coding Parameters
scStr.coding.code = {‘Turbo’};
scStr.coding.decoding = {‘Max-Log-MAP’};
scStr.coding.decodingIterations = [8];
scStr.coding.LLRsCalculationMethod = ‘Max-Log’;
scStr.coding.softBufferRatio = [1];

%% Schedule
scStr.schedule.fixedScheduleDL{1} = [‘UE1:72,UE2:UE1,UE3:UE1,UE4:UE1’];
scStr.schedule.fixedScheduleDL{2} = [‘UE5:72,UE6:UE5,UE7:UE5,UE8:UE5’];
scStr.schedule.fixedScheduleUL{1} = [‘UE1:72,UE2:UE1,UE3:UE1,UE4:UE1’];
scStr.schedule.fixedScheduleUL{2} = [‘UE5:72,UE6:UE5,UE7:UE5,UE8:UE5’];

Dear Farhan,

In the current implementation, we assume that the channel is known at the transmitter for the FDD mode, and we use it to calculate the CQI and the precoders. Whereas in the TDD mode, we use the channel estimated in the uplink to calculate the precoder and the CQI.

To have a fair compersion between TDD and FDD, you would have to implement some channel feedback scheme and use this fed back channel for the precoding and the CQI calculation.

Best,
Mariam

Hi Mariam,

Thanks for your reply. Why I need to implement channel feedback as for massiveMIMO Scenario, feedback is already enabled.
%% Feedback Parameters
scStr.feedback.enable = true;

Do you think with this setting comparing TDD and FDD is still unfair?

Dear Farhan,

The feedback refers to the calculation of the CQI. Since we are not estimating the channel in the downlink and feeding it back to the BS, I would still consider it an unfair comparison.

Best,
Mariam

Hi Mariam,

In this MU-MIMO Scenario The sum rate for for Maximum ratio
transmission (MRT) and Zero forcing precoding are using which normalization method? Vector or Matrix or any other?

Also Refer MU-MIMO scenario, As the User Manual says that “While both sum throughput curves, from cell
one and cell two, do of course increase with an increasing number of antennas,
the ZF cell one throughput reaches the saturation value for a smaller number
of antennas compared to the MRT cell two.” I want to ask the scientific reason behind this!

Dear Farhan,

I did not understand your question. Could you please explain what you mean by normalization method? Do you mean the normalization of the precoders?

Best,
Mariam

Hi Mariam,

Yes, normalization of the precoders. Also appreciate it if you can give the scientific reason behind this statement “While both sum throughput curves, from cell
one and cell two, do of course increase with an increasing number of antennas,
the ZF cell one throughput reaches the saturation value for a smaller number
of antennas compared to the MRT cell two."

Dear Farhan,

The ZF precoder is given by

CodeCogsEqn
where CodeCogsEqn copy is the Frobenius norm.

The ZF precoder cancels the interference between the users, whereas the MRT maximizes the received power and does not cancel the interference. As the number of antennas becomes very large, the channel vectors between the BS and the UEs are nearly orthogonal (aka favorable propagation). For a large number of antennas, the post-equalization interference is very small for both precoders. Therefore, both schemes saturate at the maximum throughput.

Best,
Mariam

Dear Mariam,

As mentioned in the Manual that in link level simulator there exists no underlying geometry. , I still do not understand how geometry can be ignored with MU-MIMO as the relative position of nodes is important for beamforming, in particular with zero forcing, where a zero needs to be forced where other nodes are located? Isn’t that the case?

Dear Farhan,

With zero-forcing, the signal of the user is precoded such that it adds up destructively towards all other users.

You can find a good explanation here:
https://ma-mimo.ellintech.se/2017/10/03/what-is-the-difference-between-beamforming-and-precoding/

Best,
Mariam

Thanks, Can I get a list of what is planned for upcoming release of Link Level Simulator?