0
我必须绘制大量样本(最多4e6个样本)的信号。我使用python 2.7,Qt 4.8和pyqtgraph 0.9.10。scypy.signal.decimate()冻结GUI
我做了这样的事情:
- 产生信号和消灭他们(在单独的QThread)
- 叠加信号和呼叫setDownsample()和clipToView()(pyqtgraph的方法)
问题是,当QThread进行十进制计算时,GUI会冻结。这里是我的代码:
class TestDecimate(QDialog):
def __init__(self, parent=None):
super(TestDecimate, self).__init__(parent)
self.decimate_thread = GenerateBigPlotThread()
layout = QGridLayout()
graph_widget = pg.GraphicsLayoutWidget()
graph_layout = graph_widget.addLayout()
self.p = graph_layout.addPlot(title="Plot 2", col=1, row=2)
self.curve1 = self.p.plot([], pen=(255, 0, 0))
self.curve2 = self.p.plot([], pen=(255, 255, 0))
self.curve3 = self.p.plot([], pen=(255, 0, 255))
self.curve4 = self.p.plot([], pen=(0, 0, 255))
self.p.showGrid(True, True, 0.3)
self.legend = pg.LegendItem(offset=(-10,10))
self.legend.addItem(self.curve1, name="Test")
self.legend.addItem(self.curve2, name="Test1")
self.legend.addItem(self.curve3, name="Test2")
self.legend.addItem(self.curve4, name="Test3")
self.legend.setParentItem(self.p.getViewBox())
self.start_pb = QPushButton("Generate")
layout.addWidget(graph_widget, 1, 1)
layout.addWidget(self.start_pb, 2, 1)
self.setLayout(layout)
self.start_pb.clicked.connect(self.start_thread_for_decimate)
self.decimate_thread.newData.connect(self.set_data)
def set_data(self, y, z, n, m):
print "Plotting"
self.curve1.setData(y)
self.curve2.setData(z)
self.curve3.setData(n)
self.curve4.setData(m)
self.p.setDownsampling(ds=True, auto=True, mode='peak')
self.p.setClipToView(clip=True)
self.p.getViewBox().enableAutoRange(axis=ViewBox.XYAxes)
print "Plotting done"
def start_thread_for_decimate(self):
self.decimate_thread.start()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = TestDecimate()
main.show()
sys.exit(app.exec_())
线程的计算和抽取:
class GenerateBigPlotThread(QThread):
newData = QtCore.pyqtSignal("PyQt_PyObject","PyQt_PyObject","PyQt_PyObject","PyQt_PyObject")
def __init__(self,*arg,**kwargs):
super(GenerateBigPlotThread, self).__init__(*arg,**kwargs)
def run(self):
self.num_points = 4e6
x = np.arange(self.num_points)
y = np.sin(3.14159 * x * 10/self.num_points)
z = np.cos(3.14159 * x * 10/self.num_points)
n = np.sin(3.14159 * x * 5/self.num_points)
m = np.cos(3.14159 * x * 5/self.num_points)
print "Decimate"
y = decimate(y, 4, ftype='fir')
z = decimate(z, 4, ftype='fir')
n = decimate(n, 4, ftype='fir')
m = decimate(m, 4, ftype='fir')
print "Done!"
self.newData.emit(y, z, n, m)
当线程开始看到这个问题的最好办法是将传说。 此外,我尝试scipy.signal.resample(4e6样本到1e6样本),而不是decimate和发生相同的问题。 有人能告诉我这种行为的原因是什么?