Динамически изменяйте количество выводимых элементов

Возможно ли в функции work () блока gr динамически изменять количество элементов вывода, оставляя одинаковое количество элементов ввода?

В моем случае мне нужно 2 случая на основе условия:
1) 4096 IN: 0 OUT
2) 4096 IN: 4096 OUT

Спасибо

0

Решение

Да, вы хотите, чтобы ваш блок наследовал от gr::block (в отличие от более распространенного sync_blockи т. д.) и использовать general_work обрабатывать образцы.

В general_work, ты можешь позвонить this->consume() сообщить количество сэмплов, которые вы хотите удалить из входного буфера, и return [int] динамически сообщит планировщику, сколько сэмплов вы передаете в следующий блок на этот раз.

https://gnuradio.org/redmine/projects/gnuradio/wiki/BlocksCodingGuide#Basic-Block

Вот их пример кода из вики, хотя обратите внимание, что стиль кодирования этого примера не совсем соответствует тому, как в настоящее время кодируются блоки gnuradio, но он дает вам представление о том, как использовать general_work, Для более свежего примера я рекомендую закрыть исходный код gnuradio и использовать grepping для general_work:

#include <gr_block.h>

class my_basic_block : public gr_block
{
public:
my_basic_adder_block(...):
gr_block("another adder block",
in_sig,
out_sig)
{
//constructor stuff
}

int general_work(int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
//cast buffers
const float* in0 = reinterpret_cast<const float *>(input_items[0]);
const float* in1 = reinterpret_cast<const float *>(input_items[1]);
float* out = reinterpret_cast<float *>(output_items[0]);

//process data
for(size_t i = 0; i < noutput_items; i++) {
out[i] = in0[i] + in1[i];
}

//consume the inputs
this->consume(0, noutput_items); //consume port 0 input
this->consume(1, noutput_items); //consume port 1 input
//this->consume_each(noutput_items); //or shortcut to consume on all inputs

//return produced
return noutput_items;
}
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]