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

📄 waterfallsink.py

📁 这是用python语言写的一个数字广播的信号处理工具包。利用它
💻 PY
📖 第 1 页 / 共 2 页
字号:
            pens.append( wx.Pen(colour, 2, wx.SOLID))        return pens            def OnPaint(self, event):        dc = wx.PaintDC(self)        self.DoDrawing(dc)    def DoDrawing(self, dc=None):        if dc is None:            dc = wx.ClientDC(self)        dc.DrawBitmap(self.bm, 0, 0, False )        def const_list(self,const,len):        a = [const]        for i in range(1,len):            a.append(const)        return a    def make_colormap(self):        r = []        r.extend(self.const_list(0,96))        r.extend(range(0,255,4))        r.extend(self.const_list(255,64))        r.extend(range(255,128,-4))                g = []        g.extend(self.const_list(0,32))        g.extend(range(0,255,4))        g.extend(self.const_list(255,64))        g.extend(range(255,0,-4))        g.extend(self.const_list(0,32))                b = range(128,255,4)        b.extend(self.const_list(255,64))        b.extend(range(255,0,-4))        b.extend(self.const_list(0,96))        return (r,g,b)    def set_data (self, evt):        dB = evt.data        L = len (dB)        dc1 = wx.MemoryDC()        dc1.SelectObject(self.bm)        dc1.Blit(0,1,self.fftsink.fft_size,300,dc1,0,0,wx.COPY,False,-1,-1)        x = max(abs(self.fftsink.sample_rate), abs(self.fftsink.baseband_freq))        if x >= 1e9:            sf = 1e-9            units = "GHz"        elif x >= 1e6:            sf = 1e-6            units = "MHz"        else:            sf = 1e-3            units = "kHz"        if self.fftsink.input_is_real:     # only plot 1/2 the points            d_max = L/2            p_width = 2        else:            d_max = L/2            p_width = 1        scale_factor = self.scale_factor        if self.fftsink.input_is_real:     # real fft           for x_pos in range(0, d_max):               value = int(dB[x_pos] * scale_factor)               value = min(255, max(0, value))               dc1.SetPen(self.pens[value])               dc1.DrawRectangle(x_pos*p_width, 0, p_width, 1)         else:                               # complex fft           for x_pos in range(0, d_max):    # positive freqs               value = int(dB[x_pos] * scale_factor)               value = min(255, max(0, value))               dc1.SetPen(self.pens[value])               dc1.DrawRectangle(x_pos*p_width + d_max, 0, p_width, 1)            for x_pos in range(0 , d_max):   # negative freqs               value = int(dB[x_pos+d_max] * scale_factor)               value = min(255, max(0, value))               dc1.SetPen(self.pens[value])               dc1.DrawRectangle(x_pos*p_width, 0, p_width, 1)         self.DoDrawing (None)    def on_average(self, evt):        # print "on_average"        self.fftsink.set_average(evt.IsChecked())    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_incr_ref_level = wx.NewId()        self.id_decr_ref_level = wx.NewId()        self.id_incr_y_per_div = wx.NewId()        self.id_decr_y_per_div = wx.NewId()        self.id_y_per_div_1 = wx.NewId()        self.id_y_per_div_2 = wx.NewId()        self.id_y_per_div_5 = wx.NewId()        self.id_y_per_div_10 = wx.NewId()        self.id_y_per_div_20 = wx.NewId()        self.id_average = wx.NewId()        self.Bind(wx.EVT_MENU, self.on_average, id=self.id_average)        #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_y_per_div, id=self.id_incr_y_per_div)        #self.Bind(wx.EVT_MENU, self.on_decr_y_per_div, id=self.id_decr_y_per_div)        #self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_1)        #self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_2)        #self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_5)        #self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_10)        #self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_20)        # make a menu        menu = wx.Menu()        self.popup_menu = menu        menu.AppendCheckItem(self.id_average, "Average")        # 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_y_per_div, "Incr dB/div")        # menu.Append(self.id_decr_y_per_div, "Decr dB/div")        # menu.AppendSeparator()        # we'd use RadioItems for these, but they're not supported on Mac        #menu.AppendCheckItem(self.id_y_per_div_1, "1 dB/div")        #menu.AppendCheckItem(self.id_y_per_div_2, "2 dB/div")        #menu.AppendCheckItem(self.id_y_per_div_5, "5 dB/div")        #menu.AppendCheckItem(self.id_y_per_div_10, "10 dB/div")        #menu.AppendCheckItem(self.id_y_per_div_20, "20 dB/div")        self.checkmarks = {            self.id_average : lambda : self.fftsink.average            #self.id_y_per_div_1 : lambda : self.fftsink.y_per_div == 1,            #self.id_y_per_div_2 : lambda : self.fftsink.y_per_div == 2,            #self.id_y_per_div_5 : lambda : self.fftsink.y_per_div == 5,            #self.id_y_per_div_10 : lambda : self.fftsink.y_per_div == 10,            #self.id_y_per_div_20 : lambda : self.fftsink.y_per_div == 20,            }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# ----------------------------------------------------------------#          	      Deprecated interfaces# ----------------------------------------------------------------# returns (block, win).#   block requires a single input stream of float#   win is a subclass of wxWindowdef make_waterfall_sink_f(fg, parent, title, fft_size, input_rate):        block = waterfall_sink_f(fg, parent, title=title, fft_size=fft_size,                             sample_rate=input_rate)    return (block, block.win)# returns (block, win).#   block requires a single input stream of gr_complex#   win is a subclass of wxWindowdef make_waterfall_sink_c(fg, parent, title, fft_size, input_rate):    block = waterfall_sink_c(fg, parent, title=title, fft_size=fft_size,                             sample_rate=input_rate)    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)        fft_size = 512        # build our flow graph        input_rate = 20.000e3        # Generate a complex sinusoid        src1 = gr.sig_source_c (input_rate, gr.GR_SIN_WAVE, 5.75e3, 1000)        #src1 = gr.sig_source_c (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1000)        # 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 = waterfall_sink_c (self, panel, title="Complex Data", fft_size=fft_size,                                  sample_rate=input_rate, baseband_freq=100e3)        vbox.Add (sink1.win, 1, wx.EXPAND)        self.connect (src1, thr1, sink1)        # generate a real sinusoid        src2 = gr.sig_source_f (input_rate, gr.GR_SIN_WAVE, 5.75e3, 1000)        #src2 = gr.sig_source_f (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1000)        thr2 = gr.throttle(gr.sizeof_float, input_rate)        sink2 = waterfall_sink_f (self, panel, title="Real Data", fft_size=fft_size,                                  sample_rate=input_rate, baseband_freq=100e3)        vbox.Add (sink2.win, 1, wx.EXPAND)        self.connect (src2, thr2, sink2)def main ():    app = stdgui.stdapp (test_app_flow_graph,                         "Waterfall Sink Test App")    app.MainLoop ()if __name__ == '__main__':    main ()

⌨️ 快捷键说明

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