2016-03-21 138 views
0

我必须绘制大量样本(最多4e6个样本)的信号。我使用python 2.7,Qt 4.8和pyqtgraph 0.9.10。scypy.signal.decimate()冻结GUI

我做了这样的事情:

  1. 产生信号和消灭他们(在单独的QThread)
  2. 叠加信号和呼叫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和发生相同的问题。 有人能告诉我这种行为的原因是什么?

回答

0

那么问题出在scipy的版本。我scipy 0.13.2和升级到0.17.0后,问题似乎解决了。不过,我想知道为什么这样的事情是可能的。