blob: d7274de0f5fa75a75a4305d387123b3c950b6773 [file] [log] [blame]
Philipp Le1f7df4d2022-05-29 17:53:09 +02001# SPDX-License-Identifier: MPL-2.0
2# Copyright (c) 2022 Philipp Le <philipp@philipple.de>.
3# This Source Code Form is subject to the terms of the Mozilla Public
4# License, v. 2.0. If a copy of the MPL was not distributed with this
5# file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
7from __future__ import annotations
8
9from abc import ABC, abstractmethod
10from typing import List
11from .signal import Signal
12
13
14class TxBasebandGenerator(ABC):
15 @abstractmethod
16 def generate_tx_baseband_signal(self, sample_rate: float) -> Signal:
17 ...
18
19 def __add__(self, other: TxBasebandGenerator) -> TxBasebandGenerator:
20 class _Combined(TxBasebandGenerator):
21 def __init__(self, gen1: TxBasebandGenerator, gen2: TxBasebandGenerator):
22 self.ops: List[TxBasebandGenerator] = [gen1, gen2]
23
24 def generate_tx_baseband_signal(self, sample_rate: float) -> Signal:
25 summed = self.ops[0].generate_tx_baseband_signal(sample_rate)
26 for sig in self.ops[1:]:
27 summed = summed + sig.generate_tx_baseband_signal(sample_rate)
28 return summed
29
30 def __add__(self, other: TxBasebandGenerator):
31 self.ops.append(other)
32
33 return _Combined(self, other)
34
35
36class RfBandGenerator(ABC):
37 @abstractmethod
38 def generate_rf_signal(self, sample_rate: float) -> Signal:
39 ...
40
41 def __add__(self, other: RfBandGenerator) -> RfBandGenerator:
42 class _Combined(RfBandGenerator):
43 def __init__(self, gen1: RfBandGenerator, gen2: RfBandGenerator):
44 self.ops: List[RfBandGenerator] = [gen1, gen2]
45
46 def generate_rf_signal(self, sample_rate: float) -> Signal:
47 summed = self.ops[0].generate_rf_signal(sample_rate)
48 for sig in self.ops[1:]:
49 summed = summed + sig.generate_rf_signal(sample_rate)
50 return summed
51
52 def __add__(self, other: RfBandGenerator):
53 self.ops.append(other)
54
55 return _Combined(self, other)
56
57
58class RxBasebandGenerator(ABC):
59 @abstractmethod
60 def generate_rx_baseband_signal(self, sample_rate: float) -> Signal:
61 ...
62
63 def __add__(self, other: RxBasebandGenerator) -> RxBasebandGenerator:
64 class _Combined(RxBasebandGenerator):
65 def __init__(self, gen1: RxBasebandGenerator, gen2: RxBasebandGenerator):
66 self.ops: List[RxBasebandGenerator] = [gen1, gen2]
67
68 def generate_rx_baseband_signal(self, sample_rate: float) -> Signal:
69 summed = self.ops[0].generate_rx_baseband_signal(sample_rate)
70 for sig in self.ops[1:]:
71 summed = summed + sig.generate_rx_baseband_signal(sample_rate)
72 return summed
73
74 def __add__(self, other: RxBasebandGenerator):
75 self.ops.append(other)
76
77 return _Combined(self, other)
78
79
80class RxCorrelationGenerator(ABC):
81 @abstractmethod
82 def generate_rx_correlation(self, sample_rate: float) -> Signal:
83 ...
84
85 def __add__(self, other: RxCorrelationGenerator) -> RxCorrelationGenerator:
86 class _Combined(RxCorrelationGenerator):
87 def __init__(self, gen1: RxCorrelationGenerator, gen2: RxCorrelationGenerator):
88 self.ops: List[RxCorrelationGenerator] = [gen1, gen2]
89
90 def generate_rx_correlation(self, sample_rate: float) -> Signal:
91 summed = self.ops[0].generate_rx_correlation(sample_rate)
92 for sig in self.ops[1:]:
93 summed = summed + sig.generate_rx_correlation(sample_rate)
94 return summed
95
96 def __add__(self, other: RxCorrelationGenerator):
97 self.ops.append(other)
98
99 return _Combined(self, other)