📄 waterfallsink2.py
字号:
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 make_pens(self): (r,g,b) = self.make_colormap() pens = [] for i in range(0,256): colour = wx.Colour(r[i], g[i], b[i]) 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 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, 2) 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, 2) 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, 2) del dc1 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# ----------------------------------------------------------------# Standalone test app# ----------------------------------------------------------------class test_top_block (stdgui2.std_top_block): def __init__(self, frame, panel, vbox, argv): stdgui2.std_top_block.__init__ (self, frame, panel, vbox, argv) fft_size = 512 # build our flow graph input_rate = 20.000e3 # Generate a complex sinusoid self.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. self.thr1 = gr.throttle(gr.sizeof_gr_complex, input_rate) sink1 = waterfall_sink_c (panel, title="Complex Data", fft_size=fft_size, sample_rate=input_rate, baseband_freq=100e3) self.connect(self.src1, self.thr1, sink1) vbox.Add (sink1.win, 1, wx.EXPAND) # generate a real sinusoid self.src2 = gr.sig_source_f (input_rate, gr.GR_SIN_WAVE, 5.75e3, 1000) self.thr2 = gr.throttle(gr.sizeof_float, input_rate) sink2 = waterfall_sink_f (panel, title="Real Data", fft_size=fft_size, sample_rate=input_rate, baseband_freq=100e3) self.connect(self.src2, self.thr2, sink2) vbox.Add (sink2.win, 1, wx.EXPAND)def main (): app = stdgui2.stdapp (test_top_block, "Waterfall Sink Test App") app.MainLoop ()if __name__ == '__main__': main ()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -