예제 #1
0
    def update_grid(self, *args):
        """
		Update the plotter grid.
		This update method is dependent on the variables below.
		Determine the x and y axis grid parameters.
		The x axis depends on sample rate, baseband freq, and x divs.
		The y axis depends on y per div, y divs, and ref level.
		"""
        # grid parameters
        # sample_rate = self[SAMPLE_RATE_KEY]
        frame_rate = 1.0  # self[FRAME_RATE_KEY]
        # if frame_rate < 1.0:
        # 	frame_rate = 1.0
        x_offset = self[BASEBAND_FREQ_KEY]
        num_lines = self[NUM_LINES_KEY]
        y_divs = self[Y_DIVS_KEY]
        x_divs = self[X_DIVS_KEY]
        # determine best fitting x_per_div
        x_width = self.data_len  # sample_rate/1.0
        x_per_div = common.get_clean_num(x_width / x_divs)
        # update the x grid
        self.plotter.set_x_grid(x_offset, x_offset + self.data_len, x_per_div, True)  # sample_rate/2.0,
        # update x units
        self.plotter.set_x_label("Data", "points")
        # update y grid
        duration = float(num_lines) / frame_rate
        y_per_div = common.get_clean_num(duration / y_divs)
        self.plotter.set_y_grid(0, duration, y_per_div, True)
        # update y units
        self.plotter.set_y_label("Time", "s")
        # update plotter
        self.plotter.update()
예제 #2
0
	def update_grid(self):
		#update the x axis
		x_max = 1.75
		self.plotter.set_x_grid(-x_max, x_max, common.get_clean_num(2.0*x_max/self[X_DIVS_KEY]))
		#update the y axis
		y_max = 1.75
		self.plotter.set_y_grid(-y_max, y_max, common.get_clean_num(2.0*y_max/self[Y_DIVS_KEY]))
		#update plotter
		self.plotter.update()
예제 #3
0
 def update_grid(self):
     #update the x axis
     x_max = 1.75
     self.plotter.set_x_grid(
         -x_max, x_max,
         common.get_clean_num(2.0 * x_max / self[X_DIVS_KEY]))
     #update the y axis
     y_max = 1.75
     self.plotter.set_y_grid(
         -y_max, y_max,
         common.get_clean_num(2.0 * y_max / self[Y_DIVS_KEY]))
     #update plotter
     self.plotter.update()
예제 #4
0
 def autoscale(self, *args):
     """
     Autoscale the plot to the last frame.
     Set the dynamic range and reference level.
     """
     if not len(self.samples):
         return
     min_level, max_level = common.get_min_max_fft(self.samples)
     #set the range to a clean number of the dynamic range
     self[constants.Y_PER_DIV_KEY] = common.get_clean_num(1+(max_level - min_level)/self[constants.Y_DIVS_KEY])
     #set the reference level to a multiple of y per div
     self[constants.REF_LEVEL_KEY] = self[constants.Y_PER_DIV_KEY]*round(.5+max_level/self[constants.Y_PER_DIV_KEY])
    def update_grid(self, *args):
        """
		Update the plotter grid.
		This update method is dependent on the variables below.
		Determine the x and y axis grid parameters.
		The x axis depends on sample rate, baseband freq, and x divs.
		The y axis depends on y per div, y divs, and ref level.
		"""
        for trace in TRACES:
            channel = '%s' % trace.upper()
            if self[TRACE_SHOW_KEY + trace]:
                self.plotter.set_waveform(
                    channel=channel,
                    samples=self._traces[trace],
                    color_spec=TRACES_COLOR_SPEC[trace],
                )
            else:
                self.plotter.clear_waveform(channel=channel)
        #grid parameters
        sample_rate = self[SAMPLE_RATE_KEY]
        baseband_freq = self[BASEBAND_FREQ_KEY]
        y_per_div = self[Y_PER_DIV_KEY]
        y_divs = self[Y_DIVS_KEY]
        x_divs = self[X_DIVS_KEY]
        ref_level = self[REF_LEVEL_KEY]
        #determine best fitting x_per_div
        if self.real: x_width = sample_rate / 2.0
        else: x_width = sample_rate / 1.0
        x_per_div = common.get_clean_num(x_width / x_divs)
        #update the x grid
        if self.real:
            self.plotter.set_x_grid(
                baseband_freq,
                baseband_freq + sample_rate / 2.0,
                x_per_div,
                True,
            )
        else:
            self.plotter.set_x_grid(
                baseband_freq - sample_rate / 2.0,
                baseband_freq + sample_rate / 2.0,
                x_per_div,
                True,
            )
        #update x units
        self.plotter.set_x_label('Frequency', 'Hz')
        #update y grid
        self.plotter.set_y_grid(ref_level - y_per_div * y_divs, ref_level,
                                y_per_div)
        #update y units
        self.plotter.set_y_label('Amplitude', 'dB')
        #update plotter
        self.plotter.update()
