From 8a3bbae9bc73f055c18f2dea6337ec4b45b1cb30 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 7 Dec 2022 16:35:18 -0500 Subject: [PATCH] new cpmd plot --- op25/gr-op25_repeater/apps/gr_gnuplot.py | 46 +++++++++++++++++++++--- op25/gr-op25_repeater/apps/multi_rx.py | 2 +- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/op25/gr-op25_repeater/apps/gr_gnuplot.py b/op25/gr-op25_repeater/apps/gr_gnuplot.py index 1d51d81..cd828cc 100644 --- a/op25/gr-op25_repeater/apps/gr_gnuplot.py +++ b/op25/gr-op25_repeater/apps/gr_gnuplot.py @@ -36,6 +36,7 @@ from math import pi, sin, cos _def_debug = 0 _def_sps = 10 +_def_cpm_mode = 'cpm' GNUPLOT = '/usr/bin/gnuplot' @@ -105,6 +106,8 @@ class wrap_gp(object): for color in ccfg: self.colors[color] = ccfg[color] + self.next_cpmd = time.time() + self.attach_gp() def attach_gp(self): @@ -167,8 +170,37 @@ class wrap_gp(object): ab = np.abs(self.buf) for i in range(len(ab)): s += '%f\n' % ab[i] - s += '\ne\n' + s += 'e\n' plots.append('"-" with lines') + elif mode == 'cpmd': + if time.time() < self.next_cpmd: + self.buf = np.array([]) + return 0 + self.next_cpmd = time.time() + 0.5 + ab = np.abs(self.buf) + thresh = np.max(ab) / 2.0 + mask1 = np.array(ab > thresh, dtype=np.int) + maskdf = mask1[1:] - mask1[:-1] + nz = np.array(np.nonzero(maskdf), dtype=np.int)[0] + nzd = nz[1:]-nz[:-1] + nzdn = nzd // self.sps + sel = (nzdn > 165) & (nzdn < 185) + valid = np.array(np.nonzero(sel), dtype=np.int)[0] + if len(valid) < 1: + self.buf = np.array([]) + return 0 + v0 = valid[0] + i0 = nz[v0] + samples = self.buf[i0 : i0+170*self.sps+2] + fmd = np.angle(samples[1:] * np.conj(samples[:-1])) + fmd = fmd[12*self.sps:] + for n in range(0,len(fmd),self.sps): + sl = fmd[n:n+self.sps+1] + if len(sl) != self.sps+1: + break + s += '\n'.join(['%f' % (x*self.sps) for x in sl]) + s += '\ne\n' + plots.append('"-" with lines') elif mode == 'constellation': plot_size = (240,240) self.buf = self.buf[:100] @@ -329,6 +361,11 @@ class wrap_gp(object): #h+= 'set yrange [-4:4]\n' h+= 'set title "CPM RSSI %s" %s\n' % (self.title, label_color) #plot_color = '' + elif mode == 'cpmd': + h+= background + h+= 'set yrange [-4:4]\n' + h+= 'set title "CPM Datascope %s" %s\n' % (self.title, label_color) + plot_color = '' elif mode == 'sync': h += 'set object 1 rect from screen 0,0 to screen 1,1 %s behind\n' % (background_color) h += 'set size square\n' @@ -435,7 +472,7 @@ class eye_sink_f(gr.sync_block): class cpm_sink_c(gr.sync_block): """ """ - def __init__(self, debug = _def_debug, sps = _def_sps): + def __init__(self, debug = _def_debug, sps = _def_sps, plot_mode=_def_cpm_mode): gr.sync_block.__init__(self, name="cpm_sink_c", in_sig=[np.complex64], @@ -443,12 +480,13 @@ class cpm_sink_c(gr.sync_block): self.debug = debug self.sps = sps self.gnuplot = wrap_gp(sps=self.sps) + self.plot_mode=plot_mode def work(self, input_items, output_items): in0 = input_items[0] l = len(in0) - consumed = self.gnuplot.plot(in0, self.sps*3000, mode='cpm') - return consumed ### len(input_items[0]) + consumed = self.gnuplot.plot(in0, self.sps*180*10, mode=self.plot_mode) + return len(input_items[0]) def set_title(self, title): self.gnuplot.set_title(title) diff --git a/op25/gr-op25_repeater/apps/multi_rx.py b/op25/gr-op25_repeater/apps/multi_rx.py index 1e1ebe8..68c4c7a 100755 --- a/op25/gr-op25_repeater/apps/multi_rx.py +++ b/op25/gr-op25_repeater/apps/multi_rx.py @@ -293,7 +293,7 @@ class channel(object): elif plot.startswith('cpm'): if self.symbol_rate != 6000: # fixed rate value for p25p2 sys.stderr.write('warning: symbol rate %d may be incorrect for CPM channel %s\n' % (self.symbol_rate, self.name)) - sink = cpm_sink_c(sps=config['if_rate'] // self.symbol_rate) + sink = cpm_sink_c(sps=config['if_rate'] // self.symbol_rate, plot_mode=plot) sink.set_title(self.name) self.sinks.append(sink) self.demod.connect_complex('if_out', sink)