Signals¶
Synthetic signal creation tools and builders used by both torchsig.datasets.wideband.NewWideband
and torchsig.datasets.narrowband.NewNarrowband
for dataset creation.
Signal Class Types¶
Signal and Signal Metadata classes.
This module defines the Signal and SignalMetadata classes and their associated functionality, which are used to represent and manipulate signal data and metadata.
Examples
- Signal:
>>> from torchsig.signals import Signal, SignalMetadata >>> d = [1.0, 2.0] >>> m = SignalMetadata(...) >>> new_sig = Signal(data = d, metadata = m)
- class torchsig.signals.signal_types.SignalMetadata(dataset_metadata: DatasetMetadata = None, center_freq: float = None, bandwidth: float = None, start_in_samples: int = None, duration_in_samples: int = None, snr_db: float = None, class_name: str = None, class_index: int = None)[source]¶
Bases:
object
Represents metadata associated with a signal.
- dataset_metadata¶
The dataset metadata for the signal. Defaults to None.
- Type:
- property dataset_metadata: DatasetMetadata¶
Returns the dataset metadata for the signal.
- Returns:
The dataset metadata.
- Return type:
- property start: float¶
Signal start normalized to duration of signal
Returns signal start as a percentage of total time, ex: start=0.5 means the signal starts 50% of the way into the dataset IQ samples.
- Returns:
signal start
- Return type:
- property stop: float¶
Signal stop normalized to duration of signal
Returns signal stop as a percentage of total time, ex: stop=0.5 means the signal stops 50% of the way into the dataset IQ samples.
- Returns:
signal stop
- Return type:
- property duration: float¶
Signal duration (normalized)
Returns signal duration normalized from 0.0 to 1.0
- Returns:
signal duration
- Return type:
- property stop_in_samples: int¶
Signal stop in samples
Returns the index where the signal stops in the dataset IQ.
- Returns:
signal stop
- Return type:
- property upper_freq: float¶
Calculates the upper frequency of a signal
Calculates the upper frequency edge, or highest frequency, associated with the bandwidth of the signal.
- Returns:
upper frequency
- Return type:
- property lower_freq: float¶
Calculates the lower frequency of a signal
Calculates the lower frequency edge, or lowest frequency, associated with the bandwidth of the signal.
- Returns:
lower frequency
- Return type:
- property oversampling_rate: float¶
Calculates the oversampling rate for a signal
Calculates the oversampling rate for a signal. If a signal’s bandwidth is 1/2 the sampling rate, the oversampling rate is 2.
- Returns:
oversampling rate
- Return type:
- property samples_per_baud: float¶
Calculates the samples per baud for a signal
Calculates the samples per baud for some signals. Samples per baud is not universal but is accurate for QAM and PSK modulation familes. If the signal’s bandwidth is 1/2 the sampling rate then the samples per baud is 2.
- Returns:
samples per baud
- Return type:
- deepcopy() SignalMetadata [source]¶
Returns a deep copy of itself
- Returns:
Deep copy of SignalMetadata
- Return type:
- class torchsig.signals.signal_types.Signal(data: ndarray = array([], dtype=float64), metadata: SignalMetadata | None = None)[source]¶
Bases:
object
Initializes the Signal with data and metadata.
- Parameters:
data (np.ndarray, optional) – Signal IQ data. Defaults to np.array([]).
metadata (SignalMetadata, optional) – Signal metadata. Defaults to an empty instance of SignalMetadata().
- verify()[source]¶
Verifies data and metadata are valid.
- Raises:
ValueError – Data or metadata is invalid.
- class torchsig.signals.signal_types.DatasetSignal(data: np.ndarray = array([], dtype=float64), signals: List[Signal] | Signal | List[SignalMetadata] | SignalMetadata | List[Dict[str, Any]] = None, dataset_metadata: DatasetMetadata = None)[source]¶
Bases:
object
DatasetSignal class. Represents a signal within a dataset with metadata.
- data¶
The IQ data of the signal.
- Type:
np.ndarray
- metadata¶
The metadata associated with the signal.
- Type:
List[SignalMetadata]
- Parameters:
data (np.ndarray, optional) – The IQ data for the signal. Defaults to np.array([]).
signals (List[Signal] | Signal | List[SignalMetadata] | SignalMetadata | List[Dict[str, Any]], optional) – The list of signals or metadata objects associated with the dataset signal.
dataset_metadata (DatasetMetadata, optional) – The dataset metadata. Defaults to None.
- verify()[source]¶
Verifies data and metadata are valid.
- Raises:
ValueError – Data or metadata is invalid.
- class torchsig.signals.signal_types.DatasetDict(signal: DatasetSignal)[source]¶
Bases:
object
DatasetDict class. Represents a dictionary containing signal data and metadata.
- data¶
The IQ data of the signal.
- Type:
np.ndarray
- Parameters:
signal (DatasetSignal) – The DatasetSignal instance to extract data and metadata from.
- verify()[source]¶
Verifies data and metadata are valid.
- Raises:
ValueError – Data or metadata is invalid.
Signal Builders¶
Builder¶
Signal and Composite Signal Builders
- Examples
- Signal Builder
>>> from torchsig.signals import SignalBuilder >>> sb = SignalBuilder() >>> sb.data = np.array([1.0, 2.0]) >>> sb.sample_rate = 1.5 >>> ... >>> new_signal = sb.build()
- Composite Signal Builder
>>> from torchsig.signals import CompositeSignalBuilder, SignalBuilder >>> builder1 = SignalBuilder() >>> builder1.data = [1.0, 2.0] >>> ... >>> csb = CompositeSignalBuilder() >>> csb.builders.append(builder1) >>> csb.sample_rate = 2.0 >>> ... >>> new_composite_signal = csb.build()
- class torchsig.signals.builder.Builder(name: str = 'Builder')[source]¶
Bases:
ABC
Abstract builder class for signals
- class torchsig.signals.builder.SignalBuilder(dataset_metadata: DatasetMetadata, class_name: str, **kwargs)[source]¶
-
Signal Builder. Creates a Signal.
- dataset_metadata¶
Dataset metadata for signal.
- Type:
- supported_classes = []¶
- build() Signal [source]¶
Builds and returns Signal
The Builder() __init__ calls reset() which initializes the signal metadata according to default values defined within dataset metadata. _update_metadata() then updates signal-specific metadata fields as needed. _update_data() creates the IQ samples and assigns them to the Signal() data field. _correct_bandwidth_and_snr() sets the power of the signal based on the PSD estimate to have the appropriate SNR and then estimates the total occupied bandwidth of the signal, including sidelobes, to develop a more accurate bounding box. .verify() ensures that the metadata values are withing the appropriate bounds. The Signal() object is then stored for the return call, and reset() is called to reset the signal metadata fields to their dataset metadata defaults.
In order, calls: - _update_metadata() - _update_data() - _correct_bandwidth_and_snr() - _signal.verify() - reset()
- Returns:
Signal being built.
- Return type:
- reset() None [source]¶
Resets _signal according to defaults defined by dataset metadata.
Signal metadata is generated according to the default values as defined by the dataset metadata. The signal data is set to noise samples.
These metadata value can be overridden if a particular modulator or special signal requires it. For example, the bandwidth of a tone is dependent on the signal duration and therefore requires recalculation and an update to the signal metadata inside _update_metadata() in the tone builder class. Similarly, the minimum duration for a constellation based signal must be at least 1 symbol, which requires recomputation in the _update_metadata() field for the constellation builder class.
This method is called by the parent Builder() __init__ and after build().
Specific Signal Builders¶
- class torchsig.signals.builders.ToneSignalBuilder(dataset_metadata: DatasetMetadata, class_name: str = 'tone', **kwargs)[source]¶
Bases:
SignalBuilder
Implements SignalBuilder() for tone waveform.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes = ['tone']¶
- class torchsig.signals.builders.ConstellationSignalBuilder(dataset_metadata: DatasetMetadata, class_name: str, **kwargs)[source]¶
Bases:
SignalBuilder
Implements the Constellation family signal generator.
Implements SignalBuilder() for the linearly modulated constellation-based families: QAM, PSK, PAM, ASK, OOK.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes¶
List of supported signal classes. Set to TorchSigSignalLists.constellation_signals.
- Type:
List[str]
- supported_classes = ['ook', 'bpsk', '4ask', 'qpsk', '8ask', '8psk', '16qam', '16ask', '16psk', '32qam', '32qam_cross', '32ask', '32psk', '64qam', '64ask', '64psk', '128qam_cross', '256qam', '512qam_cross', '1024qam']¶
- class torchsig.signals.builders.TestSignalBuilder(dataset_metadata: DatasetMetadata, class_name: str = 'testsignal', **kwargs)[source]¶
Bases:
SignalBuilder
Implements the test signal generator.
Implements SignalBuilder() for a test waveform which is shaped noise. The waveform is useful in development but is not a practical signal.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes = ['testsignal']¶
- class torchsig.signals.builders.FMSignalBuilder(dataset_metadata: DatasetMetadata, class_name: str = 'fm', **kwargs)[source]¶
Bases:
SignalBuilder
Implements SignalBuilder() for frequency modulation (FM) waveform.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes = ['fm']¶
- class torchsig.signals.builders.AMSignalBuilder(dataset_metadata: DatasetMetadata, class_name='am-dsb-sc', **kwargs)[source]¶
Bases:
SignalBuilder
Implements SignalBuilder() for amplitude modulation (AM) waveform.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes = ['am-dsb-sc', 'am-dsb', 'am-lsb', 'am-usb']¶
- class torchsig.signals.builders.FSKSignalBuilder(dataset_metadata: DatasetMetadata, class_name: str = '2fsk', **kwargs)[source]¶
Bases:
SignalBuilder
Implements SignalBuilder() for frequency shift keying modulation (FSK) waveform.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes = ['2fsk', '2gfsk', '2msk', '2gmsk', '4fsk', '4gfsk', '4msk', '4gmsk', '8fsk', '8gfsk', '8msk', '8gmsk', '16fsk', '16gfsk', '16msk', '16gmsk']¶
- class torchsig.signals.builders.LFMSignalBuilder(dataset_metadata: DatasetMetadata, class_name: str = 'lfm_data', **kwargs)[source]¶
Bases:
SignalBuilder
Implements SignalBuilder() for linear frequency modulation (LFM) waveform.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes = ['lfm_data', 'lfm_radar']¶
- class torchsig.signals.builders.ChirpSSSignalBuilder(dataset_metadata: DatasetMetadata, class_name: str = 'chirpss_data', **kwargs)[source]¶
Bases:
SignalBuilder
Implements SignalBuilder() for chirp spread spectrum waveform.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes = ['chirpss']¶
- class torchsig.signals.builders.OFDMSignalBuilder(dataset_metadata: DatasetMetadata, class_name: str, **kwargs)[source]¶
Bases:
SignalBuilder
Implements the OFDM family signal generator.
Implements SignalBuilder() for the OFDM signals.
- dataset_metadata¶
Parameters describing the dataset required for signal generation.
- Type:
- supported_classes¶
List of supported signal classes. Set to TorchSigSignalLists.ofdm_signals.
- Type:
List[str]
- supported_classes = ['ofdm-64', 'ofdm-72', 'ofdm-128', 'ofdm-180', 'ofdm-256', 'ofdm-300', 'ofdm-512', 'ofdm-600', 'ofdm-900', 'ofdm-1024', 'ofdm-1200', 'ofdm-2048']¶
Signal Modulation Classes¶
Config File that includes dictionaries of signal classes. Includes the default modulations.
- class torchsig.signals.signal_lists.TorchSigSignalLists[source]¶
Bases:
object
Various lists of signals available within TorchSig
- family_dict (dict[str, str]]
List dict which contains all signal types and their associated signal family
- ofdm_signals¶
Orthogonal frequency division multiplexing signals OFDM-64, OFDM-600, OFDM-1024, and others.
- constellation_signals¶
Linearly modulated constellation-based signals, contains QAM, PSK, ASK and OOK signals.
Example
- Access this list::
>>> from torchsig.signals.signal_lists import TorchSigSignalLists >>> TorchSigSignalLists.all_signals >>> TorchSigSignalLists.family_dict
- all_signals: ClassVar[list[str]] = ['ook', 'bpsk', '4ask', 'qpsk', '8ask', '8psk', '16qam', '16ask', '16psk', '32qam', '32qam_cross', '32ask', '32psk', '64qam', '64ask', '64psk', '128qam_cross', '256qam', '512qam_cross', '1024qam', '2fsk', '2gfsk', '2msk', '2gmsk', '4fsk', '4gfsk', '4msk', '4gmsk', '8fsk', '8gfsk', '8msk', '8gmsk', '16fsk', '16gfsk', '16msk', '16gmsk', 'ofdm-64', 'ofdm-72', 'ofdm-128', 'ofdm-180', 'ofdm-256', 'ofdm-300', 'ofdm-512', 'ofdm-600', 'ofdm-900', 'ofdm-1024', 'ofdm-1200', 'ofdm-2048', 'fm', 'am-dsb-sc', 'am-dsb', 'am-lsb', 'am-usb', 'lfm_data', 'lfm_radar', 'chirpss', 'tone']¶
- family_dict: ClassVar[Dict[str, str]] = {'1024qam': 'qam', '128qam_cross': 'qam', '16ask': 'ask', '16fsk': 'fsk', '16gfsk': 'fsk', '16gmsk': 'fsk', '16msk': 'fsk', '16psk': 'psk', '16qam': 'qam', '256qam': 'qam', '2fsk': 'fsk', '2gfsk': 'fsk', '2gmsk': 'fsk', '2msk': 'fsk', '32ask': 'ask', '32psk': 'psk', '32qam': 'qam', '32qam_cross': 'qam', '4ask': 'ask', '4fsk': 'fsk', '4gfsk': 'fsk', '4gmsk': 'fsk', '4msk': 'fsk', '512qam_cross': 'qam', '64ask': 'ask', '64psk': 'psk', '64qam': 'qam', '8ask': 'ask', '8fsk': 'fsk', '8gfsk': 'fsk', '8gmsk': 'fsk', '8msk': 'fsk', '8psk': 'psk', 'am-dsb': 'am', 'am-dsb-sc': 'am', 'am-lsb': 'am', 'am-usb': 'am', 'bpsk': 'psk', 'chirpss': 'chirp', 'fm': 'fm', 'lfm_data': 'chirp', 'lfm_radar': 'chirp', 'ofdm-1024': 'ofdm', 'ofdm-1200': 'ofdm', 'ofdm-128': 'ofdm', 'ofdm-180': 'ofdm', 'ofdm-2048': 'ofdm', 'ofdm-256': 'ofdm', 'ofdm-300': 'ofdm', 'ofdm-512': 'ofdm', 'ofdm-600': 'ofdm', 'ofdm-64': 'ofdm', 'ofdm-72': 'ofdm', 'ofdm-900': 'ofdm', 'ook': 'ook', 'qpsk': 'psk', 'tone': 'tone'}¶
- family_list: ClassVar[list[str]] = ['am', 'ask', 'chirp', 'fm', 'fsk', 'ofdm', 'ook', 'psk', 'qam', 'tone']¶
- fsk_signals = ['2fsk', '2gfsk', '2msk', '2gmsk', '4fsk', '4gfsk', '4msk', '4gmsk', '8fsk', '8gfsk', '8msk', '8gmsk', '16fsk', '16gfsk', '16msk', '16gmsk']¶
- ofdm_signals = ['ofdm-64', 'ofdm-72', 'ofdm-128', 'ofdm-180', 'ofdm-256', 'ofdm-300', 'ofdm-512', 'ofdm-600', 'ofdm-900', 'ofdm-1024', 'ofdm-1200', 'ofdm-2048']¶
- constellation_signals = ['ook', 'bpsk', '4ask', 'qpsk', '8ask', '8psk', '16qam', '16ask', '16psk', '32qam', '32qam_cross', '32ask', '32psk', '64qam', '64ask', '64psk', '128qam_cross', '256qam', '512qam_cross', '1024qam']¶
- am_signals = ['am-dsb-sc', 'am-dsb', 'am-lsb', 'am-usb']¶
- fm_signals = ['fm']¶
- lfm_signals = ['lfm_data', 'lfm_radar']¶
- chirpss_signals = ['chirpss']¶
- tone_signals = ['tone']¶
- fsk_names = ['fsk', 'msk']¶
- ofdm_names = ['ofdm']¶
- constellation_names = ['ask', 'qam', 'psk', 'ook']¶
- am_names = ['am-dsb', 'am-lsb', 'am-usb']¶
- lfm_names = ['lfm_']¶
- ofdm_subcarrier_modulations = ['bpsk', 'qpsk', '16qam', '64qam', '256qam', '1024qam']¶
- name = 'tone'¶