GNU Radio创建时间戳 C++ OOT块


前言

目前有这么样一个需求,我想在 GNU Radio 中计算从一个模块到其他模块执行所花费的时间,我的做法是将获取的时间戳信息作为标签添加到数据流中,然后传入到待计算时间的那个模块后再获取当前时间并与流标签中的时间戳信息进行相减,即可得到所耗费的时间,也就达到了计算时间间隔的目的。

因此本文将创建红框内的三个 C++ OOT块,实现时间测量。

在这里插入图片描述


一、创建自定义的 C++ OOT 块

参考官方教程 Creating C++ OOT with gr-modtool 创建自定义的 OOT块

1、创建 timestamp_sender C++ OOT 模块

可以参考我之前的博客内容,做法都是差不多的:GNU Radio创建Zadoff-Chu序列C++ OOT块

详细代码及配置文件文末自取

①、创建 timestamp_sender OOT 块

gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add timestamp_sender

当让你输入模块类型时,选择 sync

Enter block type: sync

当让你输入参数时,按照如下方式输入:

Enter valid argument list, including default arguments: 
size_t itemsize

②、修改 C++ 代码

修改 gr-myModule/lib/ 目录下的 timestamp_sender_impl.cctimestamp_sender_impl.h 文件和 gr-myModule/grc/ 目录下的配置文件myModule_timestamp_sender_impl.block.yml

timestamp_sender_impl.cc 核心部分程序:

auto now = std::chrono::high_resolution_clock::now();
// 返回自纪元(通常是1970年1月1日)以来的时间间隔, 获取以微秒为单位的时间间隔值
auto now_us = 
	std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()).count();	// 以微秒(microseconds)为单位输出

// 创建标签并添加时间戳
pmt::pmt_t key = pmt::string_to_symbol("timestamp");
pmt::pmt_t value = pmt::from_long(now_us);
add_item_tag(0, nitems_written(0), key, value);

timestamp_sender_impl.h 核心部分程序:

private:
 // Nothing to declare in this block.
	size_t d_itemsize;

public:
 	timestamp_sender_impl(size_t itemsize);
 	~timestamp_sender_impl();
 
 	void send_timestamp(pmt::pmt_t msg);

myModule_timestamp_sender_impl.block.yml 部分核心配置:

parameters:
-   id: type
    label: Type
    dtype: enum
    options: [complex, float, int, short, byte]
    option_attributes:
        size: [gr.sizeof_gr_complex, gr.sizeof_float, gr.sizeof_int, gr.sizeof_short,
            gr.sizeof_char]
    hide: part

2、创建 timestamp_receiver C++ OOT 模块

①、创建 timestamp_receiver OOT 块

gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add timestamp_receiver 

当让你输入模块类型时,选择 sync

Enter block type: sync

当让你输入参数时,按照如下方式输入:

Enter valid argument list, including default arguments: 
size_t itemsize

②、修改 C++ 代码

修改 gr-myModule/lib/ 目录下的 timestamp_receiver_impl.cctimestamp_receiver_impl.h 文件和 gr-myModule/grc/ 目录下的配置文件myModule_timestamp_receiver_impl.block.yml

timestamp_receiver_impl.cc 核心部分程序:

std::vector<tag_t> tags;
get_tags_in_window(tags, 0, 0, noutput_items);	// 获取输入样本范围内的所有标签,并存储在 tags 向量中
    	      	
for (const auto& tag : tags)					// 遍历 tags 向量中的每个标签
{
	calculate_delay(tag.key, tag.value);
}

timestamp_receiver_impl.h 核心部分程序:

private:
	size_t d_itemsize;

	void calculate_delay(const pmt::pmt_t& key, const pmt::pmt_t& value);

myModule_timestamp_receiver_impl.block.yml 部分核心配置:

parameters:
-   id: type
    label: Type
    dtype: enum
    options: [complex, float, int, short, byte]
    option_attributes:
        size: [gr.sizeof_gr_complex, gr.sizeof_float, gr.sizeof_int, gr.sizeof_short,
            gr.sizeof_char]
    hide: part

3、创建 delayMicroSec C++ OOT 模块

①、创建 delayMicroSec OOT 块

gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add delayMicroSec

当让你输入模块类型时,选择 sync

Enter block type: sync

当让你输入参数时,按照如下方式输入:

Enter valid argument list, including default arguments: 
size_t itemsize, int delay_us

②、修改 C++ 代码

修改 gr-myModule/lib/ 目录下的 delayMicroSec_impl.ccdelayMicroSec_impl.h 文件和 gr-myModule/grc/ 目录下的配置文件myModule_delayMicroSec_impl.block.yml

