Signal builders combine modulation functions with a subclass of torchsig.signals.builder.BaseSignalGenerator.
Implementation Steps:
- Modulation Functions: Place these in focused modules under
torchsig/signals/builders/. They should perform the waveform math, accept explicit parameters (sample counts, rates, etc.), and return a 1D NumPy array (ideally TorchSigComplexDataType). Avoid global random state. - Generator Class: Inherit from
BaseSignalGenerator.- Define
required_metadata_fields. - Use
set_default_class_name("name") to set a stable class name. - Implement
generate(), which must return a torchsig.signals.signal_types.Signal containing waveform data and accurate metadata. - Access metadata via
self["field_name"] to allow inheritance from parent datasets.
Registration:
To make a builder selectable by name in torchsig.datasets.datasets.TorchSigIterableDataset, you must update:
torchsig/utils/signal_building.py: Add to signal_generator_lookup_table using _add_signal_generator._family_name and family_names for new families.torchsig/signals/signal_lists.py: Add to CLASS_FAMILY_DICT and extend TorchSigSignalLists if necessary.- Export the class/functions in the module's
__all__.
class ExampleSignalGenerator(BaseSignalGenerator):
"""Generate an example waveform."""
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)
self.required_metadata_fields = [
"signal_duration_in_samples_min",
"signal_duration_in_samples_max",
]
self.set_default_class_name("example")
def generate(self) -> Signal:
num_samples = self.random_generator.integers(
self["signal_duration_in_samples_min"],
self["signal_duration_in_samples_max"] + 1,
)
data = example_modulator(num_samples, rng=self.random_generator)
return Signal(data=data, center_freq=0, bandwidth=1)