2016-12-07 58 views
0

我無法使自定義塊以高頻率運行。GNURadio問題與時間

我想使用的塊將從外部無線電接收數據。

我正在使用一個Ettus USRP塊從這個收音機中流入數據,並且我可以在QT Scope上顯示它。我可以將這個模塊的採樣速率設置爲15 MHz,並且範圍似乎可以正常工作。

問題:

我試圖使與gnuradio中gr_modtool這需要在2個漂浮作爲輸入,並具有0輸出一個簡單的塊。該塊有私人成員「計時器」,time_t和「計數器」,一個int。在「工作」功能,我的代碼只需做到這一點的時刻:

const float *in_i = (const float *) input_items[0]; 
const float *in_q = (const float *) input_items[1]; 

if (count == 0){ 
    if (*in_i > 0.5){ 
     timer = clock(); 
     count = 30000; 
    } 
}else{ 
    count --; 
    if(count == 0){ 
     timer = clock()-timer; 
     printf("Count took %d clicks, or %f seconds\n",timer,(float)timer/CLOCKS_PER_SEC); 
    } 
} 
    // Tell runtime system how many output items we produced. 
    return 0; 

然而,當我運行此代碼,需要更長的時間比預期的時間。 對於30000個週期,完成需要0.872970,而不是所需的0.002秒。由於使用gr_modtool生成的標準gnuradio塊是一個同步塊,並且該塊的輸入流來自15 MHz USRP,所以我預計該塊將以相同的頻率運行。目前情況並非如此。

最終,我的目標是能夠在一段時間內存儲數據流,並將其寫入到具有特定格式的文件中(已經有一個塊可以執行此操作,但存在某種阻止塊和USRP塊同時工作,所以我試圖寫自己的。)。但是,除非我能跟上15MHz的採樣率,否則我將丟失數據。由於這個模塊非常簡單,我希望它能夠快速運行以保持速度。但是,輸入流塊能夠從收音機中提取數據並以15 MHz的頻率輸出,所以我知道我的電腦能夠支持它。

我怎樣才能讓這個自定義模塊更快速地操作,並與15兆赫的頻率跟上?(或者說,我怎樣才能使這個同步塊輸入流頻率下工作,因爲它目前沒有)

回答

0

你的區塊沒有消耗任何樣本。我假設你正在編寫一個sync_blockwork函數,而不是general_work),所以你的產生的項數與消耗的項的數相同。但當你的源代碼中說:

// Tell runtime system how many output items we produced. 
return 0; 

換句話說,你的塊告訴GNU收音機,它沒有使用任何輸入的GNU Radio提供的,並沒有產生輸出。這意味着GNU Radio不會無所事事。您必須返回您生產的物品數量,同步塊,這是您消耗的物品數量 - 即使您是水槽,零輸出流!

+0

嗯,實際上我正在編寫一個接收器塊,但是當您使用gr_modtool創建接收器時,它將繼承「同步」塊。唯一的區別是輸出的io_signature對於最小和最大數字有0。所以我沒有退貨,但我仍然在消費。由於返回的默認值是noutput_items,所以我放置0,因爲我不輸出流。 – Zephyr

+0

如上所述,一個接收器應該是一個sync_blcok,它必須**返回你已經消耗的項目的數量。 –

+0

重複說明:爲了消耗水槽,您必須「生產」。 –