Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

blkdiagbfweights

MIMO チャネルのブロック対角化の重み

R2020a 以降

説明

[wp,wc] = blkdiagbfweights(chanmat,ns) は、MATLAB® cell 配列 chanmat に含まれているチャネル応答行列から導出されたプリコーディングの重み wp と結合の重み wc を返します。

  • 複数のユーザー チャネルを指定するには、chanmat cell に各チャネルを配置します。chanmat{k} は、送信機からユーザーへの k 番目のチャネルを表します。

    • 単一の周波数の場合は、チャネル cell を行列として指定します。

    • 複数の周波数の場合は、チャネル cell を 3 次元配列として指定します。この配列では、行は異なる "サブキャリア" を表します。

  • チャネルごとに複数のサブチャネルを指定するには、ns 引数を使用します。サブチャネルは異なるデータ ストリームを表します。ns は、ユーザー チャネルごとのサブチャネル数を指定します。データ ストリームにプリコーディングの重み wp を乗算します。

プリコーディングの重みと結合の重みによってチャネルが独立したサブチャネルに対角化され、k 番目のユーザーに対して、行列 wp*chanmat{k}*wc{k} は各 "サブキャリア" の対角になります。

[wp,wc] = blkdiagbfweights(chanmat,ns,pt) は、サブキャリアごとの総送信電力 pt も指定します。

すべて折りたたむ

16 本のアンテナがある等間隔直線アレイ (ULA) で構成される基地局と、それぞれ 8 本および 4 本のアンテナがある受信機 ULA アレイをもつ 2 ユーザーから始めます。ブロック対角化ベースのプリコーディングの重みと結合の重みを使用すると、空間多重化を実現できることを示します。空間多重化を行うと、各ユーザーの受信信号を他方のユーザーから干渉されることなく復号化できます。ユーザーごとに 2 つのデータ ストリームを指定します。

txpos で送信機の位置を指定し、rxpos1 および rxpos2 で 2 ユーザーの受信機の位置を指定します。アレイ素子は、波長の 1/2 の間隔で配置されています。

txpos = (0:15)*0.5;
rxpos1 = (0:7)*0.5;
rxpos2 = (0:3)*0.5;

scatteringchanmtx を使用してチャネル行列の cell 配列を作成し、ビームフォーミングの重み wp および wc を計算します。各チャネルはユーザーに対応します。チャネルに分布点が 10 点あると仮定します。各チャネルには、ベクトル ns で指定された 2 つのサブチャネルがあります。

chanmat = {scatteringchanmtx(txpos,rxpos1,10), ...
    scatteringchanmtx(txpos,rxpos2,10)};
ns = [2 2];
[wp,wc] = blkdiagbfweights(chanmat,ns);

重みにより、各ユーザーのチャネル行列が対角化されます。

チャネル 1:

disp(wp*chanmat{1}*wc{1})
   8.2269 - 0.0000i   0.0000 + 0.0000i
  -0.0000 + 0.0000i   6.1371 - 0.0000i
   0.0000 - 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -0.0000 - 0.0000i

チャネル 2:

disp(wp*chanmat{2}*wc{2})
  -0.0000 - 0.0000i  -0.0000 + 0.0000i
  -0.0000 + 0.0000i  -0.0000 + 0.0000i
   8.7543 + 0.0000i   0.0000 + 0.0000i
  -0.0000 - 0.0000i   4.4372 - 0.0000i

まず、データ ストリームを伝送する 4 つのサブチャネル (チャネルごとに 2 つのサブチャネル) を作成します。各データ ストリームには ±1 のサンプルが 20 個含まれています。入力ストリームをプリコーディングして結合し、復元された信号を生成します。

x = 2*round(rand([20,4])) - 1;
xp = x*wp;
y1 = xp*chanmat{1} + 0.1*randn(20,8);
y2 = xp*chanmat{2} + 0.1*randn(20,4);
y = [y1*wc{1},y2*wc{2}];

入力信号と復元された信号のステム プロットを重ね合わせると、受信ユーザー信号が送信信号と同じであることがわかります。

for m = 1:4
    subplot(4,1,m)
    s = stem([x(:,m) 2*((real(y(:,m)) > 0) - 0.5)]);
    s(1).LineWidth = 2;
    s(2).MarkerEdgeColor = 'none';
    s(2).MarkerFaceColor = 'r';
    ylabel('Signal')
    title(sprintf('User %d Stream %d',ceil(m/2),rem(m-1,2) + 1))
    if m==1
        legend('Input','Recovered','Location','best')
    end