예제 #6
0
    def update_grid(self, *args):
        """
		Update the plotter grid.
		This update method is dependent on the variables below.
		Determine the x and y axis grid parameters.
		The x axis depends on sample rate, baseband freq, and x divs.
		The y axis depends on y per div, y divs, and ref level.
		"""
        #grid parameters
        #sample_rate = self[SAMPLE_RATE_KEY]
        frame_rate = 1.0  #self[FRAME_RATE_KEY]
        #if frame_rate < 1.0:
        #	frame_rate = 1.0
        x_offset = self[BASEBAND_FREQ_KEY]
        num_lines = self[NUM_LINES_KEY]
        y_divs = self[Y_DIVS_KEY]
        x_divs = self[X_DIVS_KEY]
        #determine best fitting x_per_div
        x_width = self.data_len  #sample_rate/1.0
        x_per_div = common.get_clean_num(x_width / x_divs)
        #update the x grid
        self.plotter.set_x_grid(
            x_offset,
            x_offset + self.data_len,  #sample_rate/2.0,
            x_per_div,
            True,
        )
        #update x units
        self.plotter.set_x_label('Data', 'points')
        #update y grid
        duration = float(num_lines) / frame_rate
        y_per_div = common.get_clean_num(duration / y_divs)
        self.plotter.set_y_grid(0, duration, y_per_div, True)
        #update y units
        self.plotter.set_y_label('Time', 's')
        #update plotter
        self.plotter.update()
예제 #7
0
 def update_grid(self, *args):
     """
     Update the plotter grid.
     This update method is dependent on the variables below.
     Determine the x and y axis grid parameters.
     The x axis depends on sample rate, baseband freq, and x divs.
     The y axis depends on y per div, y divs, and ref level.
     """
     for trace in TRACES:
         channel = '%s' % trace.upper()
         if self[constants.TRACE_SHOW_KEY+trace]:
             self.plotter.set_waveform(
                 channel=channel,
                 samples=self._traces[trace],
                 color_spec=TRACES_COLOR_SPEC[trace],
             )
         else: self.plotter.clear_waveform(channel=channel)
     #grid parameters
     sample_rate = self[constants.SAMPLE_RATE_KEY]
     baseband_freq = self[constants.BASEBAND_FREQ_KEY]
     y_per_div = self[constants.Y_PER_DIV_KEY]
     y_divs = self[constants.Y_DIVS_KEY]
     x_divs = self[constants.X_DIVS_KEY]
     ref_level = self[constants.REF_LEVEL_KEY]
     #determine best fitting x_per_div
     if self.real: x_width = sample_rate/2.0
     else: x_width = sample_rate/1.0
     x_per_div = common.get_clean_num(x_width/x_divs)
     #update the x grid
     if self.real:
         self.plotter.set_x_grid(
             baseband_freq,
             baseband_freq + sample_rate/2.0,
             x_per_div, True,
         )
     else:
         self.plotter.set_x_grid(
             baseband_freq - sample_rate/2.0,
             baseband_freq + sample_rate/2.0,
             x_per_div, True,
         )
     #update x units
     self.plotter.set_x_label('Frequency', 'Hz')
     #update y grid
     self.plotter.set_y_grid(ref_level-y_per_div*y_divs, ref_level, y_per_div)
     #update y units
     self.plotter.set_y_label('Amplitude', 'dB')
     #update plotter
     self.plotter.update()
