On Wed, Jun 15, 2011 at 1:31 AM, Henry Matt <[email protected]> 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 <[email protected]>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
> [email protected]
> https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>
>
>
>
>
> _______________________________________________
> Discuss-gnuradio mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>
>
_______________________________________________
Discuss-gnuradio mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to