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);
76 thisAntenna->SetBeamformingVector (bf);
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);
124 << cond->GetLosCondition () <<
" "
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);
187 txDev->SetNode (
nodes.Get (0));
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> ();
220 building->SetBoundaries (
Box (buildingIdX * (buildingSizeX + streetWidth),
221 buildingIdX * (buildingSizeX + streetWidth) + buildingSizeX,
222 buildingIdY * (buildingSizeY + streetWidth),
223 buildingIdY * (buildingSizeY + streetWidth) + buildingSizeY,
224 0.0, buildingHeight));
225 building->SetNRoomsX (1);
226 building->SetNRoomsY (1);
227 building->SetNFloors (1);
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);
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> ();
296 channelModel->SetAttribute (
"Scenario",
StringValue (scenario));
297 channelModel->SetAttribute (
"Frequency",
DoubleValue (frequency));
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;
double f(double x, void *params)
Class holding the azimuth and inclination angles of spherical coordinates.
AttributeValue implementation for Boolean.
double yMax
The y coordinate of the top bound of the box.
double xMin
The x coordinate of the left bound of the box.
double yMin
The y coordinate of the bottom bound of the box.
double xMax
The x coordinate of the right bound of the box.
std::vector< Ptr< Building > >::const_iterator Iterator
static Iterator End(void)
static Iterator Begin(void)
static void Install(Ptr< Node > node)
Install the MobilityBuildingInfo to a node.
Parse command-line arguments.
Mobility model for which the current speed does not change once it has been set and until it is set a...
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Keep track of the current position and velocity of an object.
Vector GetPosition(void) const
keep track of a set of node pointers.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
std::vector< std::complex< double > > ComplexVector
type definition for complex vectors
Hold objects of type Ptr<T>.
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.
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Run(void)
Run the simulation.
static Time Now(void)
Return the current simulation virtual time.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
AttributeValue implementation for Time.
Hold an unsigned integer type.
Waypoint-based mobility model.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#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.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::vector< BandInfo > Bands
Container of BandInfo.
double Sum(const SpectrumValue &x)
The building block of a SpectrumModel.
double fc
center frequency
double fl
lower limit of subband
double fh
upper limit of subband
static Ptr< ChannelConditionModel > m_condModel
the ChannelConditionModel object
static Ptr< ThreeGppPropagationLossModel > m_propagationLossModel
the PropagationLossModel object
static void DoBeamforming(Ptr< NetDevice > thisDevice, Ptr< PhasedArrayModel > thisAntenna, Ptr< NetDevice > otherDevice)
Perform the beamforming using the DFT beamforming method.
void PrintGnuplottableBuildingListToFile(std::string filename)
Generates a GNU-plottable file representig the buildings deployed in the scenario.
static Ptr< ThreeGppSpectrumPropagationLossModel > m_spectrumLossModel
the SpectrumPropagationLossModel object
static void ComputeSnr(Ptr< MobilityModel > txMob, Ptr< MobilityModel > rxMob, Ptr< const SpectrumValue > txPsd, double noiseFigure)
Compute the average SNR.
static void SetPosition(Ptr< Node > node, Vector position)
static Vector GetPosition(Ptr< Node > node)