예제 #8
0
    def autoscale(self, *args):
        """
		Autoscale the waterfall plot to the last frame.
		Set the dynamic range and reference level.
		Does not affect the current data in the waterfall.
		"""
        if not len(self.samples):
            return
        # min_level, max_level = common.get_min_max_fft(self.samples)
        min_level, max_level = numpy.min(self.samples), numpy.max(self.samples)
        print "Min/max:", min_level, max_level
        # set the range and level
        self[DYNAMIC_RANGE_KEY] = common.get_clean_num(max_level - min_level)
        print "DYNAMIC_RANGE_KEY", self[DYNAMIC_RANGE_KEY]
        self[REF_LEVEL_KEY] = DYNAMIC_RANGE_STEP * round(0.5 + max_level / DYNAMIC_RANGE_STEP)
        print "REF_LEVEL_KEY", self[REF_LEVEL_KEY]
예제 #9
0
    def autoscale(self, *args):
        """
		Autoscale the waterfall plot to the last frame.
		Set the dynamic range and reference level.
		Does not affect the current data in the waterfall.
		"""
        if not len(self.samples): return
        #min_level, max_level = common.get_min_max_fft(self.samples)
        min_level, max_level = numpy.min(self.samples), numpy.max(self.samples)
        print "Min/max:", min_level, max_level
        #set the range and level
        self[DYNAMIC_RANGE_KEY] = common.get_clean_num(max_level - min_level)
        print "DYNAMIC_RANGE_KEY", self[DYNAMIC_RANGE_KEY]
        self[REF_LEVEL_KEY] = DYNAMIC_RANGE_STEP * round(.5 + max_level /
                                                         DYNAMIC_RANGE_STEP)
        print "REF_LEVEL_KEY", self[REF_LEVEL_KEY]
예제 #10
0
    def update_grid(self, *args):
        """
		Update the plotter grid.
		This update method is dependent on the variables below.
		Determine the x and y axis grid parameters.
		The x axis depends on sample rate, baseband freq, and x divs.
		The y axis depends on y per div, y divs, and ref level.
		"""
        for trace in TRACES:
            channel = "%s" % trace.upper()
            if self[TRACE_SHOW_KEY + trace]:
                self.plotter.set_waveform(
                    channel=channel, samples=self._traces[trace], color_spec=TRACES_COLOR_SPEC[trace]
                )
            else:
                self.plotter.clear_waveform(channel=channel)
            # grid parameters
        sample_rate = self[SAMPLE_RATE_KEY]
        baseband_freq = self[BASEBAND_FREQ_KEY]
        y_per_div = self[Y_PER_DIV_KEY]
        y_divs = self[Y_DIVS_KEY]
        x_divs = self[X_DIVS_KEY]
        ref_level = self[REF_LEVEL_KEY]
        # determine best fitting x_per_div
        x_width = self.data_len / 1.0
        x_per_div = common.get_clean_num(x_width / x_divs)
        # update the x grid
        self.plotter.set_x_grid(
            0,  # baseband_freq - sample_rate/2.0,
            self.data_len / 1.0,  # baseband_freq + sample_rate/2.0,
            x_per_div,
            True,
        )
        # update x units
        self.plotter.set_x_label("Data", "")  # 'Hz'
        # update y grid
        self.plotter.set_y_grid(ref_level - y_per_div * y_divs, ref_level, y_per_div)
        # update y units
        self.plotter.set_y_label("Amplitude", "dB")
        # update plotter
        self.plotter.update()
