📄 usrp_ra_receiver.py
字号:
if self.setimode == False: if (self.use_notches == True): self.connect(self.notch_filt, self.detector, self.integrator1, self.integrator2, self.integrator3, self.cal_mult, self.cal_offs, self.chart) else: self.connect(self.u, self.detector, self.integrator1, self.integrator2, self.integrator3, self.cal_mult, self.cal_offs, self.chart) # current instantaneous integrated detector value self.connect(self.cal_offs, self.probe) self._build_gui(vbox) # Make GUI agree with command-line self.integ = options.integ if self.setimode == False: self.myform['integration'].set_value(int(options.integ)) self.myform['offset'].set_value(self.calib_offset) self.myform['dcgain'].set_value(self.calib_coeff) self.myform['average'].set_value(int(options.avg)) if self.setimode == False: # Make integrator agree with command line self.set_integration(int(options.integ)) self.avg_alpha = options.avg # Make spectral averager agree with command line if options.avg != 1.0: self.scope.set_avg_alpha(float(1.0/options.avg)) self.scope.set_average(True) if self.setimode == False: # Set division size self.chart.set_y_per_div(options.division) # Set reference(MAX) level self.chart.set_ref_level(options.reflevel) # set initial values if options.gain is None: # if no gain was specified, use the mid-point in dB g = self.subdev.gain_range() options.gain = float(g[0]+g[1])/2 if options.freq is None: # if no freq was specified, use the mid-point r = self.subdev.freq_range() options.freq = float(r[0]+r[1])/2 # Set the initial gain control self.set_gain(options.gain) if not(self.set_freq(options.freq)): self._set_status_msg("Failed to set initial frequency") # Set declination self.set_decln (self.decln) # RF hardware information self.myform['decim'].set_value(self.u.decim_rate()) self.myform['fs@usb'].set_value(self.u.adc_freq() / self.u.decim_rate()) self.myform['dbname'].set_value(self.subdev.name()) # Set analog baseband filtering, if DBS_RX if self.cardtype in (usrp_dbid.DBS_RX, usrp_dbid.DBS_RX_REV_2_1): lbw = (self.u.adc_freq() / self.u.decim_rate()) / 2 if lbw < 1.0e6: lbw = 1.0e6 self.subdev.set_bw(lbw) # Start the timer for the LMST display and datalogging self.lmst_timer.Start(1000) def _set_status_msg(self, msg): self.frame.GetStatusBar().SetStatusText(msg, 0) def _build_gui(self, vbox): def _form_set_freq(kv): # Adjust current SETI frequency, and limits self.setifreq_lower = kv['freq'] - (self.seti_freq_range/2) self.setifreq_current = kv['freq'] self.setifreq_upper = kv['freq'] + (self.seti_freq_range/2) # Reset SETI analysis timer self.seti_then = time.time() # Zero-out hits array when changing frequency self.hits_array[:,:] = 0.0 self.hit_intensities[:,:] = -60.0 return self.set_freq(kv['freq']) def _form_set_decln(kv): return self.set_decln(kv['decln']) # Position the FFT display vbox.Add(self.scope.win, 15, wx.EXPAND) if self.setimode == False: # Position the Total-power stripchart vbox.Add(self.chart.win, 15, wx.EXPAND) # add control area at the bottom self.myform = myform = form.form() hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add((7,0), 0, wx.EXPAND) vbox1 = wx.BoxSizer(wx.VERTICAL) myform['freq'] = form.float_field( parent=self.panel, sizer=vbox1, label="Center freq", weight=1, callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg)) vbox1.Add((4,0), 0, 0) myform['lmst_high'] = form.static_text_field( parent=self.panel, sizer=vbox1, label="Current LMST", weight=1) vbox1.Add((4,0), 0, 0) if self.setimode == False: myform['spec_data'] = form.static_text_field( parent=self.panel, sizer=vbox1, label="Spectral Cursor", weight=1) vbox1.Add((4,0), 0, 0) vbox2 = wx.BoxSizer(wx.VERTICAL) if self.setimode == False: vbox3 = wx.BoxSizer(wx.VERTICAL) g = self.subdev.gain_range() myform['gain'] = form.slider_field(parent=self.panel, sizer=vbox2, label="RF Gain", weight=1, min=int(g[0]), max=int(g[1]), callback=self.set_gain) vbox2.Add((4,0), 0, 0) if self.setimode == True: max_savg = 100 else: max_savg = 3000 myform['average'] = form.slider_field(parent=self.panel, sizer=vbox2, label="Spectral Averaging (FFT frames)", weight=1, min=1, max=max_savg, callback=self.set_averaging) # Set up scan control button when in SETI mode if (self.setimode == True): # SETI scanning control buttonbox = wx.BoxSizer(wx.HORIZONTAL) self.scan_control = form.button_with_callback(self.panel, label="Scan: On ", callback=self.toggle_scanning) buttonbox.Add(self.scan_control, 0, wx.CENTER) vbox2.Add(buttonbox, 0, wx.CENTER) vbox2.Add((4,0), 0, 0) if self.setimode == False: myform['integration'] = form.slider_field(parent=self.panel, sizer=vbox2, label="Continuum Integration Time (sec)", weight=1, min=1, max=180, callback=self.set_integration) vbox2.Add((4,0), 0, 0) myform['decln'] = form.float_field( parent=self.panel, sizer=vbox2, label="Current Declination", weight=1, callback=myform.check_input_and_call(_form_set_decln)) vbox2.Add((4,0), 0, 0) if self.setimode == False: myform['offset'] = form.slider_field(parent=self.panel, sizer=vbox3, label="Post-Detector Offset", weight=1, min=-750, max=750, callback=self.set_pd_offset) vbox3.Add((2,0), 0, 0) myform['dcgain'] = form.slider_field(parent=self.panel, sizer=vbox3, label="Post-Detector Gain", weight=1, min=1, max=100, callback=self.set_pd_gain) vbox3.Add((2,0), 0, 0) hbox.Add(vbox1, 0, 0) hbox.Add(vbox2, wx.ALIGN_RIGHT, 0) if self.setimode == False: hbox.Add(vbox3, wx.ALIGN_RIGHT, 0) vbox.Add(hbox, 0, wx.EXPAND) self._build_subpanel(vbox) self.lmst_timer = wx.PyTimer(self.lmst_timeout) #self.lmst_timeout() def _build_subpanel(self, vbox_arg): # build a secondary information panel (sometimes hidden) # FIXME figure out how to have this be a subpanel that is always # created, but has its visibility controlled by foo.Show(True/False) if not(self.show_debug_info): return panel = self.panel vbox = vbox_arg myform = self.myform #panel = wx.Panel(self.panel, -1) #vbox = wx.BoxSizer(wx.VERTICAL) hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add((5,0), 0) myform['decim'] = form.static_float_field( parent=panel, sizer=hbox, label="Decim") hbox.Add((5,0), 1) myform['fs@usb'] = form.static_float_field( parent=panel, sizer=hbox, label="Fs@USB") hbox.Add((5,0), 1) myform['dbname'] = form.static_text_field( parent=panel, sizer=hbox) hbox.Add((5,0), 1) myform['baseband'] = form.static_float_field( parent=panel, sizer=hbox, label="Analog BB") hbox.Add((5,0), 1) myform['ddc'] = form.static_float_field( parent=panel, sizer=hbox, label="DDC") hbox.Add((5,0), 0) vbox.Add(hbox, 0, wx.EXPAND) def set_freq(self, target_freq): """ Set the center frequency we're interested in. @param target_freq: frequency in Hz @rypte: bool Tuning is a two step process. First we ask the front-end to tune as close to the desired frequency as it can. Then we use the result of that operation and our target_frequency to determine the value for the digital down converter. """ # # Everything except BASIC_RX should support usrp.tune() # if not (self.cardtype == usrp_dbid.BASIC_RX): r = usrp.tune(self.u, 0, self.subdev, target_freq) else: r = self.u.set_rx_freq(0, target_freq) f = self.u.rx_freq(0) if abs(f-target_freq) > 2.0e3: r = 0 if r: self.myform['freq'].set_value(target_freq) # update displayed value # # Make sure calibrator knows our target freq # # Remember centerfreq---used for doppler calcs delta = self.centerfreq - target_freq self.centerfreq = target_freq self.observing -= delta self.scope.set_baseband_freq (self.observing) self.myform['baseband'].set_value(r.baseband_freq) self.myform['ddc'].set_value(r.dxc_freq) if self.use_notches == True: self.compute_notch_taps(self.notches) self.notch_filt.set_taps(self.notch_taps) return True return False def set_decln(self, dec): self.decln = dec self.myform['decln'].set_value(dec) # update displayed value def set_gain(self, gain): self.myform['gain'].set_value(gain) # update displayed value self.subdev.set_gain(gain) self.gain = gain def set_averaging(self, avval): self.myform['average'].set_value(avval) self.scope.set_avg_alpha(1.0/(avval)) self.scope.set_average(True) self.avg_alpha = avval def set_integration(self, integval): if self.setimode == False: self.integrator3.set_taps(1.0/integval) self.myform['integration'].set_value(integval) self.integ = integval # # Timeout function # Used to update LMST display, as well as current # continuum value # # We also write external data-logging files here # def lmst_timeout(self): self.locality.date = ephem.now() if self.setimode == False: x = self.probe.level() sidtime = self.locality.sidereal_time() # LMST s = str(ephem.hours(sidtime)) + " " + self.sunstate # Continuum detector value if self.setimode == False: sx = "%7.4f" % x s = s + "\nDet: " + str(sx) else: sx = "%2d" % self.hitcounter s1 = "%2d" % self.s1hitcounter s2 = "%2d" % self.s2hitcounter sa = "%4.2f" % self.avgdelta sy = "%3.1f-%3.1f" % (self.CHIRP_LOWER, self.CHIRP_UPPER) s = s + "\nHits: " + str(sx) + "\nS1:" + str(s1) + " S2:" + str(s2) s = s + "\nAv D: " + str(sa) + "\nCh lim: " + str(sy) self.myform['lmst_high'].set_value(s) # # Write data out to recording files # if self.setimode == False: self.write_continuum_data(x,sidtime) self.write_spectral_data(self.fft_outbuf,sidtime) else: self.seti_analysis(self.fft_outbuf,sidtime) now = time.time() if ((self.scanning == True) and ((now - self.seti_then) > self.setifreq_timer)): self.seti_then = now self.setifreq_current = self.setifreq_current + self.fft_input_rate if (self.setifreq_current > self.setifreq_upper): self.setifreq_current = self.setifreq_lower self.set_freq(self.setifreq_current) # Make sure we zero-out the hits array when changing # frequency. self.hits_array[:,:] = 0.0 self.hit_intensities[:,:] = 0.0 def fft_outfunc(self,data,l): self.fft_outbuf=data def write_continuum_data(self,data,sidtime): # Create localtime structure for producing filename foo = time.localtime() pfx = self.prefix filenamestr = "%s/%04d%02d%02d%02d" % (pfx, foo.tm_year, foo.tm_mon, foo.tm_mday, foo.tm_hour) # Open the data file, appending continuum_file = open (filenamestr+".tpdat","a")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -