39 #include "ns3/buildings-module.h" 40 #include "ns3/mobility-module.h" 41 #include "ns3/core-module.h" 42 #include "ns3/network-module.h" 44 #include "ns3/uniform-planar-array.h" 45 #include "ns3/three-gpp-spectrum-propagation-loss-model.h" 46 #include "ns3/three-gpp-v2v-propagation-loss-model.h" 47 #include "ns3/three-gpp-channel-model.h" 73 Angles completeAngle (bPos,aPos);
96 NS_LOG_DEBUG (
"Pathloss " << -propagationGainDb <<
" dB");
97 double propagationGainLinear = std::pow (10.0, (propagationGainDb) / 10.0);
98 *(rxPsd) *= propagationGainLinear;
102 NS_LOG_DEBUG (
"Average rx power " << 10 * log10 (
Sum (*rxPsd) * 180e3) <<
" dB");
106 const double kT_dBm_Hz = -174.0;
107 double kT_W_Hz = std::pow (10.0, (kT_dBm_Hz - 30) / 10.0);
108 double noiseFigureLinear = std::pow (10.0, noiseFigure / 10.0);
109 double noisePowerSpectralDensity = kT_W_Hz * noiseFigureLinear;
111 (*noisePsd) = noisePowerSpectralDensity;
114 NS_LOG_DEBUG (
"Average SNR " << 10 * log10 (
Sum (*rxPsd) /
Sum (*noisePsd)) <<
" dB");
118 f.open (
"example-output.txt", std::ios::out | std::ios::app);
125 << 10 * log10 (
Sum (*rxPsd) /
Sum (*noisePsd)) <<
" " 126 << -propagationGainDb << std::endl;
138 std::ofstream outFile;
139 outFile.open (filename.c_str (), std::ios_base::out | std::ios_base::trunc);
140 if (!outFile.is_open ())
149 Box box = (*it)->GetBoundaries ();
150 outFile <<
"set object " << index
151 <<
" rect from " << box.
xMin <<
"," << box.
yMin 152 <<
" to " << box.
xMax <<
"," << box.
yMax 158 main (
int argc,
char *argv[])
160 double frequency = 28.0e9;
161 double txPow_dbm = 30.0;
162 double noiseFigure = 9.0;
165 std::string scenario =
"V2V-Urban";
167 double subCarrierSpacing = 60e3;
168 uint32_t numRb = 275;
171 cmd.AddValue (
"frequency",
"operating frequency in Hz", frequency);
172 cmd.AddValue (
"txPow",
"tx power in dBm", txPow_dbm);
173 cmd.AddValue (
"noiseFigure",
"noise figure in dB", noiseFigure);
174 cmd.AddValue (
"scenario",
"3GPP propagation scenario, V2V-Urban or V2V-Highway", scenario);
175 cmd.Parse (argc, argv);
186 nodes.Get (0)->AddDevice (txDev);
188 nodes.Get (1)->AddDevice (rxDev);
189 rxDev->SetNode (
nodes.Get (1));
197 if (scenario ==
"V2V-Urban")
203 double buildingSizeX = 250 - 3.5 * 2 - 3;
204 double buildingSizeY = 433 - 3.5 * 2 - 3;
205 double streetWidth = 20;
206 double buildingHeight = 10;
207 uint32_t numBuildingsX = 2;
208 uint32_t numBuildingsY = 2;
209 double maxAxisX = (buildingSizeX + streetWidth) * numBuildingsX;
210 double maxAxisY = (buildingSizeY + streetWidth) * numBuildingsY;
212 std::vector<Ptr<Building> > buildingVector;
213 for (uint32_t buildingIdX = 0; buildingIdX < numBuildingsX; ++buildingIdX)
215 for (uint32_t buildingIdY = 0; buildingIdY < numBuildingsY; ++buildingIdY)
218 building = CreateObject<Building> ();
221 buildingIdX * (buildingSizeX + streetWidth) + buildingSizeX,
222 buildingIdY * (buildingSizeY + streetWidth),
223 buildingIdY * (buildingSizeY + streetWidth) + buildingSizeY,
224 0.0, buildingHeight));
228 buildingVector.push_back (building);
234 double vRx = vScatt / 2;
235 txMob = CreateObject<WaypointMobilityModel> ();
236 rxMob = CreateObject<WaypointMobilityModel> ();
239 nextWaypoint +=
Seconds ((maxAxisY - streetWidth) / 2 / vTx);
240 txMob->GetObject<
WaypointMobilityModel> ()->AddWaypoint (
Waypoint (nextWaypoint, Vector (maxAxisX / 2 - streetWidth / 2, maxAxisY / 2 - streetWidth / 2, 1.5)));
241 nextWaypoint +=
Seconds ((maxAxisX - streetWidth) / 2 / vTx);
245 nextWaypoint +=
Seconds (maxAxisY / vRx);
248 nodes.Get (0)->AggregateObject (txMob);
249 nodes.Get (1)->AggregateObject (rxMob);
252 m_condModel = CreateObject<ThreeGppV2vUrbanChannelConditionModel> ();
257 else if (scenario ==
"V2V-Highway")
265 double vRx = vScatt / 2;
267 txMob = CreateObject<ConstantVelocityMobilityModel> ();
268 rxMob = CreateObject<ConstantVelocityMobilityModel> ();
274 nodes.Get (0)->AggregateObject (txMob);
275 nodes.Get (1)->AggregateObject (rxMob);
278 m_condModel = CreateObject<ThreeGppV2vHighwayChannelConditionModel> ();
316 double freqSubBand = frequency;
317 for (uint16_t
n = 0;
n < numRb; ++
n)
321 freqSubBand += subCarrierSpacing / 2;
323 freqSubBand += subCarrierSpacing / 2;
329 double txPow_w = std::pow (10., (txPow_dbm - 30) / 10);
330 double txPowDens = (txPow_w / (numRb * subCarrierSpacing));
331 (*txPsd) = txPowDens;
333 for (
int i = 0; i < simTime / timeRes; i++)
340 f.open (
"example-output.txt", std::ios::out);
341 f <<
"Time[s] TxPosX[m] TxPosY[m] RxPosX[m] RxPosY[m] ChannelState SNR[dB] Pathloss[dB]" << std::endl;
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Simulation virtual time values and global simulation resolution.
double CalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
Returns the Rx Power taking into account all the PropagationLossModel(s) chained to the current one...
AttributeValue implementation for Boolean.
void SetNRoomsY(uint16_t nroomy)
Hold variables of type string.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
static void Run(void)
Run the simulation.
virtual Ptr< Node > GetNode(void) const =0
Class holding the azimuth and inclination angles of spherical coordinates.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
ComplexVector GetBeamformingVector(void) const
Returns the beamforming vector that is currently being used.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
static Iterator End(void)
LosConditionValue GetLosCondition() const
Get the LosConditionValue contaning the information about the LOS/NLOS state of the channel...
double xMax
The x coordinate of the right bound of the box.
static Iterator Begin(void)
static void ComputeSnr(Ptr< MobilityModel > txMob, Ptr< MobilityModel > rxMob, Ptr< const SpectrumValue > txPsd, double noiseFigure)
Compute the average SNR.
static Vector GetPosition(Ptr< Node > node)
std::vector< BandInfo > Bands
Container of BandInfo.
static void SetPosition(Ptr< Node > node, Vector position)
double yMax
The y coordinate of the top bound of the box.
Keep track of the current position and velocity of an object.
virtual void SetNode(Ptr< Node > node)
AttributeValue implementation for Time.
void PrintGnuplottableBuildingListToFile(std::string filename)
Generates a GNU-plottable file representig the buildings deployed in the scenario.
Hold an unsigned integer type.
void SetNFloors(uint16_t nfloors)
double fc
center frequency
std::vector< Ptr< Building > >::const_iterator Iterator
static Ptr< ChannelConditionModel > m_condModel
the ChannelConditionModel object
double yMin
The y coordinate of the bottom bound of the box.
Parse command-line arguments.
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Ptr< SpectrumValue > Copy() const
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
void SetBeamformingVector(const ComplexVector &beamformingVector)
Sets the beamforming vector to be used.
double f(double x, void *params)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
double fl
lower limit of subband
keep track of a set of node pointers.
Hold objects of type Ptr<T>.
Ptr< const SpectrumModel > GetSpectrumModel() const
static Time Now(void)
Return the current simulation virtual time.
Vector GetPosition(void) const
static Ptr< ThreeGppSpectrumPropagationLossModel > m_spectrumLossModel
the SpectrumPropagationLossModel object
std::vector< std::complex< double > > ComplexVector
type definition for complex vectors
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
double Sum(const SpectrumValue &x)
Waypoint-based mobility model.
void SetNRoomsX(uint16_t nroomx)
Mobility model for which the current speed does not change once it has been set and until it is set a...
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
static void DoBeamforming(Ptr< NetDevice > thisDevice, Ptr< PhasedArrayModel > thisAntenna, Ptr< NetDevice > otherDevice)
Perform the beamforming using the DFT beamforming method.
double fh
upper limit of subband
This class can be used to hold variables of floating point type such as 'double' or 'float'...
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
The building block of a SpectrumModel.
void SetBoundaries(Box box)
Set the boundaries of the building.
static Ptr< ThreeGppPropagationLossModel > m_propagationLossModel
the PropagationLossModel object
double xMin
The x coordinate of the left bound of the box.
static void Install(Ptr< Node > node)
Install the MobilityBuildingInfo to a node.