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

peak_detector_XXX_impl.cc是好例子

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 ;

gnuradio模块分类相关推荐

  1. SAP系统的模块分类

    SAP系统的模块分类: SAP是世界最大的企业信息管理解决方案提供商,也是ERP产品的最大生产商.其全称是Systems Applications and Products in data proce ...

  2. 一文详解蓝牙模块分类

    目录 前言 一.按照协议类型分 二.按照对协议的支持分 三.按照功能分 四.按照芯片设计分 五.按照功率分 六.按照支持的温度分 总结 前言 蓝牙模块,是一种集成蓝牙功能的PCBA板,用于短距离无线通 ...

  3. gnuradio android手机,常用的gnuradio 模块

    ---恢复内容开始--- 参考:http://gnuradio.org/redmine/projects/gnuradio/wiki/TutorialsWritePythonApplications ...

  4. 消防信号总线原理_消防报警系统中消防模块分类与用途简介

    通过前一阶段的学习,我们知道消防报警联动主机在火灾发生的时候会接收到相关信号,一旦接收的信号符合相关逻辑关系,报警联动主机会按照既定程序发生一连串联动的动作,以达到延缓火灾的蔓延,最终达到灭火的目的. ...

  5. python模块的分类有哪些_python之模块分类(六)

    一.概念 re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用.注意: re模 ...

  6. python模块分类_Python-模块分类及导入

    使用python时,我们会发现经常需要import一些模块.模块其实就是一个python文件,导入模块的实质是把模块中的内容执行一次. 例如,有个模块叫mokuai,我们可以这样导入 from mok ...

  7. QX项目实战-2.模块分类以及配置读取

    QX项目主要实现对文本源数据的解析入库,以及对其后修改过程建立质量控制和追溯流程,以求信息更正管理.数据源自动更新等功能和特性. 初步设想是把系统粗分为预处理.处理.生产和质量控制四个部分.各部分功能 ...

  8. Python模块和包的介绍(模块含义、用模块好处、模块分类、包和模块的创建)

  9. 500个Python模块(库)的详细分类介绍

    常用模块 Chardet-------------字符编码探测器,可以自动检测文本.网页.xml的编码.colorama------------主要用来给文本添加各种颜色,并且非常简单易用.Prett ...

最新文章

  1. iOS7导航栏和状态栏的定制
  2. alias重启终端失效的问题
  3. Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】...
  4. DirectoryEntry所有字段对应解释
  5. Android 页面多状态布局管理
  6. Chapter7-2_BERT and its family - Introduction and Fine-tune
  7. 图解 CSS (8): 浮动、显示、隐藏
  8. MuiPlayer视频播放组件入门
  9. 系统内核快速编译并替换的方法
  10. office2007每次打开都配置进度_解决Office2007每次启动时出现配置进度的问题
  11. CI框架精简版教程 最快上手
  12. 计算机仿真技术交通灯设计,交通灯的设计心得体会总结
  13. 基于ssm的电动车实名制挂牌管理系统
  14. MarkDown在线编辑器(支持公众号知乎)
  15. java雷霆战机图片_JAVA开发《雷霆战机》雷电类游戏效果演示
  16. 不规则物体抓取机械手机械臂
  17. [电路笔记]非线性电路
  18. 联合循环——16(电缆终端接地总结)
  19. Cadence Orcad Capture元件位号自动编号的2种方法图文教程及视频演示
  20. 轻松输入并注音生僻字

热门文章

  1. 三菱数控 MITSUBISHI MELDAS 60 600系统维修
  2. JAVA 使用if选择结构判断某一年份是否是闰年。闰年的条件:普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年);世纪闰年:能被400整除的为世纪闰年。
  3. 个人简历——各类奖学金、各种称号、各种职位中英文对照:
  4. C++结构体嵌套结构体
  5. .CS文件编译生成.DLL文件 .EXE文件
  6. 【014】基于Vue.js的移动端购物商城网站(含源码、课设报告)
  7. 带薪“看片”?继阿里后微信也公开招聘“鉴黄师”!
  8. 办公室服务器文件管理制度,办公室文件管理制度
  9. 2020 Maven无法使用阿里云仓库下载的解决方法
  10. 【Solr】之使用springboot完成对【京东搜索商品】案例的实现