@@ -150,10 +150,28 @@ def fs(self):
150150 return self ._fs
151151
152152 @abstractmethod
153- def gen (self , n , nsamples , amp = None ):
153+ def gen (
154+ self , n , nsamples , min_length_ratio = 0.1 , no_overlap = False , amp = None
155+ ):
156+ """Generate sampled signals
157+
158+ Args:
159+ n (int): Number of signals
160+ nsamples (int): Number of snapshots
161+ min_length_ratio (float): Minimum length ratio of the frequency
162+ range in (f_max - f_min)
163+ no_overlap (bool): If True, generate signals with non-overlapping
164+ subbands
165+ amp (np.array): Amplitude of the signals (1D array of size n), used
166+ to define different amplitudes for different signals.
167+ By default it will generate equal amplitude signal.
168+
169+ Returns:
170+ signal (np.array): Sampled signals
171+ """
154172 raise NotImplementedError
155173
156- def _gen_fre_ranges (self , n , min_length_ratio = 0.3 ):
174+ def _gen_fre_bands (self , n , min_length_ratio = 0.1 ):
157175 """Generate frequency ranges for each boardband signal
158176
159177 Args:
@@ -166,12 +184,41 @@ def _gen_fre_ranges(self, n, min_length_ratio=0.3):
166184 (n, 2)
167185 """
168186 min_length = (self ._f_max - self ._f_min ) * min_length_ratio
169- ranges = np .zeros ((n , 2 ))
187+ bands = np .zeros ((n , 2 ))
170188 for i in range (n ):
171189 length = self ._rng .uniform (min_length , self ._f_max - self ._f_min )
172190 start = self ._rng .uniform (self ._f_min , self ._f_max - length )
173- ranges [i ] = [start , start + length ]
174- return ranges
191+ bands [i ] = [start , start + length ]
192+ return bands
193+
194+ def _generate_non_overlapping_bands (self , n , min_length_ratio = 0.1 ):
195+ """Generate n non-overlapping frequency bands within a specified range.
196+
197+ Args:
198+ n (int): Number of non-overlapping bands to generate.
199+ min_length_ratio (float): Minimum length of each band as a ratio of
200+ the maximum possible length.
201+
202+ Returns:
203+ np.ndarray: An array of shape (n, 2) where each row represents a
204+ frequency band [start, end].
205+ """
206+ max_length = (self ._f_max - self ._f_min ) // n
207+ min_length = max_length * min_length_ratio
208+
209+ bands = np .zeros ((n , 2 ))
210+
211+ for i in range (n ):
212+ length = self ._rng .uniform (min_length , max_length )
213+ start = self ._rng .uniform (
214+ self ._f_min + i * max_length ,
215+ self ._f_min + (i + 1 ) * max_length - length ,
216+ )
217+ new_band = [start , start + length ]
218+
219+ bands [i ] = new_band
220+
221+ return bands
175222
176223
177224class ChirpSignal (BroadSignal ):
@@ -187,9 +234,15 @@ def __init__(self, f_min, f_max, fs, rng=None):
187234 """
188235 super ().__init__ (f_min , f_max , fs , rng = rng )
189236
190- def gen (self , n , nsamples , amp = None ):
237+ def gen (
238+ self , n , nsamples , min_length_ratio = 0.1 , no_overlap = False , amp = None
239+ ):
191240 amp = self ._get_amp (amp , n )
192- fre_ranges = self ._gen_fre_ranges (n )
241+ if no_overlap :
242+ fre_ranges = self ._generate_non_overlapping_bands (
243+ n , min_length_ratio
244+ )
245+ fre_ranges = self ._gen_fre_bands (n , min_length_ratio )
193246
194247 t = np .arange (nsamples ) * 1 / self ._fs
195248 f0 = fre_ranges [:, 0 ]
@@ -222,9 +275,16 @@ def __init__(self, f_min, f_max, fs, ncarriers=100, rng=None):
222275 super ().__init__ (f_min , f_max , fs , rng = rng )
223276 self ._ncarriers = ncarriers
224277
225- def gen (self , n , nsamples , amp = None ):
278+ def gen (
279+ self , n , nsamples , min_length_ratio = 0.1 , no_overlap = False , amp = None
280+ ):
226281 amp = self ._get_amp (amp , n )
227- fre_ranges = self ._gen_fre_ranges (n )
282+ if no_overlap :
283+ fre_ranges = self ._generate_non_overlapping_bands (
284+ n , min_length_ratio
285+ )
286+ else :
287+ fre_ranges = self ._gen_fre_bands (n , min_length_ratio )
228288
229289 # generate random carrier frequencies
230290 fres = self ._rng .uniform (
0 commit comments