Beispiel #1
0
    def test_tracking_target(self, model):
        e = model.enum
        m = model
        pattern = range(7)
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        assert not m.tx_antenna_tracking_target

        e = model.enum
        m = model
        pattern = range(7)
        antenna = pylink.Antenna(is_rx=False, tracking=True, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        assert True == m.tx_antenna_tracking_target

        e = model.enum
        m = model
        pattern = range(7)
        antenna = pylink.Antenna(is_rx=False,
                                 tracking='turkey saussage',
                                 pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        assert m.tx_antenna_tracking_target
        assert True == m.tx_antenna_tracking_target
Beispiel #2
0
def model():
    return pylink.DAGModel([pylink.Geometry(),
                            pylink.Antenna(is_rx=True),
                            pylink.Interconnect(is_rx=True),
                            pylink.Receiver(),
                            pylink.Transmitter(),
                            pylink.Interconnect(is_rx=False),
                            pylink.Antenna(is_rx=False),
                            pylink.Channel(),
                            pylink.Modulation(name='QPSK', perf=perf),
                            pylink.LinkBudget()])
Beispiel #3
0
 def test_boresight_gain_dbi(self, model):
     assert model.tx_antenna_boresight_gain_dbi == 0
     pattern = range(1, 10, 1)
     antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
     model.accept_tribute(antenna.tribute)
     model.clear_cache()
     assert model.tx_antenna_boresight_gain_dbi == 1
Beispiel #4
0
 def test_obj(self, model):
     e = model.enum
     m = model
     pattern = range(7)
     antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
     m.accept_tribute(antenna.tribute)
     model.clear_cache()
     assert m.tx_antenna_obj == antenna
Beispiel #5
0
    def test_peak_gain_dbi(self, model):
        e = model.enum
        m = model
        pattern = range(10)
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        assert max(antenna.interpolated) == m.tx_antenna_peak_gain_dbi
Beispiel #6
0
    def test_average_nadir_gain_dbi(self, model):
        e = model.enum
        m = model
        pattern = [1] * 90 + [0] * 180 + [1] * 90
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        assert (1 == m.tx_antenna_average_nadir_gain_dbi)
Beispiel #7
0
    def test_raw_gain_pattern_angles(self, model):
        e = model.enum
        m = model
        pattern = range(36)
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        for i in range(len(m.tx_antenna_raw_gain_pattern_angles)):
            assert m.tx_antenna_raw_gain_pattern_angles[i] == 10 * i

        pattern = range(7)
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        angles = m.tx_antenna_raw_gain_pattern_angles
        for i in range(len(angles)):
            assert angles[i] == i * (360.0 / len(pattern))
Beispiel #8
0
    def test_raw_gain_pattern(self, model):
        e = model.enum
        m = model
        pattern = range(10)
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        for i in range(len(pattern)):
            assert m.tx_antenna_raw_gain_pattern[i] == pattern[i]
Beispiel #9
0
    def test_pointing_loss_db(self, model):
        e = model.enum
        m = model
        pattern = range(7)
        antenna = pylink.Antenna(pointing_loss_db=2.718281828,
                                 is_rx=False,
                                 tracking=False,
                                 pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        assert m.tx_antenna_pointing_loss_db == 2.718281828
Beispiel #10
0
    def test_gain_pattern_angles(self, model):
        e = model.enum
        m = model
        pattern = range(7)
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        angles = m.tx_antenna_gain_pattern_angles
        assert 360 == len(angles)
        for i in range(len(angles)):
            assert i == angles[i]
Beispiel #11
0
    def test_rf_chain(self, model):
        e = model.enum
        m = model
        chain = range(3)
        pattern = range(7)
        antenna = pylink.Antenna(rf_chain=chain,
                                 is_rx=False,
                                 tracking=False,
                                 pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        assert m.tx_antenna_rf_chain == chain
Beispiel #12
0
    def test_gain_pattern(self, model):
        e = model.enum
        m = model
        pattern = [1] * 3 + [0] * 5 + [1] * 2
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        interp = m.tx_antenna_gain_pattern
        assert 360 == len(interp)

        for i in range(-30, 30, 1):
            angle = (360 + i) % 360
            assert abs(interp[angle] - 1.0) < 3e-2
Beispiel #13
0
    def test_gain_dbi(self, model):
        e = model.enum
        m = model

        pattern = range(10)
        antenna = pylink.Antenna(is_rx=False, tracking=False, pattern=pattern)
        m.accept_tribute(antenna.tribute)
        model.clear_cache()

        assert 360 == len(m.tx_antenna_gain_pattern_angles)

        for i in range(-180, 180, 1):
            m.override(e.tx_antenna_angle_deg, i)
            gain = m.tx_antenna_gain_dbi
            deg = (360 + i) % 360
            val = antenna.interpolated[deg]
            assert gain == val

        for i in range(360):
            m.override(e.tx_antenna_angle_deg, i)
            gain = m.tx_antenna_gain_dbi
            val = antenna.interpolated[i]
            assert gain == val
Beispiel #14
0
    def update_gs_rx_antenna_gain(self, gain):

        # create new antenna
        self.gs_rx_antenna = pylink.Antenna(
            gain=gain,
            pattern=self.sampler(self.groundstation_configuration,
                                 ['rx', 'antenna', 'pattern']),
            polarization=self.groundstation_configuration['nominal']['rx']
            ['antenna']['polarization'],
            is_rx=True,
            tracking=self.groundstation_configuration['nominal']['rx']
            ['antenna']['tracking'],
            pointing_loss_db=self.sampler(self.groundstation_configuration,
                                          ['rx', 'antenna', 'pointing_loss']),
            rx_noise_temp_k=self.sampler(self.groundstation_configuration,
                                         ['rx', 'antenna', 'noise_temp']))

        # form the downlink signal chain
        self.downlink = pylink.DAGModel([
            self.geometry, self.gs_rx_antenna, self.sat_transmitter,
            self.sat_tx_antenna, self.gs_receiver, self.downlink_channel,
            self.rx_interconnect, self.tx_interconnect, self.modulation,
            pylink.LinkBudget(name='Downlink', is_downlink=True)
        ])
Beispiel #15
0
]

gs_rf_chain = [
    pylink.Element(name='Cables', gain_db=-0.75, noise_figure_db=0.75),
    pylink.Element(name='LNA', gain_db=35, noise_figure_db=2.75),
    pylink.Element(name='Filter', gain_db=-3.5, noise_figure_db=3.5),
    pylink.Element(name='Demodulator', gain_db=0, noise_figure_db=15),
]

geometry = pylink.Geometry(apoapsis_altitude_km=550,
                           periapsis_altitude_km=500,
                           min_elevation_deg=20)

sat_rx_antenna = pylink.Antenna(gain=3,
                                polarization='RHCP',
                                pattern=sat_pattern,
                                rx_noise_temp_k=1000,
                                is_rx=True,
                                tracking=False)

sat_tx_antenna = pylink.Antenna(gain=3,
                                polarization='RHCP',
                                pattern=sat_pattern,
                                is_rx=False,
                                tracking=False)

gs_rx_antenna = pylink.Antenna(pattern=pylink.pattern_generator(48),
                               rx_noise_temp_k=300,
                               polarization='RHCP',
                               is_rx=True,
                               tracking=True)
Beispiel #16
0
    def satellite_init(self):

        # build the receive RF chain
        self.sat_rf_chain = [
            pylink.Element(name='Cables',
                           gain_db=self.sampler(self.satellite_configuration,
                                                ['rx', 'cable', 'gain']),
                           noise_figure_db=self.sampler(
                               self.satellite_configuration,
                               ['rx', 'cable', 'noise_figure'])),
            pylink.Element(name='LNA',
                           gain_db=self.sampler(self.satellite_configuration,
                                                ['rx', 'lna', 'gain']),
                           noise_figure_db=self.sampler(
                               self.satellite_configuration,
                               ['rx', 'lna', 'noise_figure'])),
            pylink.Element(name='Filter',
                           gain_db=self.sampler(self.satellite_configuration,
                                                ['rx', 'filter', 'gain']),
                           noise_figure_db=self.sampler(
                               self.satellite_configuration,
                               ['rx', 'filter', 'noise_figure'])),
            pylink.Element(name='Demodulator',
                           gain_db=self.sampler(self.satellite_configuration,
                                                ['rx', 'demodulator', 'gain']),
                           noise_figure_db=self.sampler(
                               self.satellite_configuration,
                               ['rx', 'demodulator', 'noise_figure'])),
        ]

        # if no gain given, calculate from the antenna aperture
        if 'gain' in self.satellite_configuration['nominal']['rx']['antenna']:
            sat_rx_antenna_gain = self.sampler(self.satellite_configuration,
                                               ['rx', 'antenna', 'gain'])

            if 'aperture' in self.satellite_configuration['nominal']['rx'][
                    'antenna'] and self.warn:
                print(
                    "Satellite Rx Antenna: Both gain and aperature provided, will use gain"
                )

        else:
            sat_rx_antenna_gain = 10 * np.log10(
                self.sampler(self.satellite_configuration,
                             ['rx', 'antenna', 'aperture_efficiency']) *
                self.sampler(self.satellite_configuration,
                             ['rx', 'antenna', 'aperture']) * 4 * np.pi *
                (1e6 * self.sampler(self.channel_configuration,
                                    ['uplink', 'center_freq']))**2 /
                scipy.constants.c**2)

        # specify the receive antenna
        self.sat_rx_antenna = pylink.Antenna(
            gain=sat_rx_antenna_gain,
            polarization=self.satellite_configuration['nominal']['rx']
            ['antenna']['polarization'],
            pattern=self.sampler(self.satellite_configuration,
                                 ['rx', 'antenna', 'pattern']),
            is_rx=True,
            tracking=self.satellite_configuration['nominal']['rx']['antenna']
            ['tracking'],
            pointing_loss_db=self.sampler(self.satellite_configuration,
                                          ['rx', 'antenna', 'pointing_loss']),
            rx_noise_temp_k=self.sampler(self.satellite_configuration,
                                         ['rx', 'antenna', 'noise_temp']))

        # if no gain given, calculate from the antenna aperture
        if 'gain' in self.satellite_configuration['nominal']['tx']['antenna']:
            sat_tx_antenna_gain = self.sampler(self.satellite_configuration,
                                               ['tx', 'antenna', 'gain'])

            if 'aperture' in self.satellite_configuration['nominal']['tx'][
                    'antenna'] and self.warn:
                print(
                    "Satellite Tx Antenna: Both gain and aperature provided, will use gain"
                )

        else:
            sat_tx_antenna_gain = 10 * np.log10(
                self.sampler(self.satellite_configuration,
                             ['tx', 'antenna', 'aperture_efficiency']) *
                self.sampler(self.satellite_configuration,
                             ['tx', 'antenna', 'aperture']) * 4 * np.pi *
                (1e6 * self.sampler(self.channel_configuration,
                                    ['downlink', 'center_freq']))**2 /
                scipy.constants.c**2)

        self.sat_tx_antenna = pylink.Antenna(
            gain=sat_tx_antenna_gain,
            polarization=self.satellite_configuration['nominal']['tx']
            ['antenna']['polarization'],
            pattern=self.sampler(self.satellite_configuration,
                                 ['tx', 'antenna', 'pattern']),
            is_rx=False,
            tracking=self.satellite_configuration['nominal']['tx']['antenna']
            ['tracking'],
            pointing_loss_db=self.sampler(self.satellite_configuration,
                                          ['rx', 'antenna', 'pointing_loss']))

        self.sat_receiver = pylink.Receiver(
            rf_chain=self.sat_rf_chain,
            implementation_loss_db=self.sampler(
                self.satellite_configuration,
                ['rx', 'receiver', 'implementation_loss']),
            name='Satellite ' +
            self.channel_configuration['nominal']['uplink']['name'] +
            ' Receiver')

        self.sat_transmitter = pylink.Transmitter(
            tx_power_at_pa_dbw=self.sampler(self.satellite_configuration,
                                            ['tx', 'pa', 'power']),
            name='Satellite ' +
            self.channel_configuration['nominal']['downlink']['name'] +
            ' Transmitter')
Beispiel #17
0
#!/usr/bin/env python

import os
import pylink

d = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'export')
if not os.path.exists(d):
    os.makedirs(d)

for peak in [3, 5, 15]:
    eff = .65
    null = -20
    f = os.path.join(d, 'pattern-%ddBi.png' % peak)

    pattern = pylink.pattern_generator(peak, eff=eff, null=null)
    ant = pylink.Antenna(pattern=pattern)

    ant.plot_pattern(f,
                     include_raw=False,
                     title='%ddBi Generated Pattern' % peak,
                     ylim=[null-3, peak+3])
    print('Pattern Created: %s' % f)



f = os.path.join(d, 'pattern-manual.png')
pattern = [10, 5, -5, -9, -10, -10, -10, -10, -10, -10, -9, -5, 5]
ant = pylink.Antenna(pattern=pattern)
ant.plot_pattern(f,
                 include_raw=True,
                 title='Manual Pattern')
Beispiel #18
0
#!/usr/bin/python

import pylink
"""Illustrations of the precedence order for node definitions.

Nodes are added to the DAG in the order in which they are received.
So you can, if you wish, override a standard definition.
"""

# Vanilla link budget
m = pylink.DAGModel([
    pylink.Geometry(),
    pylink.Transmitter(tx_power_at_pa_dbw=2),
    pylink.Interconnect(is_rx=False),
    pylink.Antenna(is_rx=False),
    pylink.Receiver(),
    pylink.Antenna(is_rx=True),
    pylink.Interconnect(is_rx=True),
    pylink.Channel(),
    pylink.Modulation('DVB-S2X'),
    pylink.LinkBudget()
])
e = m.enum

print 'Link margin in vanilla example: %s' % m.link_margin_db


# let's override the link_margin_db node in the kwargs
def _evil_margin_db(model):
    return -3.0
                 noise_figure_db=2.75),
  pylink.Element(name='Filter',
                 gain_db=-3.5,
                 noise_figure_db=3.5),
  pylink.Element(name='Demodulator',
                 gain_db=0,
                 noise_figure_db=15),
  ]

geometry = pylink.Geometry(apoapsis_altitude_km=426452,
                         periapsis_altitude_km=356873,
                         min_elevation_deg=20)

sat_rx_antenna = pylink.Antenna(gain=54.7,
                              polarization='RHCP',
                              pattern=sat_pattern,
                              rx_noise_temp_k=288.84,
                              is_rx=True,
                              tracking=False)

sat_tx_antenna = pylink.Antenna(gain=53.11,
                                polarization='RHCP',
                                pattern=sat_pattern,
                                is_rx=False,
                                tracking=False)

gs_rx_antenna = pylink.Antenna(pattern=pylink.pattern_generator(48),
                               rx_noise_temp_k=25.6,
                               polarization='LCP',
                               is_rx=True,
                               tracking=True)