Main Content

diagbfweights

Diagonalize MIMO channel

Description

[wp,wc] = diagbfweights(chanmat) returns precoding weights, wp, and combining weights, wc, for the channel response matrix, chanmat. Together, these weights diagonalize the channel into subchannels so that the matrix wp*chanmat*wc is diagonal.

example

[wp,wc,P] = diagbfweights(chanmat) also returns the distributed power, P, for each element of the transmitting array.

example

[wp,wc,P,G] = diagbfweights(chanmat) also returns the subcarrier gains, G.

example

[wp,wc,P,G,C] = diagbfweights(chanmat) also returns the channel capacity sum, C.

example

[___] = diagbfweights(chanmat,Pt) also specifies total transmit power, Pt, and returned values any of the previous output argument combinations.

example

[___] = diagbfweights(chanmat,Pt, Pn) also specifies the noise power per transmitting antenna, Pn.

example

[___] = diagbfweights(chanmat,Pt, Pn,powdistoption) also specifies the noise distribution, powdistoption, across all transmitting antennas.

example

Examples

collapse all

Compute the channel matrix for a 4-by-4 transmitting URA array and a 5-by-5 receiving URA array. Assume that three scatterers are randomly located within a specified angular range. The element spacing for both arrays is one-half wavelength. The receive array is 500 wavelengths away from the transmitting array along the x-axis. Constrain the angular span for the transmitting and receiving arrays. Diagonalize the channel matrix to compute the precoding and combining weights.

Specify the 4-by-4 transmitting array. Element spacing is in units of wavelength.

Nt = 4;
sp = 0.5;
ygridtx = (0:Nt-1)*sp - (Nt-1)/2*sp;
zgridtx = (0:Nt-1)*sp - (Nt-1)/2*sp;
[ytx,ztx] = meshgrid(ygridtx,zgridtx);
txpos = [zeros(1,Nt*Nt);ytx(:).';ztx(:).'];

Specify the 5-by-5 receiving array. Element spacing is in units of wavelength.

Nr = 5;
sp = 0.5;
ygridrx = (0:Nr-1)*sp - (Nr-1)/2*sp;
zgridrx = (0:Nr-1)*sp - (Nr-1)/2*sp;
[yrx,zrx] = meshgrid(ygridrx,zgridrx);
rxpos = [500*ones(1,Nr*Nr);yrx(:).';zrx(:).'];

Set the angular limits for transmitting and receiving.

  • The azimuth angle limits for the transmitter are −45° to +45°.

  • The azimuth angle limits for the receiver are −75° to +50°.

  • The elevation angle limits for the transmitter are −12° to +12°.

  • The elevation angle limits for the receiver are −30° to +30°.

angrange = [-45 45 -75 50; -12 12 -30 30];

Specify three scatterers and create the channel matrix.

numscat = 3;
chmat = scatteringchanmtx(txpos,rxpos,numscat,angrange);

Diagonalize the channel matrix.

[wp,wc] = diagbfweights(chmat);
z = wp*chmat*wc;

Show the first four diagonal elements.

z(1:4,1:4)
ans = 4×4 complex

  23.3713 - 0.0000i  -0.0000 - 0.0000i  -0.0000 + 0.0000i  -0.0000 + 0.0000i
   0.0000 - 0.0000i  10.7803 + 0.0000i  -0.0000 + 0.0000i   0.0000 + 0.0000i
  -0.0000 - 0.0000i  -0.0000 + 0.0000i   1.0566 + 0.0000i  -0.0000 - 0.0000i
  -0.0000 - 0.0000i   0.0000 + 0.0000i   0.0000 - 0.0000i   0.0000 + 0.0000i

Compute the channel matrix for a 4-by-4 transmitting URA array and a 5-by-5 receiving URA array. Assume that three scatterers are randomly located within a specified angular range. The element spacings for both arrays is one-half wavelength. The receive array is 500 wavelengths away along the x-axis. Diagonalize the channel matrix to compute the precoding and combining weights and the distributed power.

Specify the 4-by-4 transmitting array. Element spacing is in units of wavelength.

Nt = 4;
sp = 0.5;
ygridtx = (0:Nt-1)*sp - (Nt-1)/2*sp;
zgridtx = (0:Nt-1)*sp - (Nt-1)/2*sp;
[ytx,ztx] = meshgrid(ygridtx,zgridtx);
txpos = [zeros(1,Nt*Nt);ytx(:).';ztx(:).'];

Specify the 5-by-5 receiving array. Element spacing is in units of wavelength.

Nr = 5;
sp = 0.5;
ygridrx = (0:Nr-1)*sp - (Nr-1)/2*sp;
zgridrx = (0:Nr-1)*sp - (Nr-1)/2*sp;
[yrx,zrx] = meshgrid(ygridrx,zgridrx);
rxpos = [500*ones(1,Nr*Nr);yrx(:).';zrx(:).'];

Set the angular limits for transmitting and receiving.

  • The azimuth angle limits for the transmitter are −45° to +45°.

  • The azimuth angle limits for the receiver are −75° to +50°.

  • The elevation angle limits for the transmitter are −12° to +12°.

  • The elevation angle limits for the receiver are −30° to +30°.

