⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 numbersink.py

📁 这是用python语言写的一个数字广播的信号处理工具包。利用它
💻 PY
📖 第 1 页 / 共 2 页
字号:
        elif Id == self.id_decimal_places_9:            self.numbersink.set_decimal_places(9)            def on_right_click(self, event):        menu = self.popup_menu        for id, pred in self.checkmarks.items():            item = menu.FindItemById(id)            item.Check(pred())        self.PopupMenu(menu, event.GetPosition())    def build_popup_menu(self):        #self.id_hide_gauge = wx.NewId()        self.id_show_gauge = wx.NewId()        self.id_incr_ref_level = wx.NewId()        self.id_decr_ref_level = wx.NewId()        self.id_incr_decimal_places = wx.NewId()        self.id_decr_decimal_places = wx.NewId()        self.id_decimal_places_0 = wx.NewId()        self.id_decimal_places_1 = wx.NewId()        self.id_decimal_places_2 = wx.NewId()        self.id_decimal_places_3 = wx.NewId()        self.id_decimal_places_6 = wx.NewId()        self.id_decimal_places_9 = wx.NewId()        self.id_average = wx.NewId()        self.id_peak_hold = wx.NewId()        self.Bind(wx.EVT_MENU, self.on_average, id=self.id_average)        self.Bind(wx.EVT_MENU, self.on_peak_hold, id=self.id_peak_hold)        #self.Bind(wx.EVT_MENU, self.on_hide_gauge, id=self.id_hide_gauge)        self.Bind(wx.EVT_MENU, self.on_show_gauge, id=self.id_show_gauge)        self.Bind(wx.EVT_MENU, self.on_incr_ref_level, id=self.id_incr_ref_level)        self.Bind(wx.EVT_MENU, self.on_decr_ref_level, id=self.id_decr_ref_level)        self.Bind(wx.EVT_MENU, self.on_incr_decimal_places, id=self.id_incr_decimal_places)        self.Bind(wx.EVT_MENU, self.on_decr_decimal_places, id=self.id_decr_decimal_places)        self.Bind(wx.EVT_MENU, self.on_decimal_places, id=self.id_decimal_places_0)        self.Bind(wx.EVT_MENU, self.on_decimal_places, id=self.id_decimal_places_1)        self.Bind(wx.EVT_MENU, self.on_decimal_places, id=self.id_decimal_places_2)        self.Bind(wx.EVT_MENU, self.on_decimal_places, id=self.id_decimal_places_3)        self.Bind(wx.EVT_MENU, self.on_decimal_places, id=self.id_decimal_places_6)        self.Bind(wx.EVT_MENU, self.on_decimal_places, id=self.id_decimal_places_9)        # make a menu        menu = wx.Menu()        self.popup_menu = menu        menu.AppendCheckItem(self.id_average, "Average")        menu.AppendCheckItem(self.id_peak_hold, "Peak Hold")        #menu.Append(self.id_hide_gauge, "Hide gauge")        menu.AppendCheckItem(self.id_show_gauge, "Show gauge")        menu.Append(self.id_incr_ref_level, "Incr Ref Level")        menu.Append(self.id_decr_ref_level, "Decr Ref Level")        menu.Append(self.id_incr_decimal_places, "Incr decimal places")        menu.Append(self.id_decr_decimal_places, "Decr decimal places")        menu.AppendSeparator()        # we'd use RadioItems for these, but they're not supported on Mac        menu.AppendCheckItem(self.id_decimal_places_0, "0 decimal places")        menu.AppendCheckItem(self.id_decimal_places_1, "1 decimal places")        menu.AppendCheckItem(self.id_decimal_places_2, "2 decimal places")        menu.AppendCheckItem(self.id_decimal_places_3, "3 decimal places")        menu.AppendCheckItem(self.id_decimal_places_6, "6 decimal places")        menu.AppendCheckItem(self.id_decimal_places_9, "9 decimal places")        self.checkmarks = {            self.id_average : lambda : self.numbersink.average,            self.id_peak_hold : lambda : self.numbersink.peak_hold,#            self.id_hide_gauge : lambda : self.numbersink.hide_gauge,            self.id_show_gauge : lambda : self.numbersink.show_gauge,            self.id_decimal_places_0 : lambda : self.numbersink.decimal_places == 0,            self.id_decimal_places_1 : lambda : self.numbersink.decimal_places == 1,            self.id_decimal_places_2 : lambda : self.numbersink.decimal_places == 2,            self.id_decimal_places_3 : lambda : self.numbersink.decimal_places == 3,            self.id_decimal_places_6 : lambda : self.numbersink.decimal_places == 6,            self.id_decimal_places_9 : lambda : self.numbersink.decimal_places == 9,            }def next_up(v, seq):    """    Return the first item in seq that is > v.    """    for s in seq:        if s > v:            return s    return vdef next_down(v, seq):    """    Return the last item in seq that is < v.    """    rseq = list(seq[:])    rseq.reverse()    for s in rseq:        if s < v:            return s    return v#========================================================================================class number_window (plot.PlotCanvas):    def __init__ (self, numbersink, parent, id = -1,label="number",                  pos = wx.DefaultPosition, size = wx.DefaultSize,                  style = wx.DEFAULT_FRAME_STYLE, name = ""):        plot.PlotCanvas.__init__ (self, parent, id, pos, size, style, name)        #wx.StaticText.__init__(self, parent, id, label, pos, (size[0]/2,size[1]/2), style, name)        #print 'parent',parent        self.static_text=static_text_window( self, numbersink,id, label, pos, (size[0]/2,size[1]/2), style, name)        gauge_style = wx.GA_HORIZONTAL        vbox=wx.BoxSizer(wx.VERTICAL)        vbox.Add (self.static_text, 0, wx.EXPAND)        self.current_value=None        if numbersink.input_is_real:          self.gauge=wx.Gauge( self, id, range=1000, pos=(pos[0],pos[1]+size[1]/2),size=(size[0]/2,size[1]/2), style=gauge_style,  name = "gauge")          vbox.Add (self.gauge, 1, wx.EXPAND)        else:          self.gauge=wx.Gauge( self, id, range=1000, pos=(pos[0],pos[1]+size[1]/3),size=(size[0]/2,size[1]/3), style=gauge_style,  name = "gauge")          #hbox=wx.BoxSizer(wx.HORIZONTAL)          self.gauge_imag=wx.Gauge( self, id, range=1000, pos=(pos[0],pos[1]+size[1]*2/3),size=(size[0]/2,size[1]/3), style=gauge_style,  name = "gauge_imag")          vbox.Add (self.gauge, 1, wx.EXPAND)          vbox.Add (self.gauge_imag, 1, wx.EXPAND)          #vbox.Add (hbox, 1, wx.EXPAND)        self.sizer = vbox        self.SetSizer (self.sizer)        self.SetAutoLayout (True)        self.sizer.Fit (self)        self.label=label        #self.y_range = None        self.numbersink = numbersink        self.peak_hold = False        self.peak_vals = None        #self.SetEnableGrid (True)        # self.SetEnableZoom (True)        # self.SetBackgroundColour ('black')                #self.build_popup_menu()                EVT_DATA_EVENT (self, self.set_data)        wx.EVT_CLOSE (self, self.on_close_window)        #self.Bind(wx.EVT_RIGHT_UP, self.on_right_click)        #self.Bind(wx.EVT_RIGHT_UP, self.on_right_click)        self.input_watcher = input_watcher(numbersink.msgq, numbersink.number_size, self)    def on_close_window (self, event):        print "number_window:on_close_window"        self.keep_running = False    def set_show_gauge(self, enable):        self.show_gauge = enable        if enable:          self.gauge.Show()          if not self.numbersink.input_is_real:            self.gauge_imag.Show()          #print 'show'        else:          self.gauge.Hide()          if not self.numbersink.input_is_real:            self.gauge_imag.Hide()          #print 'hide'    def set_data (self, evt):        numbers = evt.data        L = len (numbers)        if self.peak_hold:            if self.peak_vals is None:                self.peak_vals = numbers            else:                self.peak_vals = numpy.maximum(numbers, self.peak_vals)                numbers = self.peak_vals        if self.numbersink.input_is_real:            real_value=numbers[0]*self.numbersink.factor + self.numbersink.base_value            imag_value=0.0            self.current_value=real_value        else:            real_value=numbers[0]*self.numbersink.factor + self.numbersink.base_value            imag_value=numbers[1]*self.numbersink.factor + self.numbersink.base_value            self.current_value=complex(real_value,imag_value)        #x = max(abs(self.numbersink.sample_rate), abs(self.numbersink.base_value))        x = max(real_value, imag_value)        if x >= 1e9:            sf = 1e-9            unit_prefix = "G"        elif x >= 1e6:            sf = 1e-6            unit_prefix = "M"        elif x>= 1e3:            sf = 1e-3            unit_prefix = "k"        else :            sf = 1            unit_prefix = ""        #self.update_y_range ()        if self.numbersink.input_is_real:          showtext = "%s: %.*f %s%s" % (self.label, self.numbersink.decimal_places,real_value*sf,unit_prefix,self.numbersink.unit)        else:          showtext = "%s: %.*f,%.*f %s%s" % (self.label, self.numbersink.decimal_places,real_value*sf,                                                       self.numbersink.decimal_places,imag_value*sf,unit_prefix,self.numbersink.unit)        self.static_text.SetLabel(showtext)        #print (int(float((real_value-self.numbersink.base_value)*1000.0/(self.numbersink.maxval-self.numbersink.minval)))+500)        self.gauge.SetValue(int(float((real_value-self.numbersink.base_value)*1000.0/(self.numbersink.maxval-self.numbersink.minval)))+500)        if not self.numbersink.input_is_real:          self.gauge.SetValue(int(float((imag_value-self.numbersink.base_value)*1000.0/(self.numbersink.maxval-self.numbersink.minval)))+500)    def set_peak_hold(self, enable):        self.peak_hold = enable        self.peak_vals = None    def update_y_range (self):        ymax = self.numbersink.ref_level        ymin = self.numbersink.ref_level - self.numbersink.decimal_places * self.numbersink.y_divs        self.y_range = self._axisInterval ('min', ymin, ymax)    def on_average(self, evt):        # print "on_average"        self.numbersink.set_average(evt.IsChecked())    def on_peak_hold(self, evt):        # print "on_peak_hold"        self.numbersink.set_peak_hold(evt.IsChecked())# ----------------------------------------------------------------#          	      Deprecated interfaces# ----------------------------------------------------------------# returns (block, win).#   block requires a single input stream of float#   win is a subclass of wxWindowdef make_number_sink_f(fg, parent, label, number_size, input_rate, ymin = 0, ymax=50):        block = number_sink_f(fg, parent, label=label, number_size=number_size, sample_rate=input_rate,                       decimal_places=(ymax - ymin)/8, ref_level=ymax)    return (block, block.win)# returns (block, win).#   block requires a single input stream of gr_complex#   win is a subclass of wxWindowdef make_number_sink_c(fg, parent, label, number_size, input_rate, ymin=0, ymax=50):    block = number_sink_c(fg, parent, label=label, number_size=number_size, sample_rate=input_rate,                       decimal_places=(ymax - ymin)/8, ref_level=ymax)    return (block, block.win)# ----------------------------------------------------------------# Standalone test app# ----------------------------------------------------------------class test_app_flow_graph (stdgui.gui_flow_graph):    def __init__(self, frame, panel, vbox, argv):        stdgui.gui_flow_graph.__init__ (self, frame, panel, vbox, argv)        #number_size = 256        # build our flow graph        input_rate = 20.48e3        # Generate a complex sinusoid        src1 = gr.sig_source_c (input_rate, gr.GR_SIN_WAVE, 2e3, 1)        #src1 = gr.sig_source_c (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1)        # We add these throttle blocks so that this demo doesn't        # suck down all the CPU available.  Normally you wouldn't use these.        thr1 = gr.throttle(gr.sizeof_gr_complex, input_rate)        #sink1 = number_sink_c (self, panel, label="Complex Data", number_size=number_size,        #                    sample_rate=input_rate, base_value=100e3,        #                    ref_level=0, decimal_places=3)        #vbox.Add (sink1.win, 1, wx.EXPAND)        #self.connect (src1, thr1, sink1)        src2 = gr.sig_source_f (input_rate, gr.GR_SIN_WAVE, 2e3, 1)        #src2 = gr.sig_source_f (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1)        thr2 = gr.throttle(gr.sizeof_float, input_rate)        sink2 = number_sink_f (self, panel, unit='Hz',label="Real Data", avg_alpha=0.001,#number_size=number_size*2,                            sample_rate=input_rate, base_value=100e3,                            ref_level=0, decimal_places=3)        vbox.Add (sink2.win, 1, wx.EXPAND)        sink3 = number_sink_c (self, panel, unit='V',label="Complex Data", avg_alpha=0.001,#number_size=number_size*2,                            sample_rate=input_rate, base_value=0,                            ref_level=0, decimal_places=3)        vbox.Add (sink3.win, 1, wx.EXPAND)        self.connect (src2, thr2, sink2)        self.connect (src1, thr1, sink3)def main ():    app = stdgui.stdapp (test_app_flow_graph,                         "Number Sink Test App")    app.MainLoop ()if __name__ == '__main__':    main ()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -