Main Content

jsdmbbweights

Create MU-MIMO baseband precoding weights

Since R2023a

    Description

    wpbb = jsdmbbweights(chaneff,ns,wprf) returns baseband precoding weights, wpbb, for the effective channel, chaneff, to achieve orthogonality among users by Joint Spatial Division Multiplexing (JSDM). RF precoding weights, wprf, divide users into groups by their location information. ns is the number of data streams or users.

    example

    wpbb = jsdmbbweights(___,'RegularizationFactor',alpha) specifies the regularization factor, alpha.

    [wpbb,wc] = jsdmbbweights(___) also returns combining weights wc for each user.

    Examples

    collapse all

    Find baseband precoding weights for a JSDM beamformer based on a base station with a 64-element linear antenna array. Assume there are two user groups. The first group has two users and the second group has three users. Array elements are 1/2 wavelength apart.

    Set the number of array elements to 64.

    Nt = 64;

    Find the array steering weights in the direction of the first user group. The user group is centered at +10azimuth.

    v1 = steervec((0:Nt-1)*0.5,[9 11]);
    rc1 = v1*v1'; 

    Find the array steering weights in the direction of the second user group. The user group is centered -5azimuth.

    v2 = steervec((0:Nt-1)*0.5,[-4 -5 -6]);
    rc2 = v2*v2';

    Then, compute the RF weights from the channel covariance matrix.

    ns = [2 3];
    hcov = {rc1,rc2};
    wprf = jsdmrfweights(hcov,ns);

    Construct the instantaneous effective channel.

    heff1 = wprf{1}*v1*eye(ns(1))*randn(ns(1),ns(1),'like',1i);
    heff2 = wprf{2}*v2*eye(ns(2))*randn(ns(2),ns(2),'like',1i);

    Compute baseband weights using per-group-processing.

    [wpbb,wc] = jsdmbbweights({heff1,heff2},ns,wprf);

    Verify orthogonality.

    hortho1 = wpbb{1}*heff1*wc{1}
    hortho1 = 2×2 complex
    
       9.5489 + 0.0000i  -0.0000 + 0.0000i
      -0.0000 + 0.0000i   9.5489 + 0.0000i
    
    
    hortho2 = wpbb{2}*heff2*wc{2}
    hortho2 = 3×3 complex
    
       2.8633 - 0.0000i   0.0000 - 0.0000i   0.0000 + 0.0000i
      -0.0000 + 0.0000i   2.8633 + 0.0000i  -0.0000 - 0.0000i
       0.0000 - 0.0000i  -0.0000 - 0.0000i   2.8633 - 0.0000i
    
    

    Input Arguments

    collapse all

    Effective downlink channels, specified as a complex-valued Nsc-by-TotalNrtf-by-TotalNs array or 1-by-G cell array. The effective downlink channels map the streams in each group to the G user groups.

    • If chaneff is a 3-dimensional Nsc-by-TotalNtrf-by-TotalNs array, TotalNs is the total number of data streams, TotalNtrf is the sum of RF chains for all user groups, and Nsc is the number of subcarriers. This configuration corresponds to the joint group processing (JGP) scheme of JSDM.

    • If chaneff is a 1-by-G cell array, then the gth element in the cell array contains the individual effective channel from the allocated RF chain at the base station to the corresponding group of users as either:

      • an Nsc-by-Ntrf(g)-by-NS(g) array when ns is a vector, or

      • an Nsc-by-Ntrf(g)-by-sum(NS{g}) array when ns is a cell array.

      This configuration corresponds to the per group processing (PGP) scheme of JSDM.

    Data Types: double | single | cell
    Complex Number Support: Yes

    Number of data streams, specified as a G-element row vector or a 1-by-G cell array.

    • If ns is a vector, each element specifies the total number of data streams in the corresponding user group.

    • If ns is a cell array, each element in the cell array is a Kg-element row vector where Kg is the number of users in the gth group. The elements in the Kg-element row vector specifies the number of receiving data streams for each user in that group.

    Data Types: double | single | cell

    RF precoding weights, specified as an 1-by-G cell array. The gth element in wprf is an Ntrf(g)-by-Nt matrix that maps Ntrf(g) RF chain to Nt antennas in the base station. Ntrf(g) is the number of RF chains dedicated to the gth group.

    Data Types: double | single | cell
    Complex Number Support: Yes

    Regularization factor, specified as a nonnegative scalar. Units are dimensionless.

    Data Types: double | single

    Output Arguments

    collapse all

    Baseband precoding weights, returned as a complex-valued Nsc-by-TotalNS-by-TotalNtrf array or 1-by-G cell array.

    • If chaneff is not a cell array, wpbb is an Nsc-by-TotalNS-by-TotalNtrf array.

    • If chaneff is a cell array, then wpbb is a 1-by-G cell array whose gth element is either an Nsc-by-Ns(g)-by-Ntrf(g) array when ns is a vector or an Nsc-by-sum(NS{g})-by-Ntrf(g) array when ns is a cell array.

    .

    Recombining weights for each user, returned as a 1-by-G cell array. The structure of wc depends on the ns input argument.

    • If ns is a vector, each cell in wc is an Nsc-by-NS(g)-by-NS(g) array.

    • If ns is a cell array, then wc(g) is a 1-by-Kg cell array where Kg is the number of users in the gth user group. Within the Kg-element cell array, each entry is an Nsc-by-sum(Ns{g})-by-Ns{g}(k) array where Ns{g}(k) is the number of data streams for the kth user in the gth user group.

    Algorithms

    collapse all

    Precision

    This function supports single and double precision floating point values for input arguments. If the input arguments are single precision, the outputs are single precision. If the input arguments are double precision, the outputs are double precision.

    References

    [1] Adhikary A., J. Nam, J-Y Ahn, and G. Caire. "Joint Spatial Division and Multiplexing - The Large-Scale Array Regime." IEEE Transactions on Information Theory, Vol. 59, No. 10, October 2013, pp. 6441-6463.

    Extended Capabilities

    C/C++ Code Generation
    Generate C and C++ code using MATLAB® Coder™.

    Version History

    Introduced in R2023a