C++ 中的 SDR DVB-T2 接收器

軟體定義無線電是一種取代金屬加工(實際上對健康有益)的程式設計方法。 SDR 預示著美好的未來,其主要優點被認為是消除了無線電協議實施中的限制。 一個例子是 OFDM(正交頻分複用)調變方法,該方法只能透過 SDR 方法實現。 但 SDR 還擁有另一個純粹的工程機會——以最少的努力在任意點控制和可視化訊號的能力。

有趣的通訊標準之一是地面電視 DVB-T2。
為了什麼? 當然,你可以簡單地打開電視而不起床,但是那裡絕對沒有什麼可看的,這不再是我的觀點,而是醫學事實。

說實話,DVB-T2 的設計具有非常廣泛的功能,包括:

  • 室內應用
  • 從 QPSK 調變到 256QAM
  • 頻寬從 1,7MHz 到 8MHz

我有使用SDR原理接收數位電視的經驗。 DVB-T 標準屬於著名的 GNURadio 計畫。 DVB-T2 標準有一個 gr-dvbs2rx 區塊(全部用於相同的 GNURadio),但它需要初步的訊號同步,並且它是鼓舞人心的(特別感謝 Ron Economos)。

我們有什麼。

ETSI EN 302 755 標準詳細說明了傳輸,但沒有詳細說明接收。

該訊號在空中播出,取樣頻率為 9,14285714285714285714 MHz,採用 COFDM 調製,具有 32768 個載波,頻帶為 8 MHZ。

建議以雙倍取樣頻率(以免丟失任何東西)和中頻更大頻寬(超外差接收)接收此類訊號,以消除直流(DC)偏移和本地振盪器的「洩漏」 (LO)到接收器輸入。 滿足這些條件的設備對於單純的好奇來說太昂貴了。

具有 10Msps 10bit 的 SdrPlay 或具有類似特性的 AirSpy 便宜得多。 這裡不存在雙倍取樣頻率的問題,並且只能透過直接轉換(零中頻)來完成接收。 因此(出於財務原因)我們轉而支援「純」SDR 的擁護者,且硬體轉換最少。

有必要解決兩個問題:

  1. 同步。 找出準確的相位精確射頻偏差和取樣頻率偏差。
  2. 向後重寫 DVB-T2 標準。

第二個任務需要更多程式碼,但可以堅持不懈地解決,並且可以使用測試訊號輕鬆驗證。

測試訊號可在 BBC 伺服器 ftp://ftp.kw.bbc.co.uk/t2refs/ 上取得,並附有詳細說明。

第一個問題的解決很大程度上取決於SDR設備的特性及其控制能力。 正如他們所說,使用建議的頻率控制功能並不成功,但閱讀這些功能卻提供了許多經驗。 文件、程式設計、看電視節目、解決哲學問題……總之,放棄這個計畫是不可能的。

對「純粹的特別提款權」的信心只會越來越強烈。

我們按原樣獲取訊號,將其插值為模擬訊號,並取出一個離散訊號,但與真實訊號相似。

同步框圖:

C++ 中的 SDR DVB-T2 接收器

這裡一切都是按照教科書的。 接下來有點複雜。 需要計算偏差。 有很多文獻和研究文章比較了不同方法的優缺點。 經典著作 - 這是「Michael Speth、Stefan Fechtel、Gunnar Fock、Heinrich Meyr,基於 OFDM 的寬頻傳輸的最佳接收器設計 - 第 I 部分和第 II 部分」。 但我還沒有遇到一個能夠並且想要計數的工程師,因此使用了工程方法。 使用相同的同步方法,將失諧引入測試訊號中。 透過將不同的指標與已知偏差進行比較(他自己介紹了它們),選擇了表現最好且易於實施的指標。 透過比較保護間隔及其重複部分來計算接收頻率偏差。 接收頻率的相位和取樣頻率是根據導頻訊號的相位偏差來估計的,這也用於 OFDM 訊號的簡單線性均衡器中。

均衡器特點:

C++ 中的 SDR DVB-T2 接收器

如果您知道 DVB-T2 幀何時開始,那麼所有這些都會很好地發揮作用。 為此,在訊號中發送前導碼符號P1。 技術規格 ETSI TS 1 102 中描述了偵測和解碼 P831 符號的方法(還有許多對接收有用的建議)。

P1訊號的自相關(幀開頭的最高點):

C++ 中的 SDR DVB-T2 接收器

第一張圖片(距活動影像僅剩六個月...):

C++ 中的 SDR DVB-T2 接收器

這就是我們了解什麼是 IQ 不平衡、DC 偏移和 LO 洩漏的地方。 通常,對直接轉換特有的這些失真的補償是在 SDR 裝置驅動程式中實現的。 因此,花了很長時間才明白:從友好的QAM64星座中剔除星星是補償函數的工作。 我不得不關掉一切並寫下我的自行車。

然後圖片動了:

C++ 中的 SDR DVB-T2 接收器

DVB-T64 標準中具有特定星座旋轉的 QAM2 調製:

C++ 中的 SDR DVB-T2 接收器

簡而言之,這是將肉末再經過絞肉機的結果。 該標準規定了四種混合類型:

  • 比特交織
  • 信元交織(在編碼區塊中混合信元)
  • 時間交織(也在編碼區塊組中)
  • 頻率交織(OFDM 符號中的頻率混合)

結果,我們在輸入處得到以下訊號:

C++ 中的 SDR DVB-T2 接收器

所有這些都是為了編碼訊號的抗噪性而進行的鬥爭。

現在我們不僅可以看到訊號本身及其形狀,還可以看到服務資訊。
有兩個多廳影院在播出。 每個都有兩個實體通道 (PLP)。

在第一個多路復用中註意到一個奇怪的地方- 第一個PLP 被標記為“多個”,這是合乎邏輯的,因為多路復用中存在多個PLP,而第二個PLP被標記為“單一”,這是一個問題。
更有趣的是第二個多路復用中的第二個奇怪之處 - 所有節目都在第一個 PLP 中,但在第二個 PLP 中存在低速的未知性質的信號。 至少 VLC 播放器無法識別它,它可以識別大約 XNUMX 種視訊格式和相同數量的音訊。

該項目本身可以在這裡找到.

創建該專案的目的是確定使用 SdrPlay(現在是 AirSpy)解碼 DVB-T2 的可能性,因此這甚至不是 alpha 版本。

PS 當我艱難地寫這篇文章時,我設法將 PlutoSDR 整合到專案中。

有人會立即說USB6輸出處的IQ訊號只有2.0Msps,但你至少需要9,2Msps,但這是一個單獨的主題。

來源: www.habr.com

添加評論