source: fact/tools/pyscripts/pyfact/generator.py@ 13117

Last change on this file since 13117 was 12986, checked in by neise, 13 years ago
generator now allows for more than one spike .... generator option string changedsvn diff extractor.py | colordiff ! so I had to change it in extractor as well... sorry
  • Property svn:executable set to *
File size: 4.5 KB
Line 
1#!/usr/bin/python
2#
3# Dominik Neise, Werner Lustermann
4# TU Dortmund, ETH Zurich
5#
6import numpy as np
7import matplotlib.pyplot as plt
8
9class SignalGenerator(object):
10 """ Signal Generator
11 generates signals for testing several helper classes like:
12 * fir filters
13 * signal extractors
14 """
15
16 def __init__(self, option_str = 'len 100 noise 3', name = 'SignalGenerator'):
17 """ initialize the generator
18 sets default signal to generate
19 """
20 self.option_str = option_str.lower()
21 self.options = make_options_from_str(option_str)
22 self.parse_options()
23 self.name = name
24
25 def parse_options(self):
26 o = self.options #shortcut
27 if 'len' in o:
28 self.npoints = int(o['len'][0])
29 else:
30 self.npoints = 100
31 if 'noise' in o:
32 self.sigma = float(o['noise'][0])
33 else:
34 self.sigma = 1
35 if 'bsl' in o:
36 self.bsl = float(o['bsl'][0])
37 else:
38 self.bsl = -0.5
39
40 if 'step' in o:
41 self.step_height = float(o['step'][0])
42 self.step_start = int(o['step'][1])
43 self.step_stop = int(o['step'][2])
44
45 if 'triangle' in o:
46 self.pulses = []
47 # append 1st pulse to list of pulses
48 self.pulses.append( ( float(o['triangle'][0]) , float(o['triangle'][1]), int(o['triangle'][2]), int(o['triangle'][3]) ) )
49 number_of_pulses_after_1st = (len(o['triangle'])-4)/2
50 for i in range(number_of_pulses_after_1st):
51 self.pulses.append( ( float(o['triangle'][2*i+4]) , float(o['triangle'][2*i+5]), int(o['triangle'][2]), int(o['triangle'][3]) ) )
52
53 if 'spike' in o:
54 self.spikes = []
55 for i in range(len(o['spike'])/2):
56 self.spikes.append( ( int(o['spike'][2*i]), float(o['spike'][2*i+1]) ) )
57
58 def __call__(self, option_str = ''):
59 if option_str:
60 self.option_str = option_str.lower()
61 self.options = make_options_from_str(self.option_str)
62 self.parse_options()
63
64 signal = np.zeros(self.npoints)
65 signal += self.bsl
66 signal += np.random.randn(self.npoints) * self.sigma
67 if 'step' in self.options:
68 signal[self.step_start:self.step_stop] += self.step_height
69 if 'triangle' in self.options:
70 for pulse in self.pulses:
71 pos = pulse[0]
72 height = pulse[1]
73 rise = pulse[2]
74 fall = pulse[3]
75 start = pos - rise
76 stop = pos + fall
77 signal[start:pos] += np.linspace(0., height, rise)
78 signal[pos:stop] += np.linspace(height, 0. , fall)
79 if 'spike' in self.options:
80 for spike in self.spikes:
81 signal[spike[0]] += spike[1]
82 return signal
83
84 def __str__(self):
85 s = self.name + '\n'
86 s += 'possible options and parameters\n'
87 s += ' * len: number of samples (100)\n'
88 s += ' * noise: sigma (1)\n'
89 s += ' * bsl: level (-0.5)\n'
90 s += ' * step: height, start, end\n'
91 s += ' * triangle: pos height risingedge, fallingedge [pos height ...]\n'
92 s += ' * spike: pos height [pos height ...]\n'
93
94 s += 'current options are:\n'
95 for key in self.options.keys():
96 s += key + ':' + str(self.options[key]) + '\n'
97 return s
98
99
100# Helper function to parse signalname and create a dictionary
101# dictionary layout :
102# key : string
103# value : [list of parameters]
104def make_options_from_str(signalname):
105 options = {}
106 for word in (signalname.lower()).split():
107 if word.isalpha():
108 current_key = word
109 options[current_key] = []
110# if word.isdigit():
111 else:
112 options[current_key].append(word)
113# else:
114# print '-nothing'
115 return options
116
117def plotter(signal, text):
118 x=range(len(signal))
119 ax = plt.plot(x, signal, 'b.', label='signal')
120 plt.title('test of SignalGenerator with option string:\n' + text)
121 plt.xlabel('sample')
122 plt.legend()
123 plt.grid(True)
124 plt.show()
125
126if __name__ == '__main__':
127 """ test the class """
128 myGenerator = SignalGenerator('len 400 noise 0.3 bsl -2.5 triangle 50 10.2 10 100 65 10 150 20 180 10 250 10 spike 100 50. 20 50 21 49')
129 sig = myGenerator()
130 print myGenerator
131 plotter(sig, myGenerator.option_str)
Note: See TracBrowser for help on using the repository browser.