| Hello Gnuradio experts, I'm following the gnuradio tutorial for creating an out of tree python block. My intention is fairly simple. To have a input stream of 4 vectors and average these 4 vectors, outputting a single average vector after the 4th vector arrives. Right now my vectors are 1024 channel total power spectra. My code is attached, along with the quality control code. I've been at this for a while, but I must have the wrong model in my head on how gnuradio holds these samples. I'm not getting the proper size matches. I can not find any decimation help, despite hours of googling... Suggestions? THanks Glen |
#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2018 <+YOU OR YOUR COMPANY+>. # # This is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # This software is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this software; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, # Boston, MA 02110-1301, USA. #
from gnuradio import gr, gr_unittest
from gnuradio import blocks
from vdecimate import vdecimate
import numpy as np
class qa_vdecimate (gr_unittest.TestCase):
def setUp (self):
self.tb = gr.top_block ()
def tearDown (self):
self.tb = None
def test_001_t (self):
# set up fg
vectorsize = 1024
nave = 4
xin = np.zeros(vectorsize)
xbig = np.zeros(4*vectorsize)
for iii in range(vectorsize):
xin[iii] = float(iii)
xbig[iii] = float(iii)
xbig[iii+vectorsize] = float(iii)
xbig[iii+(2*vectorsize)] = float(iii)
xbig[iii+(3*vectorsize)] = float(iii)
expected_result = xin
src = blocks.vector_source_f(xbig, False, vectorsize)
vdec = vdecimate( vectorsize, nave)
snk = blocks.vector_sink_f( vectorsize)
self.tb.connect( src, vdec)
self.tb.connect( vdec, snk)
self.tb.run ()
# check data
result_data = snk.data()
self.assertFloatTuplesAlmostEqual (expected_result, result_data, 6)
if __name__ == '__main__':
gr_unittest.run(qa_vdecimate, "qa_vdecimate.xml")
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2018 <+YOU OR YOUR COMPANY+>.
#
# This is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this software; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
import numpy
from gnuradio import gr
class vdecimate(gr.decim_block):
"""
Vector decimate any size of input docstring for block vdecimate
"""
def __init__(self, vectorsize=1024, nave=4):
gr.decim_block.__init__(self,
"vdecimate",
[(numpy.float32, vectorsize)],
[(numpy.float32, vectorsize)],
nave)
self.vectorsize = int(vectorsize)
self.sum = numpy.zeros(self.vectorsize)
self.count = 0
self.nave = 0
def work(self, input_items, output_items):
in0 = input_items[0]
nin = len(in0)
# if change in the vector size, must restart sum
if (nin != self.vectorsize) or (self.count == 0):
self.vectorsize = nin
self.sum = numpy.zeros(nin)
# initialize sum and count
self.sum = in0
self.count = 1
else:
self.sum = self.sum + in0
self.count = self.count + 1
#if time to output vector
if self.count >= self.nave:
out = output_items[0]
out[:] = self.sum/float(self.count)
self.count = 0
return len(out[:])
else:
return 0
My intention is to make this 4 vector average with decimate a part of the .grc environment, but the problems are easier to diagnose, as the QA code is stands alone. Here are the messages I’m getting: ESMU:vdecimate glangsto$ python qa_vdecimate.py handler caught exception: could not broadcast input array from shape (4,1024) into shape (1,1024) Traceback (most recent call last): File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gnuradio/gr/gateway.py", line 55, in eval try: self._callback() File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gnuradio/gr/gateway.py", line 160, in __gr_block_handle ) for i in self.__out_indexes], File "/Users/glangsto/Desktop/Research/vdecimate/vdecimate.py", line 58, in work out[:] = self.sum/float(self.count) ValueError: could not broadcast input array from shape (4,1024) into shape (1,1024) thread[thread-per-block[1]: <block vdecimate (2)>]: SWIG director method error. Error detected when calling 'feval_ll.eval' |
_______________________________________________ Discuss-gnuradio mailing list [email protected] https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