예제 #11
0
파일: crt_f.py 프로젝트: yzyGavin/sdr-tv
    def handle_samples(self):
        """
		Handle the cached samples from the scope input.
		Perform ac coupling, triggering, and auto ranging.
		"""
        if not self.sampleses: return
        sampleses = self.sampleses
        #if self[XY_MODE_KEY]:
        if True:
            self[DECIMATION_KEY] = 1
            x_samples = sampleses[self[X_CHANNEL_KEY]]
            y_samples = sampleses[self[Y_CHANNEL_KEY]]
            z_samples = sampleses[2]
            #autorange
            if self[AUTORANGE_KEY] and time.time(
            ) - self.autorange_ts > AUTORANGE_UPDATE_RATE:
                x_min, x_max = common.get_min_max(x_samples)
                y_min, y_max = common.get_min_max(y_samples)
                #adjust the x per div
                x_per_div = common.get_clean_num(
                    (x_max - x_min) / self[X_DIVS_KEY])
                if x_per_div != self[X_PER_DIV_KEY]:
                    self[X_PER_DIV_KEY] = x_per_div
                    return
                #adjust the x offset
                x_off = x_per_div * round((x_max + x_min) / 2 / x_per_div)
                if x_off != self[X_OFF_KEY]:
                    self[X_OFF_KEY] = x_off
                    return
                #adjust the y per div
                y_per_div = common.get_clean_num(
                    (y_max - y_min) / self[Y_DIVS_KEY])
                if y_per_div != self[Y_PER_DIV_KEY]:
                    self[Y_PER_DIV_KEY] = y_per_div
                    return
                #adjust the y offset
                y_off = y_per_div * round((y_max + y_min) / 2 / y_per_div)
                if y_off != self[Y_OFF_KEY]:
                    self[Y_OFF_KEY] = y_off
                    return
                self.autorange_ts = time.time()
            #plot xy channel
            self.plotter.set_waveform(
                channel='XY',
                samples=(x_samples, y_samples, z_samples),
                color_spec=CHANNEL_COLOR_SPECS[0],
                marker=self[XY_MARKER_KEY],
            )
            #turn off each waveform
            for i, samples in enumerate(sampleses):
                self.plotter.clear_waveform(channel='Ch%d' % (i + 1))
        else:
            #autorange
            if self[AUTORANGE_KEY] and time.time(
            ) - self.autorange_ts > AUTORANGE_UPDATE_RATE:
                bounds = [common.get_min_max(samples) for samples in sampleses]
                y_min = numpy.min([bound[0] for bound in bounds])
                y_max = numpy.max([bound[1] for bound in bounds])
                #adjust the y per div
                y_per_div = common.get_clean_num(
                    (y_max - y_min) / self[Y_DIVS_KEY])
                if y_per_div != self[Y_PER_DIV_KEY]:
                    self[Y_PER_DIV_KEY] = y_per_div
                    return
                #adjust the y offset
                y_off = y_per_div * round((y_max + y_min) / 2 / y_per_div)
                if y_off != self[Y_OFF_KEY]:
                    self[Y_OFF_KEY] = y_off
                    return
                self.autorange_ts = time.time()
            #number of samples to scale to the screen
            actual_rate = self.get_actual_rate()
            time_span = self[T_PER_DIV_KEY] * self[T_DIVS_KEY]
            num_samps = int(round(time_span * actual_rate))
            #handle the time offset
            t_off = self[T_FRAC_OFF_KEY] * (len(sampleses[0]) / actual_rate -
                                            time_span)
            if t_off != self[T_OFF_KEY]:
                self[T_OFF_KEY] = t_off
                return
            samps_off = int(round(actual_rate * self[T_OFF_KEY]))
            #adjust the decim so that we use about half the samps
            self[DECIMATION_KEY] = int(
                round(time_span * self[SAMPLE_RATE_KEY] /
                      (0.5 * len(sampleses[0]))))
            #num samps too small, auto increment the time
            if num_samps < 2:
                self[T_PER_DIV_KEY] = common.get_clean_incr(
                    self[T_PER_DIV_KEY])
                #num samps in bounds, plot each waveform
            elif num_samps <= len(sampleses[0]):
                for i, samples in enumerate(sampleses):
                    #plot samples
                    self.plotter.set_waveform(
                        channel='Ch%d' % (i + 1),
                        samples=samples[samps_off:num_samps + samps_off],
                        color_spec=CHANNEL_COLOR_SPECS[i],
                        marker=self[common.index_key(MARKER_KEY, i)],
                        trig_off=self.trigger_offset,
                    )
            #turn XY channel off
            self.plotter.clear_waveform(channel='XY')
        #keep trigger level within range
        if self[TRIGGER_LEVEL_KEY] > self.get_y_max():
            self[TRIGGER_LEVEL_KEY] = self.get_y_max()
            return
        if self[TRIGGER_LEVEL_KEY] < self.get_y_min():
            self[TRIGGER_LEVEL_KEY] = self.get_y_min()
            return
        #disable the trigger channel
        if not self[TRIGGER_SHOW_KEY] or self[XY_MODE_KEY] or self[
                TRIGGER_MODE_KEY] == wxgui.TRIG_MODE_FREE:
            self.plotter.clear_waveform(channel='Trig')
        else:  #show trigger channel
            trigger_level = self[TRIGGER_LEVEL_KEY]
            trigger_point = (len(self.sampleses[0]) -
                             1) / self.get_actual_rate() / 2.0
            self.plotter.set_waveform(
                channel='Trig',
                samples=([
                    self.get_t_min(), trigger_point, trigger_point,
                    trigger_point, trigger_point,
                    self.get_t_max()
                ], [
                    trigger_level, trigger_level,
                    self.get_y_max(),
                    self.get_y_min(), trigger_level, trigger_level
                ]),
                color_spec=TRIGGER_COLOR_SPEC,
            )
        #update the plotter
        self.plotter.update()
