Wednesday, September 2, 2015

[Discuss-gnuradio] Meta file time stamp

#!/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()
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'}



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.

No comments:

Post a Comment