Creating a signal source block using Python

Hello All,

I’ve been attempting to create my own source block in Python. I have
been
reading the blocks coding guide here:
Blocks Coding Guide · guruofquality/grextras Wiki · GitHub,
but so far my source only outputs zeros.
An outline of my code is as follows:

class constSource(gr.block):
def init(self):
gr.block.init(self, name = “signal source”, in_sig

None,out_sig = [numpy.complex64])

def work(self, input_items, output_items):
num_output_items = len(output_items[0])

     #I put the code to create what I want to stream here, the code

creates a numpy.complex64 array with a length of 32. I then return
num_output_items
return num_output_items

I then write my constSource block to a file and I try to see the output
of
the file using a scope sink, but it is just a constant stream of zeros.
Am
I missing a key part of creating a source block? Also, the reason I
don’t
use a file source is that the stream I am trying to create is dependent
upon the time of day, so pulling it from a file source will mean that it
is
delayed somewhat. I will eventually want to transmit this data as well,
not
just put it in a file sink.

Thanks,
Anisha

On Wed, Jul 18, 2012 at 02:32:28PM -0400, Anisha G. wrote:

I then write my constSource block to a file and I try to see the output of the
file using a scope sink, but it is just a constant stream of zeros. Am I
missing a key part of creating a source block? Also, the reason I don’t use a
file source is that the stream I am trying to create is dependent upon the time
of day, so pulling it from a file source will mean that it is delayed somewhat.
I will eventually want to transmit this data as well, not just put it in a file
sink.

GrExtras is really a test to figure out who’s amazing at Python. I
already failed once (same prob):
http://lists.gnu.org/archive/html/discuss-gnuradio/2012-06/msg00143.html

MB


Karlsruhe Institute of Technology (KIT)
Communications Engineering Lab (CEL)

Dipl.-Ing. Martin B.
Research Associate

Kaiserstraße 12
Building 05.01
76131 Karlsruhe

Phone: +49 721 608-43790
Fax: +49 721 608-46071
www.cel.kit.edu

KIT – University of the State of Baden-Württemberg and
National Laboratory of the Helmholtz Association

Thanks for the response! I can now see that output_items is getting
properly filled, however, when I try to display the file, I’m still
getting
zero. Besides a throttle is there a way to control the frequency of the
random numbers or whatever source I am creating?
Thanks,
Anisha

On 07/18/2012 11:32 AM, Anisha G. wrote:

             gr.block.__init__(self, name = "signal source", in_sig =

None,out_sig = [numpy.complex64])

def work(self, input_items, output_items):
num_output_items = len(output_items[0])

     #I put the code to create what I want to stream here, the code

creates a numpy.complex64 array with a length of 32. I then return
num_output_items

You didnt include the code, but I am guessing that you are not assigning
anything to the output vector?

numpy array assignment look like this
output_items[0][some kind of index selection] = data

Look closely at how the examples do this

-josh

It works now, thanks! It was a combination of a couple dumb errors on my
part. One last thing, I was wondering if there was a way to change the
length of output_items[0]? It is 4096 by default I believe.
Thanks,
Anisha

On 07/19/2012 11:28 AM, Anisha G. wrote:

It works now, thanks! It was a combination of a couple dumb errors on my
part. One last thing, I was wondering if there was a way to change the
length of output_items[0]? It is 4096 by default I believe.
Thanks,
Anisha

The item length is basically randomly decided by the scheduler. However,
you call set_output_multiple(x) and you will be guaranteed to get x*N
items where N is an integer. Also, you dont have to actually fill all
items, just fill the number you plan to produce.

-josh

I was trying that earlier, however, I get this error from my code
output_items[0][:] = x #where x equals a numpy.complex64 array with a
length of 32

ValueError: operands could not be broadcast together with shapes (4096)
(32)

Sorry, just to clarify, I get that error unless I fill output_items
completely, no matter the length of x.
Thanks,
Anisha

I was trying that earlier, however, I get this error from my code
output_items[0][:] = x #where x equals a numpy.complex64 array with
a length of 32

ValueError: operands could not be broadcast together with shapes
(4096) (32)
Try something like:

 n_processed = len(x)
 output_items[0][:n_processed] = x
 return n_processed

I hope that helps.

-Gerald

That worked, thanks!

On Thu, Jul 19, 2012 at 4:46 PM, Gerald B.