discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Discuss-gnuradio] sample wise execution of blocks in grc flow graph


From: John Andrews
Subject: Re: [Discuss-gnuradio] sample wise execution of blocks in grc flow graph?
Date: Wed, 15 Jun 2011 10:56:14 -0500



On Wed, Jun 15, 2011 at 1:31 AM, Henry Matt <address@hidden> wrote:
Hi Colby,

So it means that it if one input comes at 20 samples/sec then it limits the output rate of my custom block to exactly 20 samples/sec? That is, the other input, gr_noise_source can provide samples at a rate faster than 20 samples/sec to the custom block input but the custom block produces output only when both inputs are available. Am I right?
 
Yes, the custom block will execute its general_work() function only when the right number of input items are available on all the input streams.


I am sorry for not being clear about the other part of question. The question is that if I further multiply the output of the custom block (which has a sample rate of 20 samples/sec) with another signal of sampling rate 2M samples/sec then what will be the sampling rate of the product signal?

Look at the general_work() function for the simplest of blocks such as gr_add_cc etc to understand the behaviour. Look at the following example. In this I am producing 1/4th the number of input items I am using. I am sending out every 4th input sample to the output, and effectively reducing the sampling rate by 4. So as long as the input is available I keep sending every 4th item to the output. If the input doesn't arrive then the executing thread waits until it has something to work with.

int
custom_block_b::general_work(int noutput_items,gr_vector_int &ninput_items,gr_vector_const_void_star &input_items,gr_vector_void_star &output_items)

  const unsigned char *in = (const unsigned char *)input_items[0];
 unsigned char *out = (unsigned char *)output_items[0];
 int j=0;
  for(int i=0;i<noutput_items;i++) {
      if(i%4==0){
         out[j] = in[i];
         j++;
    }

The output rate is determined by your work function. In the following code I am producing more output than what I am using at the input.

int
custom_block_b::general_work(int noutput_items,gr_vector_int &ninput_items,gr_vector_const_void_star &input_items,gr_vector_void_star &output_items)

  const unsigned char *in = (const unsigned char *)input_items[0];
 unsigned char *out = (unsigned char *)output_items[0];
 int j=0;
 int k=0;
  for(int i=0;i<noutput_items;i++) {
      if(in[i]==0x00){
        for (int j=0;j<4;j++){
           out[k]=in[i] ;
           k++;
        }
       else{
         for(int j=0;j<4;j++){
             out[k]=~in[i];
             k++;
         }
      }
      
   consume(noutput_items);
   return k;
}


As Colby has already mentioned, you must be careful about having mismatched rates.

I hope this helps.





 
If it will be 2M samples/sec then will the  custom block output sampled at 2M samples/sec have 1 non-zero sample followed by 100,000-1 zeros or will the custom block hold its output value to repeat it 100,000 times until the next sample arrives after 50mS?

Thanks a lot,
H.  


Hi Henry,

GNU Radio, as far as I understand, does not have a concept of time. It will try to process samples as quickly as they are available. If your input sample is arriving every 50mS then a sample should be produced by your block shortly after the 50mS arrival mark.

What do you mean, the output value should stay there? The output value is shipped off to some other block that connects to yours.

--Colby

On Tue, Jun 14, 2011 at 10:35 PM, Henry Matt <address@hidden> wrote:
Hi,

I have made a custom block derived from gr_block which has two inputs. First input comes at a sampling rate of 20 samples/sec while the other input comes from the gr_noise_source block. Now, my question is: what will be the sampling rate at my custom block output? Is it also 20 samples/sec? If not then how can I make it 20 samples/sec. Also,  my custom block needs to operate on sample by sample basis not on chunks of noutput_items. In other words, the custom block should produce an output sample after every 50mS (and not before) when both inputs arrive and that output value then should stay there for another 50mS until next input samples for two inputs arrive and new output is computed.

Thanks in anticipation,
H. 

_______________________________________________
Discuss-gnuradio mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio





_______________________________________________
Discuss-gnuradio mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio



reply via email to

[Prev in Thread] Current Thread [Next in Thread]