25 #include <ns3/uinteger.h> 
   26 #include <ns3/double.h> 
   27 #include <ns3/isotropic-antenna-model.h> 
   28 #include <ns3/mobility-helper.h> 
   29 #include <ns3/position-allocator.h> 
   30 #include <ns3/geographic-positions.h> 
   41   82e6, 174e6, 180e6, 186e6, 192e6, 198e6, 204e6, 210e6, 470e6, 476e6, 482e6, 
 
   42   488e6, 494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 
 
   43   554e6, 560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 
 
   44   620e6, 626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 
 
   45   686e6, 692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 
 
   46   752e6, 758e6, 764e6, 770e6, 776e6, 782e6, 788e6, 794e6, 800e6, 806e6, 812e6, 
 
   47   818e6, 824e6, 830e6, 836e6, 842e6, 848e6, 854e6, 860e6, 866e6, 872e6, 878e6, 
 
   51   88e6, 180e6, 186e6, 192e6, 198e6, 204e6, 210e6, 216e6, 476e6, 482e6, 488e6, 
 
   52   494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 
 
   53   560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 
 
   54   626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 
 
   55   692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 
 
   56   758e6, 764e6, 770e6, 776e6, 782e6, 788e6, 794e6, 800e6, 806e6, 812e6, 818e6, 
 
   57   824e6, 830e6, 836e6, 842e6, 848e6, 854e6, 860e6, 866e6, 872e6, 878e6, 884e6, 
 
   64   195e6, 202e6, 209e6, 216e6, 223e6, 0, 0, 0, 0, 0, 0, 0, 0, 470e6, 478e6, 
 
   65   486e6, 494e6, 502e6, 510e6, 518e6, 526e6, 534e6, 542e6, 550e6, 558e6, 566e6, 
 
   66   574e6, 582e6, 590e6, 598e6, 606e6, 614e6, 622e6, 630e6, 638e6, 646e6, 654e6, 
 
   67   662e6, 670e6, 678e6, 686e6, 694e6, 702e6, 710e6, 718e6, 726e6, 734e6, 742e6, 
 
   68   750e6, 758e6, 766e6, 774e6, 782e6, 790e6, 798e6, 806e6, 814e6, 822e6, 830e6, 
 
   72   202e6, 209e6, 216e6, 223e6, 230e6, 0, 0, 0, 0, 0, 0, 0, 0, 478e6, 486e6, 
 
   73   494e6, 502e6, 510e6, 518e6, 526e6, 534e6, 542e6, 550e6, 558e6, 566e6, 574e6, 
 
   74   582e6, 590e6, 598e6, 606e6, 614e6, 622e6, 630e6, 638e6, 646e6, 654e6, 662e6, 
 
   75   670e6, 678e6, 686e6, 694e6, 702e6, 710e6, 718e6, 726e6, 734e6, 742e6, 750e6, 
 
   76   758e6, 766e6, 774e6, 782e6, 790e6, 798e6, 806e6, 814e6, 822e6, 830e6, 838e6, 
 
   83   182e6, 188e6, 192e6, 198e6, 204e6, 210e6, 216e6, 470e6, 476e6, 482e6, 488e6, 
 
   84   494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 
 
   85   560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 
 
   86   626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 
 
   87   692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 
 
   91   188e6, 194e6, 198e6, 204e6, 210e6, 216e6, 222e6, 476e6, 482e6, 488e6, 494e6, 
 
   92   500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 560e6, 
 
   93   566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 626e6, 
 
   94   632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 692e6, 
 
   95   698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 758e6, 
 
  144       phy->SetDevice (dev);
 
  159                                       uint16_t channelNumber)
 
  163   double startFrequency;
 
  164   double channelBandwidth;
 
  168                      "channel number " << channelNumber <<
 
  169                      " does not exist for this region");
 
  170       NS_ASSERT_MSG (northAmericaStartFrequencies[channelNumber] != 0,
 
  171                      "channel number " << channelNumber <<
 
  172                      " does not exist for this region");
 
  173       startFrequency = northAmericaStartFrequencies[channelNumber];    
 
  174       channelBandwidth = northAmericaEndFrequencies[channelNumber] - 
 
  175                          northAmericaStartFrequencies[channelNumber];
 
  180                      "channel number " << channelNumber <<
 
  181                      " does not exist for this region");
 
  183                      "channel number " << channelNumber <<
 
  184                      " does not exist for this region");
 
  185       startFrequency = europeStartFrequencies[channelNumber];    
 
  186       channelBandwidth = europeEndFrequencies[channelNumber] - 
 
  187                          europeStartFrequencies[channelNumber];
 
  192                      "channel number " << channelNumber <<
 
  193                      " does not exist for this region");
 
  195                      "channel number " << channelNumber <<
 
  196                      " does not exist for this region");
 
  197       startFrequency = japanStartFrequencies[channelNumber];    
 
  198       channelBandwidth = japanEndFrequencies[channelNumber] - 
 
  199                          japanStartFrequencies[channelNumber];
 
  206       phy->SetAttribute (
"StartFrequency", 
DoubleValue (startFrequency));
 
  207       phy->SetAttribute (
"ChannelBandwidth", 
DoubleValue (channelBandwidth));
 
  215       phy->SetDevice (dev);
 
  240       phy->GetAttribute (
"StartFrequency", startFrequency);
 
  241       phy->GetAttribute (
"ChannelBandwidth", channelBandwidth);
 
  242       phy->SetAttribute (
"StartFrequency", 
DoubleValue (startFrequency.
Get () + 
 
  243                          (index * channelBandwidth.
Get ())));
 
  251       phy->SetDevice (dev);
 
  267                                               uint16_t channelNumber)
 
  271   double startFrequency;
 
  272   double channelBandwidth;
 
  273   uint16_t currChannelNumber;
 
  278       currChannelNumber = channelNumber + index;
 
  282                          "channel number " << currChannelNumber <<
 
  283                          " does not exist for this region");
 
  284           NS_ASSERT_MSG (northAmericaStartFrequencies[currChannelNumber] != 0,
 
  285                          "channel number " << currChannelNumber <<
 
  286                          " does not exist for this region");
 
  287           startFrequency = northAmericaStartFrequencies[currChannelNumber];    
 
  288           channelBandwidth = northAmericaEndFrequencies[currChannelNumber] 
 
  289                              - northAmericaStartFrequencies[currChannelNumber];
 
  294                          "channel number " << currChannelNumber <<
 
  295                          " does not exist for this region");
 
  296           NS_ASSERT_MSG (europeStartFrequencies[currChannelNumber] != 0,
 
  297                          "channel number " << currChannelNumber <<
 
  298                          " does not exist for this region");
 
  299           startFrequency = europeStartFrequencies[currChannelNumber];    
 
  300           channelBandwidth = europeEndFrequencies[currChannelNumber] - 
 
  301                              europeStartFrequencies[currChannelNumber];
 
  306                          "channel number " << currChannelNumber <<
 
  307                          " does not exist for this region");
 
  308           NS_ASSERT_MSG (japanStartFrequencies[currChannelNumber] != 0,
 
  309                          "channel number " << currChannelNumber <<
 
  310                          " does not exist for this region");
 
  311           startFrequency = japanStartFrequencies[currChannelNumber];    
 
  312           channelBandwidth = japanEndFrequencies[currChannelNumber] - 
 
  313                              japanStartFrequencies[currChannelNumber];
 
  317       phy->SetAttribute (
"StartFrequency", 
DoubleValue (startFrequency));
 
  318       phy->SetAttribute (
"ChannelBandwidth", 
DoubleValue (channelBandwidth));
 
  326       phy->SetDevice (dev);
 
  350                                                            double originLatitude, 
 
  351                                                            double originLongitude,
 
  356   std::list<int> transmitterIndicesToCreate;
 
  360                                    (northAmericaStartFrequencies, 
 
  361                                     northAmericaArrayLength, 
 
  367                                    (europeStartFrequencies, 
 
  374                                    (japanStartFrequencies, 
 
  378   std::list<Vector> tvTransmitterLocations = 
 
  382                                                                    transmitterIndicesToCreate.size(), 
 
  386                                      transmitterIndicesToCreate, 
 
  387                                      tvTransmitterLocations);
 
  393                                                                  const int startFrequenciesLength, 
 
  396   std::vector<double> startFreqVector; 
 
  397   for (
int i = 0; i < startFrequenciesLength; i++)
 
  399       double element = startFrequencies[i];
 
  401       if (element != 0) startFreqVector.push_back(element);
 
  405   uint32_t freqVectorSize = startFreqVector.size();
 
  409   std::vector<double> transmitterStartFreqsToCreate; 
 
  410   for (
int i = 0; i < randNumTransmitters; i++)
 
  415       transmitterStartFreqsToCreate.push_back(startFreqVector[randIndex]); 
 
  417       startFreqVector.erase(startFreqVector.begin() + randIndex); 
 
  422   std::list<int> transmitterIndicesToCreate;
 
  423   for (
int i = 0; i < (int)transmitterStartFreqsToCreate.size(); i++)
 
  425       for (
int channelNumberIndex = 0; 
 
  426            channelNumberIndex < startFrequenciesLength; channelNumberIndex++)
 
  428           if (startFrequencies[channelNumberIndex] == transmitterStartFreqsToCreate[i])
 
  430               transmitterIndicesToCreate.push_back(channelNumberIndex);
 
  435   return transmitterIndicesToCreate;
 
  441                                                        uint32_t numChannels)
 
  450       numTransmitters = 
m_uniRand->
GetInteger (ceil (0.33 * numChannels) + 1, ceil (0.66 * numChannels));
 
  456   return numTransmitters;
 
  462                                                                 std::list<int> transmitterIndicesToCreate, 
 
  463                                                                 std::list<Vector> transmitterLocations)
 
  465   int numTransmitters = (int)transmitterIndicesToCreate.size();
 
  466   for (
int transNum = 0; transNum < numTransmitters; transNum++)
 
  470       nodePosition->Add (transmitterLocations.front()); 
 
  478       uint16_t channelNumber = (uint16_t) transmitterIndicesToCreate.front(); 
 
  479       Install (tvNode, region, channelNumber); 
 
  480       transmitterLocations.pop_front(); 
 
  481       transmitterIndicesToCreate.pop_front(); 
 
