Source code for hum.utils.infinite_waveform

"""
Simple infinite waveform
"""
import random
import numpy as np


[docs]class InfiniteWaveform(object): """ A tiny little class emulating an infinite waveform with a given spectrum. Note that if choosing to add noise to the waveform, the generator will be considerably slower """ def __init__(self, gen_spectrum, noise_amp=None): """ noise_amp is the amplitude of the random noise added to the waveform, proportionally to the range of amplitude in the signal """ self.reconstituted_wf = np.fft.irfft(gen_spectrum) self.noise_amp = noise_amp if noise_amp: max_signal = np.max(self.reconstituted_wf) min_signal = np.min(self.reconstituted_wf) max_amp = max_signal - min_signal self.noise_amp = max_amp * noise_amp else: self.noise_amp = 0 self.win_size = len(self.reconstituted_wf)
[docs] def query(self, bt, tt): """ Returns a generator of the infinite waveform from bt to tt """ if not self.noise_amp: for i in range(bt, tt): yield self.reconstituted_wf[i % self.win_size] else: # a random seed is chosen for each i, this allows for consistency between queries # the drawback is that it slows down the iterator quite a bit: 30 times slower for 1 millions samples for i in range(bt, tt): random.seed(a=i) noise = random.random() * self.noise_amp yield self.reconstituted_wf[i % self.win_size] + noise
def __getitem__(self, idx): random.seed(a=idx) return ( self.reconstituted_wf[idx % self.win_size] + random.random() * self.noise_amp )