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
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模块分类相关推荐
- SAP系统的模块分类
SAP系统的模块分类: SAP是世界最大的企业信息管理解决方案提供商,也是ERP产品的最大生产商.其全称是Systems Applications and Products in data proce ...
- 一文详解蓝牙模块分类
目录 前言 一.按照协议类型分 二.按照对协议的支持分 三.按照功能分 四.按照芯片设计分 五.按照功率分 六.按照支持的温度分 总结 前言 蓝牙模块,是一种集成蓝牙功能的PCBA板,用于短距离无线通 ...
- gnuradio android手机,常用的gnuradio 模块
---恢复内容开始--- 参考:http://gnuradio.org/redmine/projects/gnuradio/wiki/TutorialsWritePythonApplications ...
- 消防信号总线原理_消防报警系统中消防模块分类与用途简介
通过前一阶段的学习,我们知道消防报警联动主机在火灾发生的时候会接收到相关信号,一旦接收的信号符合相关逻辑关系,报警联动主机会按照既定程序发生一连串联动的动作,以达到延缓火灾的蔓延,最终达到灭火的目的. ...
- python模块的分类有哪些_python之模块分类(六)
一.概念 re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用.注意: re模 ...
- python模块分类_Python-模块分类及导入
使用python时,我们会发现经常需要import一些模块.模块其实就是一个python文件,导入模块的实质是把模块中的内容执行一次. 例如,有个模块叫mokuai,我们可以这样导入 from mok ...
- QX项目实战-2.模块分类以及配置读取
QX项目主要实现对文本源数据的解析入库,以及对其后修改过程建立质量控制和追溯流程,以求信息更正管理.数据源自动更新等功能和特性. 初步设想是把系统粗分为预处理.处理.生产和质量控制四个部分.各部分功能 ...
- Python模块和包的介绍(模块含义、用模块好处、模块分类、包和模块的创建)
- 500个Python模块(库)的详细分类介绍
常用模块 Chardet-------------字符编码探测器,可以自动检测文本.网页.xml的编码.colorama------------主要用来给文本添加各种颜色,并且非常简单易用.Prett ...
最新文章
- iOS7导航栏和状态栏的定制
- alias重启终端失效的问题
- Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】...
- DirectoryEntry所有字段对应解释
- Android 页面多状态布局管理
- Chapter7-2_BERT and its family - Introduction and Fine-tune
- 图解 CSS (8): 浮动、显示、隐藏
- MuiPlayer视频播放组件入门
- 系统内核快速编译并替换的方法
- office2007每次打开都配置进度_解决Office2007每次启动时出现配置进度的问题
- CI框架精简版教程 最快上手
- 计算机仿真技术交通灯设计,交通灯的设计心得体会总结
- 基于ssm的电动车实名制挂牌管理系统
- MarkDown在线编辑器(支持公众号知乎)
- java雷霆战机图片_JAVA开发《雷霆战机》雷电类游戏效果演示
- 不规则物体抓取机械手机械臂
- [电路笔记]非线性电路
- 联合循环——16(电缆终端接地总结)
- Cadence Orcad Capture元件位号自动编号的2种方法图文教程及视频演示
- 轻松输入并注音生僻字
热门文章
- 三菱数控 MITSUBISHI MELDAS 60 600系统维修
- JAVA 使用if选择结构判断某一年份是否是闰年。闰年的条件:普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年);世纪闰年:能被400整除的为世纪闰年。
- 个人简历——各类奖学金、各种称号、各种职位中英文对照:
- C++结构体嵌套结构体
- .CS文件编译生成.DLL文件 .EXE文件
- 【014】基于Vue.js的移动端购物商城网站(含源码、课设报告)
- 带薪“看片”?继阿里后微信也公开招聘“鉴黄师”!
- 办公室服务器文件管理制度,办公室文件管理制度
- 2020 Maven无法使用阿里云仓库下载的解决方法
- 【Solr】之使用springboot完成对【京东搜索商品】案例的实现