end
xlabel('Samples')

Figure contains 4 axes objects. Axes object 1 with title User 1 Stream 1, ylabel Signal contains 2 objects of type stem. These objects represent Input, Recovered. Axes object 2 with title User 1 Stream 2, ylabel Signal contains 2 objects of type stem. Axes object 3 with title User 2 Stream 1, ylabel Signal contains 2 objects of type stem. Axes object 4 with title User 2 Stream 2, xlabel Samples, ylabel Signal contains 2 objects of type stem.

16 本のアンテナがある等間隔直線アレイ (ULA) で構成される基地局と、それぞれ 8 本および 5 本のアンテナがある受信機 ULA アレイをもつ 2 ユーザーから始めます。チャネル行列の 3 次元配列を使用して 2 つのサブキャリアを処理する方法を示します。これにより、最初のユーザーのチャネル行列は 2×16×8 の形式になり、2 番目のユーザーのチャネル行列は 2×16×5 の形式になります。また、ユーザーごとに 2 つのデータ ストリームがあると仮定します。

txpos で送信機の位置を指定し、rxpos1 および rxpos2 で 2 ユーザーの受信機の位置を指定します。アレイ素子は、波長の 1/2 の間隔で配置されています。

nr1 = 8;
nr2 = 5;
txpos = (0:15)*0.5;
rxpos1 = (0:(nr1-1))*0.5;
rxpos2 = (0:(nr2-1))*0.5;

scatteringchanmtx を使用してチャネル行列を作成し、cell 配列に配置します。各受信機の 2 番目のサブチャネルを作成するには、各チャネル行列を複製します。チャネル行列の計算時に分布点が 10 点あると仮定します。

smtmp1 = scatteringchanmtx(txpos,rxpos1,10);
smtmp2 = scatteringchanmtx(txpos,rxpos2,10);
sm1 = zeros(2,16,8);
sm2 = zeros(2,16,5);
sm1(1,:,:) = smtmp1;
sm1(2,:,:) = smtmp1;
sm2(1,:,:) = smtmp2;
sm2(2,:,:) = smtmp2;
chanmat = {sm1,sm2};

ユーザーごとに 2 つのデータ ストリームがあると指定します。

ns = [2 2];

各サブキャリアの送信電力を指定します。

pt = [1.0 1.5];

ビームフォーミングの重みを計算します。

[wp,wc] = blkdiagbfweights(chanmat,ns,pt);

最初のサブキャリアに対してチャネルが対角化されることがわかります。

ksubcr = 1;
wpx = squeeze(wp(ksubcr,:,:));
chanmat1 = squeeze(chanmat{1}(ksubcr,:,:));
chanmat2 = squeeze(chanmat{2}(ksubcr,:,:));
wc1 = squeeze(wc{1}(ksubcr,:,:));
wc2 = squeeze(wc{2}(ksubcr,:,:));
wpx*chanmat1*wc1
ans = 4×2 complex

   8.2104 + 0.0000i  -0.0000 - 0.0000i
  -0.0000 + 0.0000i   5.9732 + 0.0000i
  -0.0000 + 0.0000i   0.0000 + 0.0000i
  -0.0000 - 0.0000i   0.0000 + 0.0000i

wpx*chanmat2*wc2
ans = 4×2 complex

   0.0000 - 0.0000i  -0.0000 - 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i
   8.8122 - 0.0000i  -0.0000 - 0.0000i
  -0.0000 + 0.0000i   4.8186 + 0.0000i

各ユーザーに信号を伝播して復号化します。-1 と +1 を含み、ユーザーごとに 2 列をもつ、ランダム データの 4 つのストリームを生成します。各ストリームはサブチャネルです。

x = 2*(round(rand([20 4]))) - 1;

データ ストリームをプリコーディングします。

xp = x*wpx;
y1 = xp*chanmat1 + 0.1*randn(20,8);
y2 = xp*chanmat2 + 0.1*randn(20,5);

データ ストリームを復号化します。

y = [y1*wc1,y2*wc2];

入力信号と復元された信号のステム プロットを重ね合わせると、受信ユーザー信号が送信信号と同じであることがわかります。

