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.

Attachment: 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

Reply via email to