当前位置:   article > 正文

基于MATLAB的MIMO预编码设计:优化迫零算法(附完整代码与分析)_大规模mimo预编码matlab

大规模mimo预编码matlab

目录

一.介绍

二. 对比本方案优化后的迫零算法与原始的迫零算法

三. 源代码

四. 运行结果及分析

4.1 天线数为8

4.2 天线数为128


一.介绍

图中“RF Chain” 全称为Radio Frequency Chain,代表射频链路。

MIMO预编码包含了基带预编码W(改变幅度和相位)和射频预编码F(改变相位)。用户k端收到的信号为:

上式中h^H_k代表基站到用户的信道矩阵,F代表射频预编码,W代表基带预编码,s代表发射信号向量,n_k代表加性高斯白噪声。

发射流的最大数量为K,则:

||FW||^2_F=K

用户k端受到的信干噪比(SINR)为:

 上式子中P代表基站的发射功率。其他参数的意义上面已解释。

系统的总频谱效率为:

 上式中E[]代表求数学期望。 其他参数的意义上面已解释。

依据基础的迫零算法进行改进,将K个射频链路输出与N_t个发射天线进行耦合,仅仅进行相位控制,然后在基带上进行低维多流处理,最终降低用户间的干扰,本方案创新性提出相位-迫零算法(Phased-ZF),优点:

极大降低计算复杂度;

性能逼近原始ZF(迫零)算法;

对该预编码的两步,总结来看为如下:

 

二. 对比本方案优化后的迫零算法与原始的迫零算法

三. 源代码

一共八个文件,两个主运行文件,六个函数文件。注意最后的两个文件为实际产生图像的代码部分。

(1)

  1. % BD precoder design subfunction r = CalBDPrecoder(G, K) --%
  2. % Input: H, K*Nr x Nt, aggregate channel,
  3. % NsUE, # streams per user, K x 1
  4. % Output: r, Nt x K*Lr BD precoder
  5. function r = CalBDPrecoder(H, NsUE) % no waterfilling
  6. if nargin <= 1
  7. NsUE = ones(size(H,1)); % essentially ZF precoding with column normalization
  8. end
  9. [NR, Nt] = size(H);
  10. K = length(NsUE);
  11. Nr = NR/K;
  12. F = [];% BD precoder initialization
  13. %***** Standard BD design based on paper "ZF methods for DL spatial multiplexing..." ***%
  14. for iK = 1 : K
  15. Gj = H(((iK-1)*Nr+1):(iK*Nr),:);
  16. G_tilde = H;
  17. G_tilde(((iK-1)*Nr+1):(iK*Nr),:) = []; % Delete iK-user's channel, G_tilde
  18. [U, S, V] = svd(G_tilde);
  19. rv = rank(G_tilde);
  20. Htmp = Gj*V(:, (rv + 1):Nt );
  21. Lr = rank(Htmp);% # of data streams accommodated by iK user
  22. [Ut, St, Vt] = svd(Htmp);
  23. Ftmp = V( : , (rv + 1):Nt)*Vt(: , 1:NsUE(iK));
  24. F = [F Ftmp];
  25. end
  26. r = F;

 (2)

  1. % Function to calculate achievable rates
  2. % r = CalRate(H, W, K);
  3. % Input: H, channel instantialization, (KNr) x Nt
  4. % W, precoding matrix, column normalized, Nt x Ns
  5. % NsUE, a vector showing # streams of each UE, K x 1
  6. % Incov, input covariance, i.e., power allocation, Ns x Ns
  7. % Output: r, achievable rate
  8. function r = CalRate(Incov, H, W, NsUE)
  9. Incov = diag(Incov); % vectorize
  10. if nargin <= 3
  11. NsUE = ones(size(W,2), 1);% set default, single stream per user
  12. end
  13. K = length(NsUE);% # of users
  14. Nr = size(H, 1)/K;% # antenna per user, assuming equal
  15. Ns = sum(NsUE);% total # data streams
  16. rate = 0;
  17. for iK = 1 : K
  18. st = sum(NsUE(1:(iK-1)))+1;
  19. ed = sum(NsUE(1:iK));
  20. Hj = H( (Nr*(iK-1)+1) : (Nr*iK), :);% user channel of i
  21. Wj = W(:, st:ed);% precoder for user i
  22. covj = diag(Incov(st:ed));
  23. Pj = Hj*Wj*covj*(Hj*Wj)'; % signal power term
  24. Wintf = W;% precoder for interferers
  25. covtp = Incov;
  26. Wintf(:, st:ed) = [];
  27. covtp(st:ed) = [];
  28. cov_intf = diag(covtp);
  29. Pintf = (Hj*Wintf)*cov_intf*(Hj*Wintf)';% interference power term
  30. rate = rate + log2(det( eye(Nr) + inv( eye(Nr) + Pintf ) * Pj ));
  31. end
  32. r = rate;