for m = 1:4
    subplot(4,1,m)
    s = stem([x(:,m) 2*((real(y(:,m)) > 0) - 0.5)]);
    s(1).LineWidth = 2;
    s(2).MarkerEdgeColor = 'none';
    s(2).MarkerFaceColor = 'r';
    ylabel('Signal')
    title(sprintf('User %d Stream %d',ceil(m/2),rem(m-1,2) + 1))
    if m==1
        legend('Input','Recovered','Location','best')
    end
end
xlabel('Samples')

Figure contains 4 axes objects. Axes object 1 with title User 1 Stream 1, ylabel Signal contains 2 objects of type stem. These objects represent Input, Recovered. Axes object 2 with title User 1 Stream 2, ylabel Signal contains 2 objects of type stem. Axes object 3 with title User 2 Stream 1, ylabel Signal contains 2 objects of type stem. Axes object 4 with title User 2 Stream 2, xlabel Samples, ylabel Signal contains 2 objects of type stem.

入力引数

すべて折りたたむ

チャネル応答行列。Nu 要素 cell 配列として指定します。Nu は受信アレイの数です。各 cell は個別のチャネルに対応し、チャネル応答行列または 3 次元 MATLAB 配列を含みます。cell 配列には、すべての行列またはすべての配列のいずれかを含めなければなりません。行列の場合は、すべての行列の行数が同じでなければなりません。3 次元配列の場合は、行数と列数が同じでなければなりません。

  • k 番目の cell が行列の場合、この行列のサイズは Nt 行 Nr(k) 列です。Nt は送信アレイの素子数で、Nr(k) は k 番目の受信アレイの素子数です。

  • k 番目の cell が配列の場合、この配列のサイズは L x Nt x Nr(k) です。L はサブキャリアの数です。Nt は送信アレイの素子数で、Nr(k) は k 番目の受信アレイの素子数です。

データ型: double
複素数のサポート: あり

受信アレイごとのデータ ストリーム数。正の整数の Nu 要素の行ベクトルとして指定します。Nu は受信アレイの数です。

データ型: double

サブキャリアごとの総送信電力。正のスカラーまたは正の値の L 要素ベクトルとして指定します。L はサブキャリアの数です。pt がスカラーの場合は、すべてのサブキャリアの送信電力が同じになります。pt がベクトルの場合は、各ベクトル要素が対応するサブキャリアの送信電力を指定します。電力は線形単位です。

データ型: double

出力引数

すべて折りたたむ

プリコーディングの重み。複素数値の Nst 行 Nt 列の行列または複素数値の L x Nst x Nt の MATLAB 配列として返されます。

  • chanmat に行列が含まれている場合、wp は複素数値の Nst 行 Nt 列の行列です。ここで、Nst はデータ チャネルの総数 (sum(ns)) です。

  • chanmat に 3 次元の MATLAB 配列が含まれている場合、wp は複素数値の L x Nst x Nt の MATLAB 配列です。ここで、Nst はデータ チャネルの総数 (sum(ns)) です。

単位は無次元です。

データ型: double
複素数のサポート: あり

結合の重み。Nu 要素 cell 配列として返されます。単位は無次元です。

  • chanmat に行列が含まれている場合、wc の k 番目の cell には複素数値の Nr(k) 行 Ns(k) 列の行列が含まれます。Ns(k) は、k 番目の受信アレイの引数 ns の値です。

  • chanmat に 3 次元の MATLAB 配列が含まれている場合、wc の k 番目の cell には複素数値の L x Nr(k) x Ns(k) の MATLAB 配列が含まれます。Ns(k) は、ns ベクトルの k 番目のエントリの値です。

データ型: double
複素数のサポート: あり

参照

[1] Heath, Robert W., et al. “An Overview of Signal Processing Techniques for Millimeter Wave MIMO Systems.” IEEE Journal of Selected Topics in Signal Processing, vol. 10, no. 3, Apr. 2016, pp. 436–53. DOI.org (Crossref), doi:10.1109/JSTSP.2016.2523924. Bibliography

[2] Tse, D. and P. Viswanath, Fundamentals of Wireless Communications, Cambridge: Cambridge University Press, 2005.

[3] Paulraj, A. Introduction to Space-Time Wireless Communications, Cambridge: Cambridge University Press, 2003.

[4] Spencer, Q.H., et al. "Zero-Forcing Methods for Downlink Spatial Multiplexing in Multiuser MIMO Channels." IEEE Transactions on Signal Processing, Vol. 52, No. 2, February 2004, pp. 461-471. DOI.org (Crossref), doi:10.1109/TSP.2003.821107.

拡張機能

バージョン履歴

R2020a で導入

参考

オブジェクト