delayMicroSec_impl.cc 核心部分程序:

// 延时指定的微秒数,只在第一次时延迟
if (first_time) {
 // 延时指定的微秒数
 std::this_thread::sleep_for(std::chrono::microseconds(d_delay_us));
 first_time = false; // 重置标志位,后续不再延迟
}

delayMicroSec_impl.h 核心部分程序:

private:
	size_t d_itemsize;
	int d_delay_us;
	bool first_time;

myModule_delayMicroSec_impl.block.yml 部分核心配置:

parameters:
-   id: type
    label: Type
    dtype: enum
    options: [complex, float, int, short, byte]
    option_attributes:
        size: [gr.sizeof_gr_complex, gr.sizeof_float, gr.sizeof_int, gr.sizeof_short,
            gr.sizeof_char]
    hide: part
-   id: delay_us
    label: delay us
    dtype: int
    default: 0 

详细代码及配置文件文末自取

二、编译及安装 OOT 块

1、上面创建的三个 OOT 块需要编译和安装,确保目前位于 gr-myModule 目录中:

cd gr-myModule

2、如果 build/ 目录已存在,请将其删除:

rm -rf build/

3、创建 build/ 目录

mkdir build

4、进入 build 目录

cd build/ 

5、运行 cmake 来构建 makefile

cmake ..

6、编译模块

make

7、安装模块

sudo make install

8、更新 myModule 库的链接

sudo ldconfig 

三、测试

打开 gnuradio-companion

gnuradio-companion

可以看到安装成功的模块
在这里插入图片描述

1、grc 图

正弦波信号源通过限流器后传递给 timestamp_sender 模块,timestamp_sender 将数据流附加上时间戳标签后,通过延时模块对信号延时 2s 后再将其传递至 timestamp_receiver 模块,timestamp_receiver 模块会计算所经历的时间间隔,当计算完成后会向 timestamp_sender 模块传递消息,告知 timestamp_sender 模块模块我目前已经计算完成,你可以继续往数据流上面附加时间戳标签方便我进行下次的计算。
在这里插入图片描述

2、运行结果

首先可以看到正弦波信号时域波形图附加着时间戳标签(微秒)
在这里插入图片描述
其次可以在console 端看到打印的时间间隔信息,为 2001073 us,大约为 2s,因为程序执行也需要一定的时间,当我们进行时间测量的时候,可以先将程序运行所需要的时间计算出来,并在计算时间间隔的时候减去这个值,以便计算的时间更加精准。
在这里插入图片描述

四、资源自取

链接:GNU Radio创建时间戳 C++ OOT块

在这里插入图片描述


我的qq:2442391036,欢迎交流!


  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
gnuradio是一个开源的无线电软件开发工具包,它提供了许多实用的库和工具,用于设计和实现软件定义无线电系统。在gnuradio中,低通滤波器(Low Pass Filter)是一种常用的信号处理工具,用于滤除高频部分,只保留低频成分。 在gnuradio中实现低通滤波器可以使用C语言编写代码。下面是一个简单的gnuradio低通滤波器的C代码示例: ```c #include <stdio.h> #include <gnuradio/filter/firdes.h> #include <gnuradio/filter/fft_filter.h> int main() { const float cutoff_freq = 1000.0; // 截止频率 const float sampling_rate = 2000.0; // 采样率 const int num_taps = 51; // 滤波器阶数(或系数个数) float taps[num_taps]; // 滤波器系数数组 // 使用gnuradio的firdes库函数设计低通滤波器 gr::filter::firdes::low_pass(num_taps, sampling_rate, cutoff_freq, gr::filter::firdes::WIN_HAMMING, taps); // 创建低通滤波器对象 gr::filter::fft_filter<float, float> lpf(num_taps, taps); // 打印滤波器系数 printf("滤波器系数:"); for (int i = 0; i < num_taps; i++) { printf("%.6f ", taps[i]); } printf("\n"); return 0; } ``` 以上代码使用gnuradio的`gr::filter::firdes::low_pass`函数设计了一个51阶的低通滤波器。`low_pass`函数根据指定的采样率、截止频率和窗口类型生成滤波器系数。然后,通过`gr::filter::fft_filter`类创建一个低通滤波器对象,并将滤波器系数传递给该对象。 上述代码中的`printf`语句用于打印滤波器系数。你可以根据需要将滤波器系数用于处理信号,进而实现信号的低通滤波效果。 当然,这只是一个简单的示例,实际应用中可能还需要添加其他相关配置和操作,具体实现方式可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

须尽欢~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值