Dear All, We are experiencing unexpected behavior with the time stamps in the meta file headers. It appears that in cases where the flowgraph experiences data drops, the timestamp is properly updated. However, in cases, where the flowgraph hits the maximum segment size (4 MB in our case), the calculation of timestamp is done in such a way that appears to neglect a decimation factor in one of our blocks (keep_1_in_n). Details can be found below. Any suggestions as to what's going on or what to do about it would be most appreciated.
Sincerely, Dan Marlow Details: OS: Ubuntu 15.04 (GNU/Linux 3.19.0-26-generic x86_64) H/W: Ettus B210 with GPSDO, Intel(R) Core(TM) i5-4430 CPU @ 3.00GHz 8GB memory USB3 gnuradio: 3.7.8 Flowgraph: This is provided to give an idea of what we are doing. It is close to what we are using, but not exact, since we edited the output generated by GRC.
B210_2ch_filewriter.grc
Description: Binary data
The actual top_block we are running is attached below.
#!/usr/bin/env python2 ################################################## # GNU Radio Python Flow Graph # Title: Top Block # Generated: Thu Jul 23 11:29:50 2015 ################################################## from gnuradio import blocks from gnuradio import eng_notation from gnuradio import fft from gnuradio import gr from gnuradio import uhd from gnuradio.eng_option import eng_option from gnuradio.fft import window from gnuradio.filter import firdes from optparse import OptionParser import specest import time import pmt from DAQ import rxcntl class top_block(gr.top_block): def __init__(self, fname1='raw1.dat', fname2='raw2.dat'): gr.top_block.__init__(self, "Top Block") ################################################## # Extra Variables ################################################## self.fname1 = fname1 self.fname2 = fname2 self.nChannels = nChannels = 1 print "Entering top_block: fname1={0:s} fname2={1:s}".format(self.fname1,self.fname2) ################################################## # Variables ################################################## self.freq1 = freq1 = 1420000000 self.freq2 = freq2 = 1420000000 self.samp_rate = samp_rate = 100000000/4. self.gain = gain = 60 self.N_average = N_average = 512 self.FFT_size = FFT_size = 32 self.BW = BW = 20000000 self.BW = BW = 25000000 ################################################## # Blocks ################################################## self.uhd_usrp_source_0 = uhd.usrp_source( ",".join(("ser=F61177", "")), uhd.stream_args( cpu_format="fc32", channels=range(self.nChannels), ), ) self.uhd_usrp_source_0.set_subdev_spec("A:A A:B", 0) self.uhd_usrp_source_0.set_samp_rate(samp_rate) self.uhd_usrp_source_0.set_center_freq(self.freq1, 0) self.uhd_usrp_source_0.set_gain(gain, 0) self.uhd_usrp_source_0.set_bandwidth(BW, 0) #sensorNames = self.uhd_usrp_source_0.get_mboard_sensor_names(0) #print "Sensor names=" + str(sensorNames) GPStime = self.uhd_usrp_source_0.get_mboard_sensor("gps_time") GPS_locked = self.uhd_usrp_source_0.get_mboard_sensor("gps_locked") print "GPS Info: {0:s}; {1:s}".format(str(GPS_locked),str(GPStime)) self.uhd_usrp_source_0.set_time_now(uhd.time_spec(time.time()), uhd.ALL_MBOARDS) if self.nChannels == 2 : self.uhd_usrp_source_0.set_center_freq(self.freq2, 1) self.uhd_usrp_source_0.set_gain(gain, 1) self.uhd_usrp_source_0.set_bandwidth(BW, 1) self.specest_moving_average_vff_0 = specest.moving_average_vff(N_average, FFT_size, 1, 4096) self.fft_vxx_0 = fft.fft_vcc(FFT_size, True, (window.blackmanharris(FFT_size)), True, 1) self.blocks_vector_to_stream_0 = blocks.vector_to_stream(gr.sizeof_float*1, FFT_size) self.blocks_stream_to_vector_0 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, FFT_size) self.blocks_keep_one_in_n_0_0 = blocks.keep_one_in_n(gr.sizeof_float*FFT_size, N_average) self.blocks_complex_to_mag_squared_0 = blocks.complex_to_mag_squared(FFT_size) self.blocks_file_meta_sink_0 = blocks.file_meta_sink(gr.sizeof_float*1, self.fname1, self.samp_rate, \ 1, blocks.GR_FILE_FLOAT, False, 1000000, self._extras(), False) self.blocks_file_meta_sink_0.set_unbuffered(False) if self.nChannels == 2 : self.specest_moving_average_vff_1 = specest.moving_average_vff(N_average, FFT_size, 1, 4096) self.fft_vxx_0_0 = fft.fft_vcc(FFT_size, True, (window.blackmanharris(FFT_size)), True, 1) self.blocks_vector_to_stream_0_0 = blocks.vector_to_stream(gr.sizeof_float*1, FFT_size) self.blocks_stream_to_vector_0_0 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, FFT_size) self.blocks_keep_one_in_n_0_0_0 = blocks.keep_one_in_n(gr.sizeof_float*FFT_size, N_average) self.blocks_complex_to_mag_squared_0_0 = blocks.complex_to_mag_squared(FFT_size) self.blocks_file_meta_sink_0_0 = blocks.file_meta_sink(gr.sizeof_float*1, self.fname2, self.samp_rate, \ 1, blocks.GR_FILE_FLOAT, False, 1000000, self._extras(), False) self.blocks_file_meta_sink_0_0.set_unbuffered(False) ################################################## # Connections ################################################## self.connect((self.uhd_usrp_source_0, 0), (self.blocks_stream_to_vector_0, 0)) self.connect((self.blocks_stream_to_vector_0, 0), (self.fft_vxx_0, 0)) self.connect((self.fft_vxx_0, 0), (self.blocks_complex_to_mag_squared_0, 0)) self.connect((self.blocks_complex_to_mag_squared_0, 0), (self.specest_moving_average_vff_0, 0)) self.connect((self.specest_moving_average_vff_0, 0), (self.blocks_keep_one_in_n_0_0, 0)) self.connect((self.blocks_keep_one_in_n_0_0, 0), (self.blocks_vector_to_stream_0, 0)) self.connect((self.blocks_vector_to_stream_0, 0), (self.blocks_file_meta_sink_0, 0)) if nChannels == 2 : self.connect((self.uhd_usrp_source_0, 1), (self.blocks_stream_to_vector_0_0, 0)) self.connect((self.blocks_stream_to_vector_0_0, 0), (self.fft_vxx_0_0, 0)) self.connect((self.fft_vxx_0_0, 0), (self.blocks_complex_to_mag_squared_0_0, 0)) self.connect((self.blocks_complex_to_mag_squared_0_0, 0), (self.specest_moving_average_vff_1, 0)) self.connect((self.specest_moving_average_vff_1, 0), (self.blocks_keep_one_in_n_0_0_0, 0)) self.connect((self.blocks_keep_one_in_n_0_0_0, 0), (self.blocks_vector_to_stream_0_0, 0)) self.connect((self.blocks_vector_to_stream_0_0, 0), (self.blocks_file_meta_sink_0_0, 0)) def get_freq1(self): return self.freq1 def set_freq1(self, freq1): self.freq1 = freq1 self.uhd_usrp_source_0.set_center_freq(freq1, 0) def get_freq2(self): return self.freq2 def set_freq2(self, freq2): self.freq2 = freq2 self.uhd_usrp_source_0.set_center_freq(freq2, 1) def get_samp_rate(self): return self.samp_rate def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate self.uhd_usrp_source_0.set_samp_rate(self.samp_rate) def get_gain(self): return self.gain def set_gain(self, gain): self.gain = gain self.uhd_usrp_source_0.set_gain(self.gain, 0) self.uhd_usrp_source_0.set_gain(self.gain, 1) def get_N_average(self): return self.N_average def set_N_average(self, N_average): self.N_average = N_average self.blocks_keep_one_in_n_0_0.set_n(self.N_average) self.blocks_keep_one_in_n_0_0_0.set_n(self.N_average) def get_FFT_size(self): return self.FFT_size def set_FFT_size(self, FFT_size): self.FFT_size = FFT_size def get_BW(self): return self.BW def set_BW(self, BW): self.BW = BW self.uhd_usrp_source_0.set_bandwidth(self.BW, 0) self.uhd_usrp_source_0.set_bandwidth(self.BW, 1) def get_filename(self): return self.filename def set_filename(self, filename): self.filename = filename def _extras(self): """ Return a PMT dictionary with the following extra header information: FFT_size, N_average, gain, BW, rx_info (optional) """ extras = pmt.make_dict() key, val = pmt.intern("FFT_size"), pmt.from_long(self.FFT_size) extras = pmt.dict_add(extras, key, val) key, val = pmt.intern("freq1"), pmt.from_long(self.freq1) extras = pmt.dict_add(extras, key, val) key, val = pmt.intern("freq2"), pmt.from_long(self.freq2) extras = pmt.dict_add(extras, key, val) key, val = pmt.intern("N_average"), pmt.from_long(self.N_average) extras = pmt.dict_add(extras, key, val) key, val = pmt.intern("gain"), pmt.from_double(self.gain) extras = pmt.dict_add(extras, key, val) key, val = pmt.intern("BW"), pmt.from_double(self.BW) extras = pmt.dict_add(extras, key, val) key, val = pmt.intern("rx_info"), pmt.intern(rxcntl.get()) extras = pmt.dict_add(extras, key, val) return pmt.serialize_str(extras) if __name__ == '__main__': parser = OptionParser(option_class=eng_option, usage="%prog: [options]") (options, args) = parser.parse_args() tb = top_block() tb.start() try: raw_input('Press Enter to quit: ') except EOFError: pass tb.stop() tb.wait()
Results: gr_read_file_metadata test09.dat > headers.txt
HEADER 0 Version Number: 0 Sample Rate: 2500000.00 sps Seconds: 1441219168.143140 Item size: 4 Data Type: float (5) Complex? False Header Length: 420 bytes Extra Length: 271 Extra Header? True Size of Data: 4000000 bytes 1000000 items Extra Header: rx_freq: 1.42e+09 FFT_size: 32 freq1: 1420000000 freq2: 1420000000 N_average: 512 gain: 60 BW: 2.5e+07 rx_info: {'noise': 'off', 'chAPower': 'on', 'yigHeater': 'off', 'chBPower': 'on', 'chBFilter': 'YIG', 'chAFilter': 'YIG', 'yigCurrent': '0.0'} HEADER 1 Version Number: 0 Sample Rate: 2500000.00 sps Seconds: 1441219168.543140 Item size: 4 Data Type: float (5) Complex? False Header Length: 420 bytes Extra Length: 271 Extra Header? True Size of Data: 4000000 bytes 1000000 items Extra Header: rx_freq: 1.42e+09 FFT_size: 32 freq1: 1420000000 freq2: 1420000000 N_average: 512 gain: 60 BW: 2.5e+07 rx_info: {'noise': 'off', 'chAPower': 'on', 'yigHeater': 'off', 'chBPower': 'on', 'chBFilter': 'YIG', 'chAFilter': 'YIG', 'yigCurrent': '0.0'} HEADER 2 Version Number: 0 Sample Rate: 2500000.00 sps Seconds: 1441219168.943140 Item size: 4 Data Type: float (5) Complex? False Header Length: 420 bytes Extra Length: 271 Extra Header? True Size of Data: 4000000 bytes 1000000 items Extra Header: rx_freq: 1.42e+09 FFT_size: 32 freq1: 1420000000 freq2: 1420000000 N_average: 512 gain: 60 BW: 2.5e+07 rx_info: {'noise': 'off', 'chAPower': 'on', 'yigHeater': 'off', 'chBPower': 'on', 'chBFilter': 'YIG', 'chAFilter': 'YIG', 'yigCurrent': '0.0'} HEADER 3 Version Number: 0 Sample Rate: 2500000.00 sps Seconds: 1441219169.343140 Item size: 4 Data Type: float (5) Complex? False Header Length: 420 bytes Extra Length: 271 Extra Header? True Size of Data: 4000000 bytes 1000000 items Extra Header: rx_freq: 1.42e+09 FFT_size: 32 freq1: 1420000000 freq2: 1420000000 N_average: 512 gain: 60 BW: 2.5e+07 rx_info: {'noise': 'off', 'chAPower': 'on', 'yigHeater': 'off', 'chBPower': 'on', 'chBFilter': 'YIG', 'chAFilter': 'YIG', 'yigCurrent': '0.0'} HEADER 4 Version Number: 0 Sample Rate: 2500000.00 sps Seconds: 1441219169.743140 Item size: 4 Data Type: float (5) Complex? False Header Length: 420 bytes Extra Length: 271 Extra Header? True Size of Data: 4000000 bytes 1000000 items Extra Header: rx_freq: 1.42e+09 FFT_size: 32 freq1: 1420000000 freq2: 1420000000 N_average: 512 gain: 60 BW: 2.5e+07 rx_info: {'noise': 'off', 'chAPower': 'on', 'yigHeater': 'off', 'chBPower': 'on', 'chBFilter': 'YIG', 'chAFilter': 'YIG', 'yigCurrent': '0.0'} HEADER 5 Version Number: 0 Sample Rate: 2500000.00 sps Seconds: 1441219170.143140 Item size: 4 Data Type: float (5) Complex? False Header Length: 420 bytes Extra Length: 271 Extra Header? True Size of Data: 4000000 bytes 1000000 items Extra Header: rx_freq: 1.42e+09 FFT_size: 32 freq1: 1420000000 freq2: 1420000000 N_average: 512 gain: 60 BW: 2.5e+07 rx_info: {'noise': 'off', 'chAPower': 'on', 'yigHeater': 'off', 'chBPower': 'on', 'chBFilter': 'YIG', 'chAFilter': 'YIG', 'yigCurrent': '0.0'} HEADER 6 Version Number: 0 Sample Rate: 2500000.00 sps Seconds: 1441219170.543140 Item size: 4 Data Type: float (5) Complex? False Header Length: 420 bytes Extra Length: 271 Extra Header? True Size of Data: 4000000 bytes 1000000 items Extra Header: rx_freq: 1.42e+09 FFT_size: 32 freq1: 1420000000 freq2: 1420000000 N_average: 512 gain: 60 BW: 2.5e+07 rx_info: {'noise': 'off', 'chAPower': 'on', 'yigHeater': 'off', 'chBPower': 'on', 'chBFilter': 'YIG', 'chAFilter': 'YIG', 'yigCurrent': '0.0'} HEADER 7 Version Number: 0 Sample Rate: 2500000.00 sps Seconds: 1441219170.943140 Item size: 4 Data Type: float (5) Complex? False Header Length: 420 bytes Extra Length: 271 Extra Header? True Size of Data: 3354880 bytes 838720 items Extra Header: rx_freq: 1.42e+09 FFT_size: 32 freq1: 1420000000 freq2: 1420000000 N_average: 512 gain: 60 BW: 2.5e+07 rx_info: {'noise': 'off', 'chAPower': 'on', 'yigHeater': 'off', 'chBPower': 'on', 'chBFilter': 'YIG', 'chAFilter': 'YIG', 'yigCurrent': '0.0'}
_______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnuradio