Documentation

# diagbfweights

Diagonalize MIMO channel

## Syntax

``````[wp,wc] = diagbfweights(chanmat)``````
``````[wp,wc,P] = diagbfweights(chanmat)``````
``````[wp,wc,P,G] = diagbfweights(chanmat)``````
``````[wp,wc,P,G,C] = diagbfweights(chanmat)``````
``[___] = diagbfweights(chanmat,Pt)``
``[___] = diagbfweights(chanmat,Pt Pn)``
``[___] = diagbfweights(chanmat,Pt Pn,powdistoption)``

## Description

example

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

## 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 located within a specified angular range. 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. 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`
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`

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`

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`
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`
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`

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`
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`
Complex Number Support: Yes

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

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

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