200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > gnuradio模块分类

gnuradio模块分类

时间:2022-11-01 08:59:46

相关推荐

gnuradio模块分类

sync_XXX

很简单,输入输出比固定,不需要做consume和produce。可以调用set_history(TAPS_LEN); 来输入历史数据,类似fir。

source:1 2 3 4 5 6 7 8 9 10

noutput=5

则第一次输入:12345

set_history(2)

则得二次输入为

56789

第三次输入为

678910

若set_history(1)//默认值

则第二次输入为

6 7 8 9 10

#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <gnuradio/io_signature.h>#include "bin2dec_bb_impl.h"namespace gr {namespace dab {bin2dec_bb::sptrbin2dec_bb::make(uint32_t k){return gnuradio::get_initial_sptr(new bin2dec_bb_impl(k));}/** The private constructor*/bin2dec_bb_impl::bin2dec_bb_impl(uint32_t k): gr::sync_decimator("bin2dec_bb",gr::io_signature::make(1, 1, sizeof(uint8_t)),gr::io_signature::make(1, 1, sizeof(uint8_t)), k),d_k(k){if (d_k == 0) {throw std::out_of_range("interpolation must be > 0");}}/** Our virtual destructor.*/bin2dec_bb_impl::~bin2dec_bb_impl(){}intbin2dec_bb_impl::work(int noutput_items,gr_vector_const_void_star &input_items,gr_vector_void_star &output_items){const uint8_t *in = (const uint8_t *) input_items[0];uint8_t *out = (uint8_t *) output_items[0];// Do <+signal processing+>for(uint32_t i = 0; i < noutput_items; i++) {out[i] = 0x00;for(uint32_t j = 0; j < d_k; j++) {out[i] |= (0x01 & in[i*d_k+j])<<(d_k-j-1);}}// Tell runtime system how many output items we produced.return noutput_items;}} /* namespace dab */} /* namespace gr */

这里输入输出比k:1

这里输入比输出k:1 保证有k × noutput 个ninput,in[i*d_k+j]不会越界

以for(uint32_t i = 0; i < noutput_items; i++)来驱动数据

一个例子qpsk map:输入1 2 3 4 5 6 输出1+4j 2+5j 3+6j

<pre name="code" class="cpp"><pre name="code" class="cpp">#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <gnuradio/io_signature.h>#include "qpsk_map_impl.h"namespace gr {namespace dab {qpsk_map::sptrqpsk_map::make(uint32_t data_size){return gnuradio::get_initial_sptr(new qpsk_map_impl(data_size));}/** The private constructor*/qpsk_map_impl::qpsk_map_impl(uint32_t data_size): gr::sync_block("qpsk_map",gr::io_signature::make(1, 1, data_size * sizeof(float)),gr::io_signature::make(1, 1, data_size * sizeof(gr_complex) / 2)),d_data_size(data_size){}/** Our virtual destructor.*/qpsk_map_impl::~qpsk_map_impl(){}intqpsk_map_impl::work(int noutput_items,gr_vector_const_void_star &input_items,gr_vector_void_star &output_items){const float *in = (const float *) input_items[0];gr_complex *out = (gr_complex *) output_items[0];// Do <+signal processing+>for (size_t i = 0; i < noutput_items; i++) {for (size_t j = 0; j < d_data_size/2; j++) {out[j].real() = in[j];out[j].imag() = in[j+d_data_size/2];}out += d_data_size / 2;in += d_data_size;}// Tell runtime system how many output items we produced.return noutput_items;}} /* namespace dab */} /* namespace gr */

//注意输入输出size的大小,将输入输出都定义为vector。

gr::io_signature::make(1, 1, data_size * sizeof(float)),

gr::io_signature::make(1, 1, data_size * sizeof(gr_complex) / 2))

//看起来输入输出是2:1,但其实是1:1,因为输入输出都是vector,输入<strong>1 2 3 4 5 6 是一个vector,不是6个数,同理输出 输出1+4j 2+5j 3+6j是一个复数vector不是3个复数

//注意不要忘记out += d_data_size / 2;in += d_data_size;,当data_size很大的时候,noutput_iterms经常为1,不加以上两句结果也对,但是noutput_iterms>1时就有问题,会导致结果一下对一下错,很难debug

general

输入输出比任意。主要是通过consume(消耗了多少个input)和produce(产生了多少个output),默认return值就是produce的值,当然也可以显示调用,此时返回值为 return WORK_CALLED_PRODUCE。使用forecast来保证在给定noutput情况下需要有多少个input输入。

source:1 2 3 4 5 6 7 8 9 10

forecase:2

noutput=2

则第一次输入:1234

若consume(2)

若produce(1)

则第一次输出1个output

则第二次输入:3456

若consume(4)

则第二次输入5678

是好例子

sync和general类型模块都是以noutput驱动的,如下所示,forecast中也是以noutput去赋值ninput

for (size_t i = 0; i < noutput_items; i++)

但是tag类型模块是以ninput驱动的,如下所示

{

const float *in = (const float *) input_items[0];

float *out = (float *) output_items[0];

uint32_t packet_length = ninput_items[0];

// Do <+signal processing+>

for (uint32_t i = 0; i < packet_length; i++) {

if (d_pnctrg_vec[i] == 1) {

*out++ = *in++;

}

else {

*out++ = d_fill_val;

}

}

// Tell runtime system how many output items we produced.

return d_return_len;

在tag类型的模块中使用calculate_output_stream_length函数,ninput决定noutput,如下所示

unpuncture_impl::calculate_output_stream_length(const gr_vector_int &ninput_items) {

int noutput_items = d_return_len;

return noutput_items ;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。