The coloring is from matplotlib. Sometimes I forget what's what. I'm really not using pandas for much here. Most of the code in plotting a minute of data is in making it look fancy.
import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as tkr import matplotlib.mlab as mlab import pandas as pd sFile = 'out.txt' # in current directory, or give full path df = pd.read_csv(sFile, header=None, names=['sample_time', 'amplitude', 'phase'], sep=' ', index_col=0) phase_deg = np.rad2deg(df_phase.phase) # phase_deg is a series plt.subplots(figsize=(15, 3)) ax = plt.subplot(1,1,1) plt.title('WWVB Phase 5 - 70 sec') ax.plot(phase_deg.clip(-120, 120), lw=0.4) plt.xlim(6, 71) plt.ylim(-150, 150) ax.fill_between(phase_deg.index, 0, phase_deg.clip(-120, 120), where=phase_deg>=0, color='green', alpha=0.15) ax.fill_between(phase_deg.index, 0, phase_deg.clip(-120, 120), where=phase_deg<0, color='red', alpha=0.15) ax.xaxis.set_major_locator(tkr.MaxNLocator(8)) ax.xaxis.set_minor_locator(tkr.AutoMinorLocator(n=10)) ax.grid(b=True, which='major', c='g', linestyle='-', linewidth=0.7) ax.grid(b=True, which='minor', c='g', linestyle='-', linewidth=0.2) sSave = 'wwvb_phase_5_70.png' plt.savefig(sSave, bbox_inches='tight', transparent=False, dpi=100) Rob On Fri, Jul 31, 2020 at 1:15 PM jimlux <jim...@earthlink.net> wrote: > > On 7/31/20 11:25 AM, Scud West wrote: > > Back in December 2018 there was a WWVB thread. > > > > From Poul-Henning's post on 2018-12-05 quoting John N8UR: > > > > "While everyone's been talking :-) , I recorded some WWVB IQ data for > > folks to play with. You can download it from > > > > http://febo.com/pages/wwvb/ > > > > The receiver ran at 48 ksps and was centered on 80 kHz (to allow a 20 > > kHz IF to move away from 0 Hz crud). The data was taken in early > > afternoon in Dayton, Ohio. WWVB was easily visible in an FFT." > > > > > > I ran the python code posted by Poul-Henning with the WWVB IQ data. > > The resulting file 'out.txt' has columns for sample time, amplitude, > > and phase. It was used for the plots below. There is about 10 > > minutes of data. > > > > initial data: > > n8ur_rx_center=0.08MHz_rate=48ksps_start=2018.12.05.13.57.54.bin > > (236 MB) > > plotted data: out.txt (2.4 MB, 61,000 datapoints) > > > > I hadn't looked at phase data before, and it took a while to make any > > sense of it. It's surprising how well the bit per second data came > > through, compared to amplitude modulation. Different filtering will > > likely improve the AM performance, but the phase plot looked good now, > > so here it is. > > > > The first graph shows the +90 degree phase shift (top line) and -90 > > (bottom line). The SDR clock appears relatively stable at first, but > > drifts lower in frequency at a fairly steady rate until about 550 > > seconds, when it flattens out again. Overall a bit over 180 degrees > > more than expected. A half cycle at 60 kHz, or about 8.3e-06 drift in > > 10 minutes. The unpleasantness at about 470 seconds is reflected in > > the 10 minute plot during minute 7 (3 lines down from the top). I > > removed the 'drift' in a crude manner, and it's a wonder it worked as > > well as it did. > > > > The middle two graphs are the same data at different time scales. I'm > > not sure if the short term phase variation has any meaning, or if it's > > 'just noise' at this level. The WWVB phase change actually takes > > place 0.1 seconds after the start of the second, but it fit just right > > for display as is. The real minute begins at second 6, and this is > > adjustment is made in the 10 minute waterfall plot. The first few > > seconds of data are at the bottom left corner. > > > > Green denotes binary 1, phase shift +90 degrees. > > Red is binary 0, phase shift -90 degrees. > > > > A simplified description of WWVB phase-modulated time code: > > > > seconds 0 - 12 fixed sync 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0 > > seconds 13 - 18 time parity (ECC) > > seconds 19 - 46 binary minute of century > > seconds 47 - 58 DST and leap sec > > second 59 fixed sync 0 > > > > these seconds are notable here: > > > > 43, 44, 45, 46 contain changing binary minutes 3, 2, 1, 0 > > 19 a copy of binary minute 0 > > 29, 39 Reserved, but also a copy of binary minute 0 in this sample. > > > > > > I'm using python, numpy, matplotlib, and Pandas. It all runs pretty > > quick on my machine, only a few seconds to load, calculate, and > > display the graphs. > > > > I'm going to try looking directly at John's IQ data to see the effect > > of the larger dataset on results and calculation time. It's a big > > help knowing what the processed IQ should look like. Thanks for the > > data and code, > > > > Rob > > > > > Nice looking plots..Did you generate the colored red/green "fill to > baseline" in matplotlib, or is that out of Pandas? > > The stacked plot is also very nice. > > Good looking plots really help to understand what's going on. > > (and of course, a shout out to Edward Tufte, who I am often inspired by) > > _______________________________________________ > time-nuts mailing list -- time-nuts@lists.febo.com > To unsubscribe, go to > http://lists.febo.com/mailman/listinfo/time-nuts_lists.febo.com > and follow the instructions there.
_______________________________________________ time-nuts mailing list -- time-nuts@lists.febo.com To unsubscribe, go to http://lists.febo.com/mailman/listinfo/time-nuts_lists.febo.com and follow the instructions there.