A Discrete-Event Network Simulator
API
phased-array-model.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 University of Padova, Dep. of Information Engineering, SIGNET lab.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  */
17 
18 #ifndef PHASED_ARRAY_MODEL_H
19 #define PHASED_ARRAY_MODEL_H
20 
21 #include "angles.h"
22 #include "antenna-model.h"
23 
24 #include <ns3/matrix-array.h>
25 #include <ns3/object.h>
26 
27 #include <complex>
28 
29 namespace ns3
30 {
31 
37 class PhasedArrayModel : public Object
38 {
39  public:
44 
48  ~PhasedArrayModel() override;
49 
54  static TypeId GetTypeId();
55 
58 
65  double norm(const ComplexVector& complexVector) const
66  {
67  double norm = 0;
68  for (size_t i = 0; i < complexVector.GetSize(); i++)
69  {
70  norm += std::norm(complexVector[i]);
71  }
72  return std::sqrt(norm);
73  }
74 
81  virtual Vector GetElementLocation(uint64_t index) const = 0;
82 
87  virtual size_t GetNumElems() const = 0;
88 
98  virtual std::pair<double, double> GetElementFieldPattern(Angles a,
99  uint8_t polIndex = 0) const = 0;
100 
105  virtual void SetNumVerticalPorts(uint16_t nPorts) = 0;
106 
111  virtual void SetNumHorizontalPorts(uint16_t nPorts) = 0;
112 
117  virtual uint16_t GetNumVerticalPorts() const = 0;
118 
123  virtual uint16_t GetNumHorizontalPorts() const = 0;
124 
129  virtual uint16_t GetNumPorts() const = 0;
130 
135  virtual uint8_t GetNumPols() const = 0;
136 
141  virtual size_t GetVElemsPerPort() const = 0;
146  virtual size_t GetHElemsPerPort() const = 0;
147 
152  virtual size_t GetNumElemsPerPort() const = 0;
153 
158  virtual void SetNumColumns(uint32_t nColumns) = 0;
159 
164  virtual void SetNumRows(uint32_t nRows) = 0;
165 
170  virtual uint32_t GetNumColumns() const = 0;
171 
176  virtual uint32_t GetNumRows() const = 0;
177 
182  virtual double GetPolSlant() const = 0;
183 
188  virtual bool IsDualPol() const = 0;
189 
197  virtual uint16_t ArrayIndexFromPortIndex(uint16_t portIndex,
198  uint16_t subElementIndex) const = 0;
199 
205  virtual uint8_t GetElemPol(size_t elementIndex) const = 0;
206 
211  void SetBeamformingVector(const ComplexVector& beamformingVector);
212 
218 
224 
231 
238 
243  void SetAntennaElement(Ptr<AntennaModel> antennaElement);
244 
250 
255  uint32_t GetId() const;
256 
257  protected:
261  static uint32_t
263  uint32_t m_id{0};
264 };
265 
266 } /* namespace ns3 */
267 
268 #endif /* PHASED_ARRAY_MODEL_H */
Class holding the azimuth and inclination angles of spherical coordinates.
Definition: angles.h:118
MatrixArray class inherits ValArray class and provides additional interfaces to ValArray which enable...
Definition: matrix-array.h:83
A base class which provides memory management and object aggregation.
Definition: object.h:89
Class implementing the phased array model virtual base class.
const PhasedArrayModel::ComplexVector & GetBeamformingVectorRef() const
Returns the const reference of the beamforming vector that is currently being used.
static uint32_t m_idCounter
the ID counter that is used to determine the unique antenna array ID
virtual uint32_t GetNumRows() const =0
Get the number of rows.
ComplexVector GetSteeringVector(Angles a) const
Returns the steering vector that points toward the specified position.
virtual void SetNumRows(uint32_t nRows)=0
Set the number of rows.
virtual Vector GetElementLocation(uint64_t index) const =0
Returns the location of the antenna element with the specified index, normalized with respect to the ...
virtual uint16_t GetNumPorts() const =0
Get the number of ports.
uint32_t GetId() const
Returns the ID of this antenna array instance.
virtual uint16_t GetNumHorizontalPorts() const =0
Get the horizontal number of ports.
virtual uint16_t GetNumVerticalPorts() const =0
Get the vertical number of ports.
virtual uint32_t GetNumColumns() const =0
Get the number of columns.
PhasedArrayModel()
Constructor.
virtual size_t GetNumElemsPerPort() const =0
Get the number of elements per port.
Ptr< AntennaModel > m_antennaElement
the model of the antenna element in use
Ptr< const AntennaModel > GetAntennaElement() const
Returns a pointer to the AntennaModel instance used to model the elements of the array.
void SetAntennaElement(Ptr< AntennaModel > antennaElement)
Sets the antenna model to be used.
virtual uint8_t GetNumPols() const =0
Get the number of polarizations.
virtual size_t GetVElemsPerPort() const =0
Get the vertical number of antenna elements per port.
virtual uint8_t GetElemPol(size_t elementIndex) const =0
Returns the index of the polarization to which belongs that antenna element.
virtual void SetNumHorizontalPorts(uint16_t nPorts)=0
Set the horizontal number of ports.
virtual void SetNumColumns(uint32_t nColumns)=0
Set the number of columns.
ComplexVector GetBeamformingVector() const
Returns the beamforming vector that is currently being used.
bool m_isBfVectorValid
ensures the validity of the beamforming vector
double norm(const ComplexVector &complexVector) const
Computes the Frobenius norm of the complex vector.
virtual std::pair< double, double > GetElementFieldPattern(Angles a, uint8_t polIndex=0) const =0
Returns the horizontal and vertical components of the antenna element field pattern at the specified ...
virtual size_t GetHElemsPerPort() const =0
Get the horizontal number of antenna elements per port.
~PhasedArrayModel() override
Destructor.
virtual bool IsDualPol() const =0
Get the indication whether the antenna array is dual polarized.
virtual double GetPolSlant() const =0
Get the polarization slant angle.
uint32_t m_id
the ID of this antenna array instance
virtual uint16_t ArrayIndexFromPortIndex(uint16_t portIndex, uint16_t subElementIndex) const =0
Calculate the index in the antenna array from the port index and the element in the port.
void SetBeamformingVector(const ComplexVector &beamformingVector)
Sets the beamforming vector to be used.
ComplexVector m_beamformingVector
the beamforming vector in use
virtual size_t GetNumElems() const =0
Returns the number of antenna elements.
virtual void SetNumVerticalPorts(uint16_t nPorts)=0
Set the vertical number of ports.
static TypeId GetTypeId()
Get the type ID.
a unique identifier for an interface.
Definition: type-id.h:59
size_t GetSize() const
Definition: val-array.h:400
const double norm
Normalization to obtain randoms on [0,1).
Definition: rng-stream.cc:66
Every class exported by the ns3 library is enclosed in the ns3 namespace.
MatrixArray< std::complex< double > > ComplexMatrixArray
Create an alias for MatrixArray using complex type.
Definition: matrix-array.h:247