Source code for denspp.offline.data_generator.waveform_dataset
import numpy as np
from dataclasses import dataclass
from copy import deepcopy
from .waveform_generator import WaveformGenerator
from denspp.offline.analog.dev_noise import SettingsNoise, RecommendedSettingsNoise
[docs]
@dataclass
class SettingsWaveformDataset:
"""Settings Class for building the Waveform Dataset
Attributes:
wfg_type: List with waveform type
wfg_freq: List with frequencies of each waveform
num_samples: Number of samples for each class
time_idle: Additional time window at the beginning and ending of each sample with zero values [in %]
scale_amp: Scaling factor for all amplitudes
sampling_rate: Sampling rate of waveforms
noise_add: Boolean for adding noise to waveforms
noise_pwr_db: Float
do_normalize: Boolean for normalizing the RMS of all waveforms to have same charge injection
"""
wfg_type: list
wfg_freq: list
num_samples: int
time_idle: float
scale_amp: float
sampling_rate: float
noise_add: bool
noise_pwr_db: float
do_normalize: bool
DefaultSettingsWaveformDataset = SettingsWaveformDataset(
wfg_type=['RECT', 'LIN_RISE', 'LIN_FALL', 'SINE_HALF', 'SINE_HALF_INV', 'SINE_FULL', 'TRI_HALF', 'TRI_FULL', 'SAW_POS', 'SAW_NEG', 'GAUSS'],
wfg_freq=[1e2, 1e2, 1e2, 1e2, 1e2, 1e2, 1e2, 1e2, 1e2, 1e2, 1e2],
num_samples=1000,
time_idle=20,
scale_amp=1.0,
sampling_rate=20e3,
noise_add=True,
noise_pwr_db=-30.0,
do_normalize=False
)
[docs]
def build_waveform_dataset(settings_data: SettingsWaveformDataset, settings_noise: SettingsNoise=RecommendedSettingsNoise) -> dict:
"""Building a dataset of different waveform styles
:param settings_data: Class for generating the dataset
:param settings_noise: Dataclass for handling the noise behaviour
:returns: Returning a Dictionary with ['data', 'label', and 'dict']
"""
assert len(settings_data.wfg_type) == len(settings_data.wfg_freq), "List have not the same length"
settings0 = deepcopy(settings_noise)
settings0.wgn_dB = settings_data.noise_pwr_db
wfg_generator = WaveformGenerator(
sampling_rate=settings_data.sampling_rate,
add_noise=settings_data.noise_add,
settings_noise=settings0
)
# --- Generation of signal
num_class_samples = settings_data.num_samples
num_total_samples = len(settings_data.wfg_type) * num_class_samples
t_window = (2 * settings_data.time_idle / 100 + 1) / np.array(settings_data.wfg_freq).min()
waveforms_signals = np.zeros((num_total_samples, int(settings_data.sampling_rate * t_window)), dtype=float)
waveforms_classes = np.zeros((num_total_samples,), dtype=int)
waveforms_rms = np.zeros(num_total_samples, )
for idx, (sel_wfg, freq_wfg) in enumerate(zip(settings_data.wfg_type, settings_data.wfg_freq)):
for num_ite in range(0, settings_data.num_samples):
waveform = wfg_generator.generate_waveform(
time_points=[settings_data.time_idle / 100 / freq_wfg],
time_duration=[1 / freq_wfg],
waveform_select=[sel_wfg],
polarity_cathodic=[False]
)
signal = waveform['sig'] if not settings_data.do_normalize else waveform['sig'] / waveform['rms']
waveforms_signals[idx * num_class_samples + num_ite, :] = settings_data.scale_amp * signal
waveforms_classes[idx * num_class_samples + num_ite] = idx
waveforms_rms[idx * num_class_samples + num_ite] = waveform['rms']
# --- Getting dictionary of signal type
waveforms_dict = [type for type in settings_data.wfg_type if type in wfg_generator.get_dictionary_classes()]
return {'data': waveforms_signals, 'label': waveforms_classes, 'dict': waveforms_dict}