angrange = [-45 45 -75 50; -12 12 -30 30];

Specify three scatterers and create the channel matrix.

numscat = 3;
chmat = scatteringchanmtx(txpos,rxpos,numscat,angrange);

Diagonalize the channel matrix and return the distributed power.

[wp,wc,P] = diagbfweights(chmat);
disp(P.')
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625
    0.0625

Compute the channel matrix for an 11-element transmitting ULA array and a 7-element receiving ULA array. Assume that there are five randomly located scatterers. The element spacings for both arrays is one-half wavelength. The receive array is 500 wavelengths away from the transmit array along the x-axis. Diagonalize the channel matrix to compute the precoding and combining weights, the distributed power, and the subchannel gains.

Specify the 11-element transmitting ULA array. Element spacing is in units of wavelength.

Nt = 11;
sp = 0.5;
txpos = (0:Nt-1)*sp - (Nt-1)/2*sp;

Specify the 7-element receiving ULA array. Element spacing is in units of wavelength.

Nr = 7;
sp = 0.5;
rxpos = (0:Nr-1)*sp - (Nr-1)/2*sp;
numscat = 5;
chmat = scatteringchanmtx(txpos,rxpos,numscat);

Diagonalize the channel matrix and return the subchannel gains.

[wp,wc,P,G] = diagbfweights(chmat);
disp(G.')
  221.8345
   56.8443
   47.6711
    0.8143
    0.0000
    0.0000
    0.0000

Compute the channel matrix for an 11-element transmitting ULA array and a 7-element receiving ULA array. Assume that there are five randomly located scatterers. The element spacings for both arrays is one-half wavelength. The receive array is 500 wavelengths away from the transmitting array along the x-axis. Create a channel matrix with two subcarriers. Diagonalize the channel matrix to compute the precoding and combining weights, the distributed power, the subchannel gains, and the channel capacity sum.

Specify the 11-element transmitting ULA array. Element spacing is in units of wavelength.

Nt = 11;
sp = 0.5;
txpos = (0:Nt-1)*sp - (Nt-1)/2*sp;

Specify the 7-element receiving ULA array. Element spacing is in units of wavelength.

Nr = 7;
sp = 0.5;
rxpos = (0:Nr-1)*sp - (Nr-1)/2*sp;
numscat = 5;

Create two subcarriers.

chmat1 = scatteringchanmtx(txpos,rxpos,numscat);
chmat2 = scatteringchanmtx(txpos,rxpos,numscat);
chmat(1,:,:) = chmat1;
chmat(2,:,:) = chmat2;

Diagonalize the channel matrix and return the subchannel gains.

[wp,wc,P,G,C] = diagbfweights(chmat);
disp(C.')
    9.5466    9.3605

Compute the channel matrix for an 11-element transmitting ULA array and a 7-element receiving ULA array. Specify the total transmitted power at 1000. Assume that there are five randomly located scatterers. The element spacings for both arrays is one-half wavelength. The receive array is 500 wavelengths away from the transmitting array along the x-axis. Create a channel matrix with two subcarriers. Diagonalize the channel matrix to compute the precoding and combining weights, the distributed power, the subchannel gains, and the channel capacity sum.

Specify the 11-element transmitting ULA array. Element spacing is in units of wavelength.

Nt = 11;
sp = 0.5;
txpos = (0:Nt-1)*sp - (Nt-1)/2*sp;

Specify the 7-element receiving ULA array. Element spacing is in units of wavelength.

Nr = 7;
sp = 0.5;
rxpos = (0:Nr-1)*sp - (Nr-1)/2*sp;
numscat = 5;

Create two subcarriers.

chmat1 = scatteringchanmtx(txpos,rxpos,numscat);
chmat2 = scatteringchanmtx(txpos,rxpos,numscat);
chmat(1,:,:) = chmat1;
chmat(2,:,:) = chmat2;

Diagonalize the channel matrix and return the distributed power for both subcarriers.

Pt = 1000.0;
[wp,wc,P,G,C] = diagbfweights(chmat,Pt);
disp(P.')
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091
   90.9091   90.9091

Compute the channel matrix for an 11-element transmitting ULA array and a 7-element receiving ULA array. Specify the total transmitted power at 1000 and the transmitting antenna noise power at 100. Assume that there are five randomly located scatterers. The element spacings for both arrays is one-half wavelength. The receive array is 500 wavelengths away from the transmit array along the x-axis. Create a channel matrix with two subcarriers. Diagonalize the channel matrix to compute the precoding and combining weights, the distributed power, subchannel gains, and channel capacity sum.

Specify the 11-element transmitting ULA array. Element spacing is in units of wavelength.

Nt = 11;
sp = 0.5;
txpos = (0:Nt-1)*sp - (Nt-1)/2*sp;

Specify the 7-element receiving ULA array. Element spacing is in units of wavelength.

Nr = 7;
sp = 0.5;
rxpos = (0:Nr-1)*sp - (Nr-1)/2*sp;
numscat = 5;

Create two subcarriers.

chmat1 = scatteringchanmtx(txpos,rxpos,numscat);
chmat2 = scatteringchanmtx(txpos,rxpos,numscat);
chmat(1,:,:) = chmat1;
chmat(2,:,:) = chmat2;

Diagonalize the channel matrix and return the gain for both subcarriers.

Pt = 1000.0;
Pn = 100.0;
[wp,wc,P,G,C] = diagbfweights(chmat,Pt,Pn);
disp(G.')
  221.8345  119.7549
   56.8443  115.9814
   47.6711   24.9780
    0.8143    5.1025
    0.0000    0.0059
    0.0000    0.0000
    0.0000    0.0000

Compute the channel matrix for an 11-element transmitting ULA array and a 7-element receiving ULA array. Specify the total transmitted power at 1000 and the transmitting antenna noise power at 100. Specify the transmitted power distribution as 'Waterfill'. Assume that there are five randomly located scatterers. The element spacing for both arrays is one-half wavelength. The receive array is 500 wavelengths away from the transmitting array along the x-axis. Create a channel matrix with two subcarriers. Diagonalize the channel matrix to compute the precoding and combining weights, the distributed power, the subchannel gains, and the channel capacity sum.

Specify the 11-element transmitting ULA array. Element spacing is in units of wavelength.

Nt = 11;
sp = 0.5;
txpos = (0:Nt-1)*sp - (Nt-1)/2*sp;

Specify the 7-element receiving ULA array. Element spacing is in units of wavelength.

Nr = 7;
sp = 0.5;
rxpos = (0:Nr-1)*sp - (Nr-1)/2*sp;
numscat = 5;

Create two subcarriers.

chmat1 = scatteringchanmtx(txpos,rxpos,numscat);
chmat2 = scatteringchanmtx(txpos,rxpos,numscat);
chmat(1,:,:) = chmat1;
chmat(2,:,:) = chmat2;

Diagonalize the channel matrix and return the gain for both subcarriers.

Pt = 1000.0;
Pn = 100.0;
[wp,wc,P,G,C] = diagbfweights(chmat,Pt,Pn,'Waterfill');
disp(G.')
  221.8345  119.7549
   56.8443  115.9814
   47.6711   24.9780
    0.8143    5.1025
    0.0000    0.0059
    0.0000    0.0000
    0.0000    0.0000

Input Arguments

collapse all

Channel response matrix, specified as an Nt-by-Nr complex-valued matrix or an L-by-Nt-by-Nr complex-valued MATLAB array.

  • Nt is the number of elements in the transmitting array.

  • Nr is the number of elements in the receiving array.

  • L is the number of subcarriers.

When chanmat is a MATLAB array containing subcarriers, each subcarrier is decomposed independently into subchannels.

Data Types: double | single
Complex Number Support: Yes

Total transmit power, specified as a positive scalar or an L-element vector of positive values. Pt has the same units as the total distributed power, P.

Data Types: double | single

Noise power in each receiving antenna, specified as a positive scalar. Pn has the same units as the total transmit power, Pt.

Data Types: double | single

Power distribution option, specified as 'Uniform' or 'Waterfill'. When powdistoption is 'Uniform', the transmit power is evenly distributed across all Nt channels. If powdistoption is 'Waterfill', the transmit power is distributed across the Nt channels using a waterfill algorithm.

Data Types: char

Output Arguments

collapse all

Precoding weights, returned as an Nt-by-Nt complex-valued matrix or an L-by-Nt-by-Nt complex-valued MATLAB array. Units are dimensionless.

Data Types: double | single
Complex Number Support: Yes

Combining weights, returned as an Nr-by-Nr complex-valued matrix or an L-by-Nr-by-Nr complex-valued MATLAB array. Units are dimensionless.

Data Types: double | single
Complex Number Support: Yes

Distributed power, returned as a vector or matrix.

  • When chanmat is an Nt-by-Nr real-valued matrix, P is a 1-by-Nt real-valued row vector.

  • When chanmat is an L-by-Nt-by-Nr real-valued MATLAB array, P is an L-by-Nt real-valued matrix.

Power units are linear.

Data Types: double | single

Subchannel gains, returned as a vector or matrix.

  • When chanmat is an Nt-by-Nr complex-valued matrix, G is a 1-by-Ng complex-valued row vector.

  • When chanmat is an L-by-Nt-by-Nr complex-valued MATLAB array, G is an L-by-Ng complex-valued matrix.

Ng is the smaller of Nt and Nr.

Gain units are linear.

Data Types: double | single
Complex Number Support: Yes

Channel capacity sum for each subcarrier, returned as a scalar or vector.

  • When chanmat is an Nt-by-Nr complex-valued matrix, C is a scalar.

  • When chanmat is an L-by-Nt-by-Nr complex-valued MATLAB array, C is an L-by-1 vector.

Capacity units are in bps/Hz.

Data Types: double | single
Complex Number Support: Yes

References

[1] Heath, R. Jr. et al. “An Overview of Signal Processing Techniques for Millimeter Wave MIMO Systems”, arXiv.org:1512.03007 [cs.IT], 2015.

[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.

Extended Capabilities

Version History

Introduced in R2017a