Ptr< UniformRandomVariable > m_uniRand
Object to generate uniform random numbers. 
 
Smart pointer class similar to boost::intrusive_ptr. 
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
void SetStream(int64_t stream)
Specifies the stream number for the RngStream. 
 
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator. 
 
Ptr< T > GetObject(void) const 
Get a pointer to the requested aggregated Object. 
 
ObjectFactory m_factory
Object factory for attribute setting. 
 
Hold a value for an Attribute. 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
const double europeEndFrequencies[70]
EUROPE end frequencies. 
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
const double northAmericaStartFrequencies[84]
NORTH AMERICA start frequencies. 
 
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory. 
 
Iterator End(void) const 
Get an iterator which indicates past-the-last Node in the container. 
 
const double europeStartFrequencies[70]
EUROPE start frequencies. 
 
std::list< int > GenerateRegionalTransmitterIndices(const double startFrequencies[], const int startFrequenciesLength, Density density)
Generates random indices of given region frequency array (ignoring indices referring to invalid chann...
 
void CreateRegionalTvTransmitters(Region region, Density density, double originLatitude, double originLongitude, double maxAltitude, double maxRadius)
Generates and installs (starts transmission on the spectrum channel) a random number of TV transmitte...
 
Region
geographical region that TV transmitters are being set up in 
 
TvSpectrumTransmitterHelper()
Default constructor. 
 
Keep track of the current position and velocity of an object. 
 
virtual uint32_t GetInteger(void)=0
Get the next random value as an integer drawn from the distribution. 
 
NS_ASSERT_MSG(false,"Ipv4AddressGenerator::MaskToIndex(): Impossible")
 
void Install(Ptr< Node > node) const 
"Layout" a single node according to the current position allocator type. 
 
NetDeviceContainer Install(NodeContainer nodes)
Set up and start the TV Transmitter's transmission on the spectrum channel. 
 
Density
density of location that TV transmitters are being set up in 
 
const int japanArrayLength
JAPAN: 63 elements (index 0 - 62); valid channels = 1 - 62. 
 
const int northAmericaArrayLength
NORTH AMERICA: 84 elements (index 0 - 83); valid channels = 2 - 83. 
 
Ptr< Object > Create(void) const 
Create an Object instance of the configured TypeId. 
 
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container. 
 
int GetRandomNumTransmitters(Density density, uint32_t numChannels)
Randomly generates the number of TV transmitters to be created based on given density and number of p...
 
holds a vector of ns3::NetDevice pointers 
 
Ptr< SpectrumChannel > m_channel
Pointer to spectrum channel object. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
keep track of a set of node pointers. 
 
Iterator Begin(void) const 
Get an iterator which refers to the first Node in the container. 
 
const double northAmericaEndFrequencies[84]
NORTH AMERICA end frequencies. 
 
const double japanStartFrequencies[63]
JAPAN start frequencies. 
 
int64_t AssignStreams(int64_t streamNum)
Assigns the stream number for the uniform random number generator to use. 
 
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
 
SpectrumPhy implementation that creates a customizable TV transmitter which transmits a PSD spectrum ...
 
void Set(std::string name, const AttributeValue &value)
Set an attribute to be set during construction. 
 
NetDeviceContainer InstallAdjacent(NodeContainer nodes)
Set up and start the TV Transmitter's transmission on the spectrum channel. 
 
static std::list< Vector > RandCartesianPointsAroundGeographicPoint(double originLatitude, double originLongitude, double maxAltitude, int numPoints, double maxDistFromOrigin, Ptr< UniformRandomVariable > uniRand)
Generates uniformly distributed random points (in ECEF Cartesian coordinates) within a given altitude...
 
Helper class used to assign positions and mobility models to nodes. 
 
void InstallRandomRegionalTransmitters(Region region, std::list< int > transmitterIndicesToCreate, std::list< Vector > transmitterLocations)
Installs each randomly generated regional TV transmitter. 
 
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node. 
 
virtual ~TvSpectrumTransmitterHelper()
Destructor. 
 
const double japanEndFrequencies[63]
JAPAN end frequencies. 
 
Ptr< T > CreateObject(void)
Create an object by type, with varying number of constructor parameters. 
 
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer. 
 
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
 
const int europeArrayLength
EUROPE: 70 elements (index 0 - 69); valid channels = 5 - 12, 21 - 69. 
 
This class can be used to hold variables of floating point type such as 'double' or 'float'...
 
void SetAttribute(std::string name, const AttributeValue &val)
Set attribute for each TvSpectrumTransmitter instance to be created. 
 
void SetChannel(Ptr< SpectrumChannel > c)
Set the spectrum channel for the device(s) to transmit on.