(3)

  1. % expintn exponential intergral of the order n
  2. % r = expintn(x, n) gives integral from 1 to inf of (exp(-xt)/t^n)dt, for x > 0
  3. function r = expintn_noMaple(x, n)
  4. if n >= 2
  5. sum = 0;
  6. for m = 0 : (n-2)
  7. sum = sum + (-1)^m*factorial(m)/x^(m+1);
  8. end
  9. minuend = x^(n-1) * (-1)^(n+1)/factorial(n-1) * expint(x);
  10. subtractor = x^(n-1) * (-1)^(n+1)/factorial(n-1) * exp(-x) * sum;
  11. r = minuend - subtractor;
  12. else
  13. r = expint(x);
  14. end

(4)

  1. % expintn(x, n) is an an exponential integral of order n with input x,
  2. % computed using maple
  3. function r = expintn(x, n)
  4. cmd_str = sprintf('evalf[16](Ei(%d, %g));', n, x);
  5. r = double(maple(cmd_str));

(5)

  1. % Generate a simplified MU-MIMO channel based on uniform linear array (ULA)
  2. % "The capacity optimality of beam steering in large mmWave MIMO channels"
  3. % [H, Gain, At] = GenChannelSimp (Nt, K, Ncls)
  4. % Input: Nt, number of TX antennas
  5. % K, number of single-antenna UEs
  6. % Ncls, number of clusters, single path per cluster
  7. % d, normalized antenna spacing
  8. % Output: H, generated MU-MIMO channel
  9. % Gain, complex gain of each path
  10. % At, concatenation of array response vectors
  11. function [H, Gain, At] = GenChannelSimp(Nt, K, Ncls, d)
  12. if nargin <= 3
  13. d = 1/2;
  14. end
  15. % spread = pi/12;% [-15, 15]
  16. spread = pi;
  17. ang = (2*rand(Ncls, K)-1)*spread; % generated path angles, uniform distribution
  18. Gain = (randn(Ncls, K) + j*randn(Ncls, K))/sqrt(2);
  19. At = zeros(Nt, Ncls, K);
  20. H = zeros(K, Nt);
  21. for ik = 1 : K
  22. tmp = 0 : (Nt-1);
  23. tmp = tmp(:);
  24. kron1 = j*2*pi*d*tmp;
  25. kron2 = sin(ang(:, ik));
  26. kron2 = kron2.';
  27. kronr = kron(kron1, kron2);
  28. At(:, :, ik) = 1/sqrt(Nt) * exp(kronr);
  29. H(ik, :) = sqrt(Nt/Ncls) * Gain(:, ik).' * At(:, :, ik)';
  30. end

(6)

  1. % Quant(B, W) quantizes phases of each element in W up to B bits of precision
  2. function r = Quant(B, W)
  3. delta = 2*pi/2^B; % quantization interval
  4. r = zeros(size(W, 1), size(W, 2));% ininitialize quantized matrix
  5. for i1 = 1 : size(W, 1)
  6. for i2 = 1 : size(W, 2)
  7. ph = phase(W(i1, i2)); % ph in [-pi, pi]
  8. phq = floor(ph/delta)*delta +(mod(ph, delta) > delta/2)*delta ;% quantized phase
  9. r(i1, i2) = exp(j*phq);
  10. end
  11. end
  12. r = 1/sqrt(size(W, 1)) * r;
  13. end

