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

📄 usrp_ra_receiver.py

📁 这是用python语言写的一个数字广播的信号处理工具包。利用它
💻 PY
📖 第 1 页 / 共 3 页
字号:
        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 + -