Reputation: 13
How can I set custom buffer size for OOT python block in GNU Radio? My goal is block with input parameter input_buffer_len and block's geeral_work() function works with exactly input_buffer_len samples.
input_buffer_len = 1360
My code so far:
import numpy as np
from gnuradio import gr
def __init(self, input_buffer_len):
gr.basic_block.__init__(self,
name="sync_test",
in_sig=[np.uint8],
out_sig=[np.uint8])
self.input_buffer_len = input_buffer_len
def forecast(self, noutput_items, ninput_items_required):
print("FORECAST START")
ninput_items_required[0] = self.input_buffer_len
print("len(ninput_items_required),noutput_items",len(ninput_items_required),noutput_items)
print("FORECAST END")
def general_work(self, input_items, output_items):
print("GENERAL WORK START")
print("len(input_items)", len(input_items[0]))
print("len(output_items)", len(output_items[0]))
output_items[0][0:self.input_buffer_len] = input_items[0][0:self.input_buffer_len]
self.produce(0, self.input_buffer_len)
self.consume(0, self.input_buffer_len)
print("GENERAL WORK END")
return 0
Output:
FORECAST START
len(ninput_items_required),noutput_items 1 32768
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 16384
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 8192
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 4096
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 2048
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 1024
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 512
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 256
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 128
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 64
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 32
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 16
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 8
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 4
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 2
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 1
FORECAST END
FORECAST START
len(ninput_items_required),noutput_items 1 32768
FORECAST END
GENERAL WORK START
len(input_items) 32895
len(output_items) 32768
GENERAL WORK END
FORECAST START
len(ninput_items_required),noutput_items 1 32768
FORECAST END
GENERAL WORK START
len(input_items) 30175
len(output_items) 32768
GENERAL WORK END
FORECAST START
len(ninput_items_required),noutput_items 1 32768
FORECAST END
GENERAL WORK START
len(input_items) 27455
len(output_items) 32768
GENERAL WORK END
FORECAST START
len(ninput_items_required),noutput_items 1 32768
FORECAST END
GENERAL WORK START
len(input_items) 26095
len(output_items) 32768
GENERAL WORK END
FORECAST START
len(ninput_items_required),noutput_items 1 32768
FORECAST END
GENERAL WORK START
len(input_items) 24735
len(output_items) 32768
GENERAL WORK END
...
GENERAL WORK END
It looks like input_items keeps decreasing by input_buffer_len every general_work() call and output_items stays at 32768, does that mean GNU Radio works with input_buffer_len elements every general work()? Or am I misunderstanding something? Im using GNU Radio V3.8.2
Upvotes: 1
Views: 1638
Reputation: 36442
block's geeral_work() function works with exactly input_buffer_len sample
That's impossible. This is central to how GNU Radio works. Also, it's not necessary: Say, your block always needs 1000 items and produces something between 900 and 2000 items (if this ration was easy, you wouldn't be using a general block with general_work
, but a sync_block
, or interpolator
, or decimator
). Then, your forecast should simply always make clear you need 1000 items to produce anything. Then, in your general_work
, check whether you got at least 1000 items, consume exactly 1000 items, and not all that you've got. It looks a bit as if you didn't quite understand what consume()
and produce()
do!
What you can do is use set_output_multiple
and similar functions to restrict your numbers a bit.
Upvotes: 1