?About the author: A Matlab simulation developer who loves scientific research. He cultivates his mind and improves his technology simultaneously. For cooperation on MATLAB projects, please send a private message.
Personal homepage: Matlab Research Studio
Personal credo: Investigate things to gain knowledge.
For more complete Matlab code and simulation customization content, click
Intelligent optimization algorithm Neural network prediction Radar communication Wireless sensor Power system
Signal processing Image processing Path planning Cellular automaton Drone
Content introduction
In today’s communication field, multi-user multiple input multiple output (MU-MIMO) systems have become an important part of wireless communication networks. The emergence of MU-MIMO technology enables base stations to communicate with multiple users at the same time, thereby significantly improving system capacity and performance. However, the infinite norm detection problem in MU-MIMO systems has always been a challenging research direction.
Infinity norm detection refers to estimating the infinite norm of the transmitted signal from the received signal in the MU-MIMO system. Due to the presence of multiple users and multiple antennas in MU-MIMO systems, the infinite norm detection problem becomes very complex. To solve this problem, researchers have proposed many different methods and algorithms.
One of the widely used methods is the infinite norm detection algorithm based on the alternating direction multiplier method (ADMM). ADMM is an iterative algorithm that is solved by decomposing the original problem into several sub-problems. In the MU-MIMO system, the ADMM algorithm can transform the infinite norm detection problem into a constrained convex optimization problem, and then solve the problem iteratively to obtain the optimal solution.
The advantage of the ADMM algorithm is that it has better convergence and adaptability. It can effectively solve the infinite norm detection problem in MU-MIMO systems and has high performance in practical applications. In addition, the ADMM algorithm can be combined with other optimization algorithms to further improve detection performance.
However, although the ADMM algorithm has great potential in infinite norm detection problems, there are still some challenges and limitations. One of the challenges is the complexity and computational overhead of the algorithm. Since the number of antennas and users in MU-MIMO systems is usually large, the ADMM algorithm needs to deal with large-scale optimization problems, which will lead to an increase in computational complexity. In addition, the convergence speed of the ADMM algorithm may also be affected by system parameters and channel conditions.
Part of the code
disp('using default simulation settings and parameters...')</code><code> </code><code> % set default simulation parameters</code><code> par.suffix = \ 'exp'; % simulation name suffix: 'exp' experimental</code><code> par.runId = 0; % simulation ID (used to reproduce results)</code><code> par.MR = 64 ; % receive antennas</code><code> par.MT = 16; % user terminals (set not larger than MR!)</code><code> par.mod = '64QAM'; % modulation type: \ 'BPSK','QPSK','16QAM','64QAM'</code><code> par.simName = ['ERR_' num2str(par.MR) 'x' num2str(par.MT) '_' par.mod '_' par.suffix] ; % simulation name (used for saving results)</code><code> par.trials = 100; % number of Monte -Carlo trials (transmissions)</code><code> par.SNRdB_list = 10:2:20; % list of SNR [dB] values to be simulated</code><code> par.detector = {'Conjugate- Gradient','Neumann','Gauss-Seidel','OCDBOX','ADMIN'}; % define detector(s) to be simulated</code><code> % algorithm specific </code><code> par.alg.maxiter = 3;</code><code>else</code><code> </code><code> disp('use custom simulation settings and parameters... ')</code><code> par = varargin{1}; % only argument is par structure</code><code> </code><code>end</code><code>?</code> <code>% -- initialization</code><code>?</code><code>% use runId random seed (enables reproducibility)</code><code>% rng(par.runId);</code> <code>?</code><code>% set up Gray-mapped constellation alphabet (according to IEEE 802.11)</code><code>switch (par.mod)</code><code> case 'BPSK\ '</code><code> par.symbols = [ -1 1 ];</code><code> case 'QPSK'</code><code> par.symbols = [ -1-1i,-1 + 1i, ...</code><code> + 1-1i, + 1 + 1i ];</code><code> case '16QAM'</code><code> par.symbols = [ - 3-3i,-3-1i,-3 + 3i,-3 + 1i, ...</code><code> -1-3i,-1-1i,-1 + 3i,-1 + 1i, . ..</code><code> + 3-3i, + 3-1i, + 3 + 3i, + 3 + 1i, ...</code><code> + 1-3i, + 1-1i, + 1 + 3i, + 1 + 1i ];</code><code> case '64QAM'</code><code> par.symbols = [ -7-7i,-7-5i,-7-1i, -7-3i,-7 + 7i,-7 + 5i,-7 + 1i,-7 + 3i, ...</code><code> -5-7i,-5-5i,-5-1i, -5-3i,-5 + 7i,-5 + 5i,-5 + 1i,-5 + 3i, ...</code><code> -1-7i,-1-5i,-1-1i, -1-3i,-1 + 7i,-1 + 5i,-1 + 1i,-1 + 3i, ...</code><code> -3-7i,-3-5i,-3-1i, -3-3i,-3 + 7i,-3 + 5i,-3 + 1i,-3 + 3i, ...</code><code> + 7-7i, + 7-5i, + 7-1i, + 7-3i, + 7 + 7i, + 7 + 5i, + 7 + 1i, + 7 + 3i, ...</code><code> + 5-7i, + 5-5i, + 5-1i, + 5-3i, + 5 + 7i, + 5 + 5i, + 5 + 1i, + 5 + 3i, ...</code><code> + 1-7i, + 1-5i, + 1-1i, + 1-3i, + 1 + 7i, + 1 + 5i, + 1 + 1i, + 1 + 3i, ...</code><code> + 3-7i, + 3-5i, + 3-1i, + 3-3i, + 3 + 7i, + 3 + 5i, + 3 + 1i, + 3 + 3i ];</code><code> </code><code>end</code><code>?</code><code>% extract average symbol energy</code><code>par.Es = mean(abs(par.symbols).^2);</code><code>?</code><code> % precompute bit labels</code><code>par.Q = log2(length(par.symbols)); % number of bits per symbol</code><code>par.bits = de2bi(0:length(par. symbols)-1,par.Q,'left-msb');</code><code>?</code><code>% track simulation time</code><code>time_elapsed = 0;</code> code><code>?</code><code>% -- start simulation</code><code>?</code><code>% initialize result arrays (detector x SNR)</code><code>res .VER = zeros(length(par.detector),length(par.SNRdB_list)); % vector error rate</code><code>res.SER = zeros(length(par.detector),length(par.SNRdB_list) ); % symbol error rate</code><code>res.BER = zeros(length(par.detector),length(par.SNRdB_list)); % bit error rate</code><code>?</code> <code>% generate random bit stream (antenna x bit x trial)</code><code>bits = randi([0 1],par.MT,par.Q,par.trials);</code><code>?</code><code>% trials loop</code><code>tic</code><code>for t=1:par.trials</code><code> </code><code> % generate transmit symbol</code><code> idx = bi2de(bits(:,:,t),'left-msb') + 1;</code><code> s = par.symbols(idx). ';</code><code> </code><code> % generate iid Gaussian channel matrix & amp; noise vector</code><code> n = sqrt(0.5)*(randn(par.MR,1 ) + 1i*randn(par.MR,1));</code><code> H = sqrt(0.5)*(randn(par.MR,par.MT) + 1i*randn(par.MR,par. MT));</code><code> </code><code> % transmit over noiseless channel (will be used later)</code><code> x = H*s;</code><code> </code><code> % SNR loop</code><code> for k=1:length(par.SNRdB_list)</code><code> % Current SNR point in dBs</code><code> SNR_dB = par .SNRdB_list(k);</code><code> % Linear SNR</code><code> SNR_lin = 10.^(SNR_dB./10);</code><code> </code><code> % Variance of complex noise per receive antenna</code><code> N0 = par.Es*par.MT/SNR_lin;</code><code> </code><code> % transmit data over noisy channel</code> <code> y = x + sqrt(N0)*n;</code><code> </code><code> % algorithm loop</code><code> for d=1:length(par.detector)</code><code> switch (par.detector{d}) % select algorithms</code><code> case 'MF' % Matched Filter</code><code> [idxhat,bithat] = MF(par ,H,y,N0);</code><code> case 'MMSE' % MMSE detector</code><code> [idxhat,bithat] = MMSE(par,H,y,N0);</code code><code> case 'SIMO' % SIMO lower bound</code><code> [idxhat,bitthat] = SIMO(par,H,y,N0,s);</code><code> case \ 'ADMIN' % ADMM-based Infinity Norm detector</code><code> [idxhat,bithat] = ADMIN(par,H,y,N0);</code><code> case 'OCDBOX' % co -ordinate descent (optimized) detector</code><code> [idxhat,bithat] = OCDBOX(par,H,y);</code><code> case 'Neumann' % coordinate descent</code><code> [idxhat,bitthat] = Neumann(par,H,y,N0);</code><code> case 'Gauss-Seidel' % Gauss-Seidel detector</code><code> [idxhat,bithat ] = Gauss_Seidel(par,H,y,N0);</code><code> case 'Conjugate-Gradient' % conjugate gradient detector</code><code> [idxhat,bithat] = CG(par,H ,y,N0);</code><code> otherwise</code><code> error('par.detector type not defined.')</code><code> end</code><code> </code><code> % -- compute error metrics</code><code> err = (idx~=idxhat);</code><code> res.VER(d,k) = res.VER(d ,k) + any(err);</code><code> res.SER(d,k) = res.SER(d,k) + sum(err)/par.MT;</code><code> res.BER(d,k) = res.BER(d,k) + sum(sum(bits(:,:,t)~=bitthat))/(par.MT*par.Q);</code> <code> </code><code> end % algorithm loop</code><code> </code><code> end % SNR loop</code><code> </code><code> % keep track of simulation time</code><code> if toc>10</code><code> time=toc;</code><code> time_elapsed = time_elapsed + time;</code><code> fprintf('estimated remaining simulation time: %3.0f min.\\ ',time_elapsed*(par.trials/t-1)/60);</code><code> tic</code><code> end</code><code> </code><code>end % trials loop</code><code>?
Operation results
References
S. Shahabddin, M. Juntti and C. Studer, “ADMM-based infinity-norm detector for large-scale MIMO”, IEEE International symposium of circuits and systems, Maryland, USA, May 2017.