예제 #12
0
파일: crt_f.py 프로젝트: devnulling/sdr-tv
	def handle_samples(self):
		"""
		Handle the cached samples from the scope input.
		Perform ac coupling, triggering, and auto ranging.
		"""
		if not self.sampleses: return
		sampleses = self.sampleses
		#if self[XY_MODE_KEY]:
                if True:
			self[DECIMATION_KEY] = 1
			x_samples = sampleses[self[X_CHANNEL_KEY]]
			y_samples = sampleses[self[Y_CHANNEL_KEY]]
                        z_samples = sampleses[2]
			#autorange
			if self[AUTORANGE_KEY] and time.time() - self.autorange_ts > AUTORANGE_UPDATE_RATE:
				x_min, x_max = common.get_min_max(x_samples)
				y_min, y_max = common.get_min_max(y_samples)
				#adjust the x per div
				x_per_div = common.get_clean_num((x_max-x_min)/self[X_DIVS_KEY])
				if x_per_div != self[X_PER_DIV_KEY]: self[X_PER_DIV_KEY] = x_per_div; return
				#adjust the x offset
				x_off = x_per_div*round((x_max+x_min)/2/x_per_div)
				if x_off != self[X_OFF_KEY]: self[X_OFF_KEY] = x_off; return
				#adjust the y per div
				y_per_div = common.get_clean_num((y_max-y_min)/self[Y_DIVS_KEY])
				if y_per_div != self[Y_PER_DIV_KEY]: self[Y_PER_DIV_KEY] = y_per_div; return
				#adjust the y offset
				y_off = y_per_div*round((y_max+y_min)/2/y_per_div)
				if y_off != self[Y_OFF_KEY]: self[Y_OFF_KEY] = y_off; return
				self.autorange_ts = time.time()
			#plot xy channel
			self.plotter.set_waveform(
				channel='XY',
				samples=(x_samples, y_samples, z_samples),
				color_spec=CHANNEL_COLOR_SPECS[0],
				marker=self[XY_MARKER_KEY],
			)
			#turn off each waveform
			for i, samples in enumerate(sampleses):
				self.plotter.clear_waveform(channel='Ch%d'%(i+1))
		else:
			#autorange
			if self[AUTORANGE_KEY] and time.time() - self.autorange_ts > AUTORANGE_UPDATE_RATE:
				bounds = [common.get_min_max(samples) for samples in sampleses]
				y_min = numpy.min([bound[0] for bound in bounds])
				y_max = numpy.max([bound[1] for bound in bounds])
				#adjust the y per div
				y_per_div = common.get_clean_num((y_max-y_min)/self[Y_DIVS_KEY])
				if y_per_div != self[Y_PER_DIV_KEY]: self[Y_PER_DIV_KEY] = y_per_div; return
				#adjust the y offset
				y_off = y_per_div*round((y_max+y_min)/2/y_per_div)
				if y_off != self[Y_OFF_KEY]: self[Y_OFF_KEY] = y_off; return
				self.autorange_ts = time.time()
			#number of samples to scale to the screen
			actual_rate = self.get_actual_rate()
			time_span = self[T_PER_DIV_KEY]*self[T_DIVS_KEY]
			num_samps = int(round(time_span*actual_rate))
			#handle the time offset
			t_off = self[T_FRAC_OFF_KEY]*(len(sampleses[0])/actual_rate - time_span)
			if t_off != self[T_OFF_KEY]: self[T_OFF_KEY] = t_off; return
			samps_off = int(round(actual_rate*self[T_OFF_KEY]))
			#adjust the decim so that we use about half the samps
			self[DECIMATION_KEY] = int(round(
					time_span*self[SAMPLE_RATE_KEY]/(0.5*len(sampleses[0]))
				)
			)
			#num samps too small, auto increment the time
			if num_samps < 2: self[T_PER_DIV_KEY] = common.get_clean_incr(self[T_PER_DIV_KEY])
			#num samps in bounds, plot each waveform
			elif num_samps <= len(sampleses[0]):
				for i, samples in enumerate(sampleses):
					#plot samples
					self.plotter.set_waveform(
						channel='Ch%d'%(i+1),
						samples=samples[samps_off:num_samps+samps_off],
						color_spec=CHANNEL_COLOR_SPECS[i],
						marker=self[common.index_key(MARKER_KEY, i)],
						trig_off=self.trigger_offset,
					)
			#turn XY channel off
			self.plotter.clear_waveform(channel='XY')
		#keep trigger level within range
		if self[TRIGGER_LEVEL_KEY] > self.get_y_max():
			self[TRIGGER_LEVEL_KEY] = self.get_y_max(); return
		if self[TRIGGER_LEVEL_KEY] < self.get_y_min():
			self[TRIGGER_LEVEL_KEY] = self.get_y_min(); return
		#disable the trigger channel
		if not self[TRIGGER_SHOW_KEY] or self[XY_MODE_KEY] or self[TRIGGER_MODE_KEY] == wxgui.TRIG_MODE_FREE:
			self.plotter.clear_waveform(channel='Trig')
		else: #show trigger channel
			trigger_level = self[TRIGGER_LEVEL_KEY]
			trigger_point = (len(self.sampleses[0])-1)/self.get_actual_rate()/2.0
			self.plotter.set_waveform(
				channel='Trig',
				samples=(
					[self.get_t_min(), trigger_point, trigger_point, trigger_point, trigger_point, self.get_t_max()],
					[trigger_level, trigger_level, self.get_y_max(), self.get_y_min(), trigger_level, trigger_level]
				),
				color_spec=TRIGGER_COLOR_SPEC,
			)
		#update the plotter
		self.plotter.update()