文章目錄
- 前言
- 一、創建自定義的 C++ OOT 塊
- 1、創建 timestamp_sender C++ OOT 模塊
- ①、創建 timestamp_sender OOT 塊
- ②、修改 C++ 代碼
- 2、創建 timestamp_receiver C++ OOT 模塊
- ①、創建 timestamp_receiver OOT 塊
- ②、修改 C++ 代碼
- 3、創建 delayMicroSec C++ OOT 模塊
- ①、創建 delayMicroSec OOT 塊
- ②、修改 C++ 代碼
- 二、編譯及安裝 OOT 塊
- 三、測試
- 1、grc 圖
- 2、運行結果
- 四、資源自取
前言
目前有這么樣一個需求,我想在 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.cc
和 timestamp_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: typelabel: Typedtype: enumoptions: [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.cc
和 timestamp_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: typelabel: Typedtype: enumoptions: [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.cc
和 delayMicroSec_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: typelabel: Typedtype: enumoptions: [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_uslabel: delay usdtype: intdefault: 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,歡迎交流!