antenna: Extend UniformPlanarArray to have a configurable polarization slant angle

see MR !674
This commit is contained in:
Sandra Lagen
2021-07-15 18:25:38 +02:00
parent 8bf71f305e
commit a4598e8236
5 changed files with 24 additions and 15 deletions

View File

@@ -148,7 +148,7 @@ Derived classes must implement the following functions:
* GetNumberOfElements: returns the number of antenna elements
* GetElementLocation: returns the location of the antenna element with the specified index, normalized with respect to the wavelength
* GetElementFieldPattern: returns the horizontal and vertical components of the antenna element field pattern at the specified direction. Only vertical polarization is considered.
* GetElementFieldPattern: returns the horizontal and vertical components of the antenna element field pattern at the specified direction. Same polarization (configurable) for all antenna elements of the array is considered.
The class PhasedArrayModel also assumes that all antenna elements are equal, a typical key assumption which allows to model the PAA field pattern as the sum of the array factor, given by the geometry of the location of the antenna elements, and the element field pattern.
Any class derived from AntennaModel is a valid antenna element for the PhasedArrayModel, allowing for a great flexibility of the framework.
@@ -172,7 +172,8 @@ through the attributes "NumRows" and "NumColumns", while the spacing between the
and vertical elements can be configured through the attributes "AntennaHorizontalSpacing"
and "AntennaVerticalSpacing".
Note: vertical polarization is assumed for each antenna element, as described in [38901]_ (i.e., :math:`{\zeta = 0}`).
The polarization of each antenna element in the array is determined by the polarization
slant angle through the attribute "PolSlantAngle", as described in [38901]_ (i.e., :math:`{\zeta}`).
.. [Balanis] C.A. Balanis, "Antenna Theory - Analysis and Design", Wiley, 2nd Ed.

View File

@@ -55,7 +55,7 @@ public:
/**
* Returns the horizontal and vertical components of the antenna element field
* pattern at the specified direction. Only vertical polarization is considered.
* pattern at the specified direction. Single polarization is considered.
* \param a the angle indicating the interested direction
* \return a pair in which the first element is the horizontal component
* of the field pattern and the second element is the vertical

View File

@@ -38,7 +38,8 @@ UniformPlanarArray::UniformPlanarArray ()
m_disV {0.5},
m_disH {0.5},
m_alpha {0},
m_beta {0}
m_beta {0},
m_polSlant {0.0}
{}
UniformPlanarArray::~UniformPlanarArray ()
@@ -85,6 +86,11 @@ UniformPlanarArray::GetTypeId (void)
DoubleValue (0.0),
MakeDoubleAccessor (&UniformPlanarArray::m_beta),
MakeDoubleChecker<double> (-M_PI, M_PI))
.AddAttribute ("PolSlantAngle",
"The polarization slant angle in radians",
DoubleValue (0.0),
MakeDoubleAccessor (&UniformPlanarArray::m_polSlant),
MakeDoubleChecker<double> (-M_PI, M_PI))
;
return tid;
}
@@ -182,12 +188,13 @@ UniformPlanarArray::GetElementFieldPattern (Angles a) const
Angles aPrime (phiPrime, thetaPrime);
NS_LOG_DEBUG (a << " -> " << aPrime);
// compute the antenna element field pattern in the vertical polarization using
// eq. 7.3-4 in 3GPP TR 38.901
// NOTE we assume vertical polarization, hence the field pattern in the
// horizontal polarization is 0
// compute the antenna element field patterns using eq. 7.3-4 and 7.3-5 in 3GPP TR 38.901,
// using the configured polarization slant angle (m_polSlant)
// NOTE: the slant angle (assumed to be 0) differs from the polarization slant angle
// (m_polSlant, given by the attribute), in 3GPP TR 38.901
double aPrimeDb = m_antennaElement->GetGainDb (aPrime);
double fieldThetaPrime = pow (10, aPrimeDb / 20); // convert to linear magnitude
double fieldThetaPrime = pow (10, aPrimeDb / 20) * cos (m_polSlant); // convert to linear magnitude
double fieldPhiPrime = pow (10, aPrimeDb / 20) * sin (m_polSlant); // convert to linear magnitude
// compute psi using eq. 7.1-15 in 3GPP TR 38.901, assuming that the slant
// angle (gamma) is 0
@@ -196,8 +203,8 @@ UniformPlanarArray::GetElementFieldPattern (Angles a) const
// convert the antenna element field pattern to GCS using eq. 7.1-11
// in 3GPP TR 38.901
double fieldTheta = cos (psi) * fieldThetaPrime;
double fieldPhi = sin (psi) * fieldThetaPrime;
double fieldTheta = cos (psi) * fieldThetaPrime - sin (psi) * fieldPhiPrime;
double fieldPhi = sin (psi) * fieldThetaPrime + cos (psi) * fieldPhiPrime;
NS_LOG_DEBUG (RadiansToDegrees (a.GetAzimuth ()) << " " << RadiansToDegrees (a.GetInclination ()) << " " << fieldTheta * fieldTheta + fieldPhi * fieldPhi);
return std::make_pair (fieldPhi, fieldTheta);

View File

@@ -33,7 +33,7 @@ namespace ns3 {
* \brief Class implementing Uniform Planar Array (UPA) model.
*
* \note the current implementation supports the modeling of antenna arrays
* composed of a single panel and with single (vertical) polarization.
* composed of a single panel and with single (configured) polarization.
*/
class UniformPlanarArray : public PhasedArrayModel
{
@@ -56,7 +56,7 @@ public:
/**
* Returns the horizontal and vertical components of the antenna element field
* pattern at the specified direction. Only vertical polarization is considered.
* pattern at the specified direction. Single polarization is considered.
* \param a the angle indicating the interested direction
* \return a pair in which the first element is the horizontal component
* of the field pattern and the second element is the vertical
@@ -158,7 +158,7 @@ private:
double m_disH; //!< antenna spacing in the horizontal direction in multiples of wave length
double m_alpha; //!< the bearing angle in radians
double m_beta; //!< the downtilt angle in radians
double m_polSlant; //!< the polarization slant angle in radians
};
} /* namespace ns3 */

View File

@@ -1551,7 +1551,8 @@ ThreeGppChannelModel::GetNewChannel (Vector locUT, Ptr<const ChannelCondition> c
for (uint8_t nIndex = 0; nIndex < numReducedCluster; nIndex++)
{
//Compute the N-2 weakest cluster, only vertical polarization. (7.5-22)
//Compute the N-2 weakest cluster, assuming 0 slant angle and a
//polarization slant angle configured in the array (7.5-22)
if (nIndex != cluster1st && nIndex != cluster2nd)
{
std::complex<double> rays (0,0);