2017-07-06 4 views
1

Je suis nouveau sur GNU Radio et je n'arrive pas à comprendre comment fonctionnent les tampons d'entrée et de sortie.Comment fonctionnent les tampons d'entrée et de sortie GNU Radio?

Je souhaite faire un bloc avec 1 entrée et 2 ports de sortie. En outre, je veux diviser une entrée de taille fixe en 2 flux de sortie ayant le même nombre d'éléments. Au tout début, j'ai fait un bloc qui a 1 port d'entrée et 1 port de sortie. Il reçoit 4 éléments et devrait mettre tous les autres sur le port de sortie, c'est à dire pour les valeurs d'entrée 1, 2, 3 et 4, il devrait sortir 1 et 3. J'ai surpassé la méthode de prévision et de travail général de la manière suivante fonctions printf pour faciliter debuging):

void test_block_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) 
    { 
     printf("Forcast, number of noutput_items %d\n", noutput_items); 
     ninput_items_required[0] = noutput_items * 2; 
     printf("Forcast, required input items %d\n", ninput_items_required[0]); 
    } 


int test_block_impl::general_work (int noutput_items, 
         gr_vector_int &ninput_items, 
         gr_vector_const_void_star &input_items, 
         gr_vector_void_star &output_items) 
    { 
     const float *in = (const float *) input_items[0]; 
     float *out = (float *) output_items[0]; 
     int num_inputitems = ninput_items[0]; 

     printf("General work, number of input items %d, number of output items %d\n", num_inputitems, noutput_items); 
     for (int i = 0; i < num_inputitems ; i++) 
     { 
     if (i % 2 == 0) 
     { 
      out[ i/2 ] = in[i]; 
      printf("out %f, in %f\n", out[i/2], in[i]); 
     } 
     } 
     consume_each (noutput_items*2); // or should I put num_inputitems 

     // Tell runtime system how many output items we produced. 
     return noutput_items*2; 
    } 

J'ai aussi appelé set_max_noutput_items(2) dans le constructeur. J'espérais que la fonction de prévision indiquera au bloc qu'il a besoin d'une entrée de taille 4 et qu'après cela la fonction de travail général traitera ces éléments et sortira seulement une seconde.

Malheureusement, après avoir écrit un test Python, j'ai eu beaucoup de résultats inattendus, donc j'ai pensé que je ne comprenais pas correctement le concept des tampons. Pour le test:

src_data = array ([ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) 

    expected_result1 = (1.0, 3.0, 5.0) 

    src = blocks.vector_source_f(src_data) 
    dmx = tutorial.test_block(number) 
    dst1 = blocks.vector_sink_f() 

    self.tb.connect(src, dmx) 
    self.tb.connect(dmx, dst1) 
    self.tb.run (4) 

J'ai REÇU:

4: Forcast, number of noutput_items 2 
4: Forcast, required input items 4 
4: Forcast, number of noutput_items 1 
4: Forcast, required input items 2 
4: Forcast, number of noutput_items 2 
4: Forcast, required input items 4 
4: General work, number of input items 6, number of output items 2 
4: out 1.000000, in 1.000000 
4: out 3.000000, in 3.000000 
4: out 5.000000, in 5.000000 
4: Forcast, number of noutput_items 2 
4: Forcast, required input items 4 
4: Forcast, number of noutput_items 1 
4: Forcast, required input items 2 
4: General work, number of input items 2, number of output items 1 
4: out 5.000000, in 5.000000 
4: Forcast, number of noutput_items 2 
4: Forcast, required input items 4 
4: Forcast, number of noutput_items 1 
4: Forcast, required input items 2 
4: (1.0, 3.0, 5.0, 0.0, 5.0, 0.0) 

Si quelqu'un peut me aider à comprendre d'où sont-GNU Radio obtenir ces zéros et pourquoi il appelle la méthode de prévision dans cet ordre? :)

Répondre

0

J'ai réalisé que general_work devrait retourner le nombre de sortie produit dans cet appel de méthode et consume devrait recevoir le nombre ou les éléments d'entrée qu'il traitera. Donc, dans mon cas pour obtenir le résultat attendu, je devrais appeler consume_each avec ninput_items (consume_each(ninput_items)) et return ninput_items/2