|
From: | Kevin McQuiggin |
Subject: | [Discuss-gnuradio] Newbie Question on set_interpolation and a New Variable Repeat Block |
Date: | Sat, 1 Aug 2015 16:06:53 -0700 |
Hi All: I am sorry to bother the list with such newbie questions, but I am climbing the gnuradio and C++ learning curve. Hope you don’t mind! I am working on a new OOT block that is similar to the Repeat block, but allows for a variable interpolation rate. I followed the Guided Tutorials (thanks Marcus et al) and the new block, which I called “repeat_dynamic” appears to be working, sort of… What I notice is that a simple flowgraph to testing purposes grinds to a halt. I noticed this while debugging my <callback> function that resets the appropriate interpolation variable, called d_interp. Here is my flowgraph, with the properties of the new block shown. Note that “Interpolation is set to variable ‘z’, which is controlled through a Chooser: Here are my callback and work() functions. work() is essentially copied from the standard Repeat block. I have added some debug print statements to the console to try to figure out what is going on: void repeat_dynamic_impl::set_interp(int interp) { d_interp = interp; gr::sync_interpolator::set_interpolation(d_interp); std::cout << "set_interp: d_interp now equals " << d_interp << "\n"; } int repeat_dynamic_impl::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const char *in = (const char *) input_items[0]; char *out = (char *) output_items[0]; // Do <+signal processing+> std::cout << "work: noutput_items = " << noutput_items << "\n"; std::cout << "work: d_interp = " << d_interp << "\n\n"; for (int i = 0; i < noutput_items/d_interp; i++) { for (int j = 0; j < d_interp; j++) { memcpy(out, in, d_itemsize); out += d_itemsize; } in += d_itemsize; } // Tell runtime system how many output items we produced. return noutput_items; } My callback function gets triggered correctly when I change the value of variable ‘z’ through the flowgraph Chooser. I see console messages “d_interp now equals X”. So far so good. The problem is that the input 0 of the Time Sink doesn’t change to reflect the new value of d_interp. I added two more debug print statements to work() to see what’s going on. I know this may not be advisable given assumed complexities in the scheduler, but I wanted to do something to try to solve my own problem. The entire flowgraph appears to work for awhile, but noutput_items moves towards 0 and the whole process grinds to a halt. I tried reducing the sampling rate to 1000, and then I CAN see changes in the Time Sink and the in0 trace getting updated as I click various alternate ‘z’ values in the Chooser, but soon the debug messages from work() cease and everything seems to grind to a halt with a low value (~10) for noutput_items. The graph is still running, however, as subsequent clicks in the Chooser, changing ‘z’, still result in a console message showing that d_interp has indeed been updated. I just never see another update from the two std::cout statements in work(). As it works at low sample rates for awhile (max a few seconds), I think that the basic functionality is okay. I am missing a C++ or gnuradio nuance of some type. So, I am guessing that I am doing something wrong possibly in the way I call sync_interpolator::set_interpolation(d_interp) in my callback function. Newbie deficiencies are evident and I am turing to the list for some suggestions. I am using Ubuntu 14.04 and the latest gnuradio, built through the build-bnuradio script. Thanks in advance, Kevin |
signature.asc
Description: Message signed with OpenPGP using GPGMail
[Prev in Thread] | Current Thread | [Next in Thread] |