(7)

  1. % Massive MU-MIMO under chain limitations, single-antenna UE
  2. % Hybrid precoding with ZF at baseband and phase reversal at analog
  3. % Compare full-complexity ZF (FC-ZF) vs Hybrid
  4. tic; clear; clc
  5. Nt = 8;
  6. K = 2; % UE number
  7. B1 = 1; % quantized analog beamforming, up to B bits of precision
  8. B2 = 2;
  9. SNR = 0 : 5 : 30;
  10. nSNR = length(SNR);
  11. channNum = 1e3;
  12. rateZF = zeros(nSNR, 1); % FC-ZF
  13. rateZFA = zeros(nSNR, 1);
  14. rateHyb = zeros(nSNR, 1);% W = ZF at baseband, F = PR at analog
  15. rateHybA = zeros(nSNR, 1);
  16. rateQHyb1 = zeros(nSNR, 1);% Quantized PR, ZF at baseband
  17. rateQhyb2 = zeros(nSNR, 1);
  18. for isnr = 1 : nSNR
  19. P = 10^(SNR(isnr)/10);
  20. % ====================================================================
  21. % ===================== Analytical result ============================
  22. % ====================================================================
  23. % ========== ZF analytical results =============
  24. s = 0;
  25. for k = 1 : (Nt)
  26. rho = P/K;
  27. s = s + exp(1/rho)*log2(exp(1)) * expintn_noMaple(1/rho, k); % use maple for expintn()
  28. % s = s + exp(1/rho)*log2(exp(1)) * expintn_noMaple(1/rho, k); % if no maple installed
  29. end
  30. rateZFA(isnr) = K*s;
  31. % ========= Hybrid precoding analytical results ==========
  32. rateHybA(isnr) = K*log2(1 + (pi/4) * (P*Nt)/K );
  33. % ====================================================================
  34. % ===================== Simulation result ============================
  35. % ====================================================================
  36. for ichannel = 1 : channNum
  37. H = (randn(K, Nt) + j*randn(K, Nt))/sqrt(2);
  38. % ============= ZF preocidng, numerical ================
  39. WtZF = H'*inv(H*H');
  40. WZF = WtZF*inv(sqrt(diag(diag(WtZF'*WtZF)))); % normalized columns
  41. rateZF(isnr) = rateZF(isnr) + CalRate(P/K*eye(K), H, WZF);
  42. % ============ Hybrid, numerical ===============
  43. F = 1/sqrt(Nt)*exp(j.*angle(H))';
  44. Fb = CalBDPrecoder(H*F);% baseband, same as inverse with column normalization
  45. wt = F*Fb;% aggregate precoder
  46. WPR = wt*inv(sqrt(diag(diag(wt'*wt))));
  47. rateHyb(isnr) = rateHyb(isnr) + CalRate((P/K)*eye(K), H, WPR);% ZF-PRP
  48. % ============= Quantized ZF-PR precoding ============
  49. FQPR1 = Quant(B1, F);% analog RF
  50. wt = FQPR1*CalBDPrecoder(H*FQPR1);
  51. WQPR1 = wt*inv(sqrt(diag(diag(wt'*wt))));
  52. rateQHyb1(isnr) = rateQHyb1(isnr) + CalRate((P/K)*eye(K), H, WQPR1);
  53. WtQPR2 = Quant(B2, F);
  54. wt = WtQPR2*CalBDPrecoder(H*WtQPR2);
  55. WQPR2 = wt*inv(sqrt(diag(diag(wt'*wt))));
  56. rateQhyb2(isnr) = rateQhyb2(isnr) + CalRate((P/K)*eye(K), H, WQPR2);
  57. end
  58. isnr
  59. end
  60. rateZF = rateZF/channNum;
  61. rateHyb = rateHyb/channNum;
  62. rateQHyb1 = rateQHyb1/channNum;
  63. rateQhyb2 = rateQhyb2/channNum;
  64. LineWidth = 1.5;
  65. MarkerSize = 6;
  66. figure
  67. plot(SNR, abs(rateZF), 'k-x', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  68. hold on
  69. plot(SNR, abs(rateZFA), 'bo', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize);
  70. hold on
  71. plot(SNR, abs(rateHyb),'r-*', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  72. hold on
  73. plot(SNR, abs(rateHybA), 'gd', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  74. hold on
  75. plot(SNR, abs(rateQHyb1), 'b-^', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  76. hold on
  77. plot(SNR, abs(rateQhyb2), 'b-v', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  78. hold off
  79. legend('FC-ZF, simulation', 'FC-ZF, analytical', ...
  80. 'PZF, simulation', 'PZF, analytical', ...
  81. 'Quantized PZF, B = 1','Quantized PZF, B = 2');
  82. xlabel('SNR (dB)')
  83. ylabel('Spectral Efficiency (bps/Hz)')
  84. title(sprintf('Nt = %d, K = %d', Nt, K))
  85. grid
  86. % saveas(gcf, sprintf('MassiveCompareScheme-Nt%d-K%d', Nt, K));
  87. % saveas(gcf, sprintf('MassiveCompareScheme-Nt%d-K%d-PhaseOfZf', Nt, K));
  88. toc

(8)

  1. % DESCRIPTION
  2. % mmWave massive MU-MIMO under chain limitations, single-antenna UE
  3. % Hybrid precoding with ZF at baseband and Phase Reversal (PR) Preocidng at analog
  4. % Compare full-complexity ZF (FC-ZF), Hybrid, QHybrid, and B-MIMO numerically
  5. tic; clear all; clc
  6. Nt = 128;
  7. K = 4; % UE number
  8. Np = 10; % number of paths per user
  9. B1 = 1; % quantized analog beamforming, up to B bits of precision
  10. B2 = 2;
  11. SNR = -30 : 5 : 0;
  12. nSNR = length(SNR);
  13. channNum = 1e3;
  14. rateZF = zeros(nSNR, 1); % FC-ZF
  15. rateHyb = zeros(nSNR, 1);% W = ZF at baseband, F = PR at analog
  16. rateHybQ1 = zeros(nSNR, 1);% Quantized hybrid precoding
  17. rateHybQ2 = zeros(nSNR, 1);
  18. rateBMIMO = zeros(nSNR, 1);% Multiuser beamspace MIMO precoder (BMIMO)
  19. for isnr = 1 : nSNR
  20. P = 10^(SNR(isnr)/10);
  21. for ichannel = 1 : channNum
  22. [H, Gain, At] = GenChannelSimp(Nt, K, Np, 0.5); % mmWave channel
  23. % H = K x Nt, Gain = Np x K, At = Nt x Np x K
  24. % ============= ZF preocidng, numerical ================
  25. WtZF = H'*inv(H*H');
  26. WZF = WtZF*inv(sqrt(diag(diag(WtZF'*WtZF)))); % normalized columns
  27. rateZF(isnr) = rateZF(isnr) + CalRate(P/K*eye(K), H, WZF);
  28. % ============ Hybrid precoding, numerical ===============
  29. for ik = 1 : K
  30. ph = - phase(H(ik,:));
  31. ph = ph(:);
  32. F(:,ik) =1/sqrt(Nt)* exp(j.*ph); % analog RF preprocessing
  33. end
  34. Fb = CalBDPrecoder(H*F);% digital baseband, same as inverse with column normalization
  35. wt = F*Fb;% aggregated precoder
  36. WPR = wt*inv(sqrt(diag(diag(wt'*wt))));
  37. rateHyb(isnr) = rateHyb(isnr) + CalRate((P/K)*eye(K), H, WPR);% ZF-PRP
  38. % ============= Quantized hybrid precoding ============
  39. FQPR1 = 1/sqrt(Nt) * Quant(B1, F);% analog RF
  40. wt = FQPR1*CalBDPrecoder(H*FQPR1);
  41. WQPR1 = wt*inv(sqrt(diag(diag(wt'*wt))));
  42. rateHybQ1(isnr) = rateHybQ1(isnr) + CalRate((P/K)*eye(K), H, WQPR1);
  43. WtQPR2 = 1/sqrt(Nt) * Quant(B2, F);
  44. wt = WtQPR2*CalBDPrecoder(H*WtQPR2);
  45. WQPR2 = wt*inv(sqrt(diag(diag(wt'*wt))));
  46. rateHybQ2(isnr) = rateHybQ2(isnr) + CalRate((P/K)*eye(K), H, WQPR2);
  47. % =========== Multiuser Beamspace MIMO precoder (B-MIMO) ============== %
  48. D = dftmtx(Nt);
  49. Hf = H*D;
  50. [maxVal, maxInd] = sort(diag(Hf'*Hf), 'descend'); % sort column with decreasing magnitude
  51. FBMIMO = D(:, maxInd(1:K));
  52. FbBMIMO = pinv(H*FBMIMO);
  53. Wt = FBMIMO*FbBMIMO;% analog x baseband precoding
  54. WBMIMO = Wt*inv(sqrt(diag(diag(Wt'*Wt))));
  55. rateBMIMO(isnr) = rateBMIMO(isnr) + CalRate((P/K)*eye(K), H, WBMIMO);
  56. end
  57. isnr
  58. end
  59. rateZF = rateZF/channNum;
  60. rateHyb = rateHyb/channNum;
  61. rateHybQ1 = rateHybQ1/channNum;
  62. rateHybQ2 = rateHybQ2/channNum;
  63. rateBMIMO = rateBMIMO/channNum;
  64. LineWidth = 1.5;
  65. MarkerSize = 6;
  66. figure
  67. plot(SNR, abs(rateZF), 'k-o', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  68. hold on
  69. plot(SNR, abs(rateHyb),'r-*', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  70. hold on
  71. plot(SNR, abs(rateHybQ1), 'b-^', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  72. hold on
  73. plot(SNR, abs(rateHybQ2), 'b-v', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  74. hold on
  75. plot(SNR, abs(rateBMIMO), 'm-s', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
  76. hold off
  77. legend('FC-ZF Precoding', 'Hybrid Precoding', 'Quantized Hybrid Precoding, B = 1',...
  78. 'Quantized Hybrid Precoding, B = 2', 'B-MIMO Preocoding');
  79. xlabel('SNR (dB)')
  80. ylabel('Spectral Efficiency (bps/Hz)')
  81. % title(sprintf('Nt = %d, K = %d, Np = %d',Nt, K, Np))
  82. grid
  83. saveas(gcf, sprintf('MainCompareScheme-Nt%d-K%d-Np%d', Nt, K, Np)); % save current figure to file
  84. toc

四. 运行结果及分析

4.1 天线数8

ZF: Zero Forcing 迫零算法 SNR Signal Noise Ratio 信噪 PZF:Phased-Zero Forcing

 对比三种算法性能:原始ZF算法,PZF算法,量化后的PZF算法。

横向对比:三种算法均满足,随着SNB0增加到30dB,频谱效率从2.166增大到23.75 bps/HZ,符合正常逻辑;

纵向对比:在同一SNR下,性能从最优到最劣,理论ZF值、实际ZF仿真值、理论PZF值、实际PZF仿真值、精度到两位比特的PZF值、精度到1位比特的PZF值;

方案对比:本方案PZF比原始ZF性能略差(相差约0.7bps/Hz),但计算复杂性低得多,更具有实用价值;

量化对比:在PZF方案基础上,进一步约算,取近似比特可进一步形成Quantized PZF. 随着近似比特精度取值从12,频谱效率也会增大(约2.07bps/Hz)。性能降低但计算复杂度会更一步降低,增加应用价值;

4.2 天线数为128

图中B-MIMO 全称为Beamspace MIMO 代表的意义是 波束空间MIMO 

天线数N_t128:

横向对比:当SNR-30增加到0dB,频谱效率整体上从0增加到19.63bps/Hz;

纵向对比:从最优到最劣:原始ZF预编码、本论文的混合预编码、比特近似精度取2的混合预编码、比特精度取1的混合预编码、波束空间MIMO方案;

以牺牲不足1bps/Hz的频谱效率,却能极大降低计算复杂度,降低MIMO对射频硬件的要求;

MATLAB代码运行时间:天线数为4时运行3秒左右,天线数为128时运行50.199667秒;

在信噪比为0dB时,本方案PZF频谱效率为18.35bps/Hz。设定4G基站采用4根天线,平均频谱效率为2.9 bps/Hz。设定5G基站天线数为64,平均频谱效率为10 bps/Hz【数据来源物联网智库》】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/768370
推荐阅读
相关标签
  

闽ICP备14008679号