class SlindingTimeFreq(QWidget): def __init__(self, threadacquisition=None, parent = None,): super(SlindingTimeFreq, self).__init__(parent) self.threadacquisition = threadacquisition self.mainlayout = QHBoxLayout() self.setLayout(self.mainlayout) v = QVBoxLayout() self.mainlayout.addLayout(v) self.combo = QComboBox() v.addWidget(self.combo) self.plot = ImagePlot(yreverse=False, lock_aspect_ratio=False,) v.addWidget(self.plot) v = QVBoxLayout() self.mainlayout.addLayout(v) self.spinboxes = { } for param, value in {'xsize':2., 'f_start':1., 'f_stop':80., 'deltafreq' : .5, 'f0':2.5}.items(): spin = QDoubleSpinBox( decimals = 1, singleStep = 0.1, value = value, minimum = 0., maximum = np.inf) self.spinboxes[spin] = param v.addWidget(QLabel(param)) v.addWidget(spin) v.addSpacing(10) spin.valueChanged.connect(self.paramChanged) v.addStretch(4) self.image = None self.xsize = 2. self.paramsTimeFreq = dict( f_start=1., f_stop = 80., deltafreq = .5, sampling_rate = 1./self.threadacquisition.samplingInterval, f0 = 2.5, normalisation = 0., ) self.recreateThread = True self.isComputing = False self.initializeTimeFreq() self.timer = QTimer(singleShot = False, interval = 200) self.timer.timeout.connect(self.refresh) self.timer.start() def initializeTimeFreq(self): self.plot.del_all_items() self.len_wavelet = int(self.xsize/self.threadacquisition.samplingInterval) self.wf = generate_wavelet_fourier(len_wavelet= self.len_wavelet, ** self.paramsTimeFreq).transpose() self.win = hamming(self.len_wavelet) self.map = zeros(self.wf.shape) self.image = make.image(self.map, title='TimeFreq',interpolation ='nearest') self.plot.add_item(self.image) p = self.paramsTimeFreq self.freqs = arange(p['f_start'],p['f_stop'],p['deltafreq']) def paramChanged(self): spin = self.sender() name = self.spinboxes[spin] if name =='xsize': self.xsize = spin.value() self.xsize = min(30., self.xsize) else: self.paramsTimeFreq[name] = spin.value() self.initializeTimeFreq() self.recreateThread = True self.refresh() def refresh(self): if self.combo.count()==0: self.combo.addItems(self.threadacquisition.channelNames) channel = self.combo.currentIndex () if self.isComputing: return sig = self.threadacquisition.buffer[-self.len_wavelet:, channel] if sig.size != self.len_wavelet: print 'xsize too BIG!!', sig.size, self.len_wavelet return self.isComputing = True if self.recreateThread: self.thread = ThreadComputeTF(sig, self.wf, self.win, parent = self) self.thread.finished.connect(self.mapComputed) self.recreateThread = False else: self.thread.sig = sig self.thread.start() def mapComputed(self): xaxis, yaxis = self.plot.get_active_axes() self.plot.setAxisScale(yaxis, self.freqs[0], self.freqs[-1]) self.plot.setAxisScale(xaxis,-self.xsize, 0.) self.image.set_ydata(self.freqs[0], self.freqs[-1]) self.image.set_xdata(-self.xsize, 0.) self.image.set_data(self.map) self.plot.replot() self.isComputing = False