Penerima SDR DVB-T2 dalam C++

Radio Defined Perisian ialah kaedah menggantikan kerja logam (yang sebenarnya baik untuk kesihatan anda) dengan sakit kepala pengaturcaraan. SDR meramalkan masa depan yang hebat dan kelebihan utama dianggap sebagai penghapusan sekatan dalam pelaksanaan protokol radio. Contohnya ialah kaedah modulasi OFDM (Orthogonal frequency-division multiplexing), yang hanya boleh dilakukan dengan kaedah SDR. Tetapi SDR juga mempunyai satu lagi peluang kejuruteraan semata-mata - keupayaan untuk mengawal dan menggambarkan isyarat pada mana-mana titik sewenang-wenangnya dengan usaha yang paling sedikit.

Salah satu standard komunikasi yang menarik ialah televisyen terestrial terrestrial DVB-T2.
Untuk apa? Sudah tentu, anda hanya boleh menghidupkan TV tanpa bangun, tetapi tiada apa-apa untuk ditonton di sana dan ini bukan lagi pendapat saya, tetapi fakta perubatan.

Serius, DVB-T2 direka dengan keupayaan yang sangat luas, termasuk:

  • aplikasi dalaman
  • modulasi daripada QPSK kepada 256QAM
  • lebar jalur dari 1,7MHz hingga 8MHz

Saya mempunyai pengalaman dalam menerima televisyen digital menggunakan prinsip SDR. Piawaian DVB-T adalah dalam projek GNURadio yang terkenal. Terdapat blok gr-dvbs2rx untuk standard DVB-T2 (semua untuk GNURadio yang sama), tetapi ia memerlukan penyegerakan isyarat awal dan ia memberi inspirasi (terima kasih khas kepada Ron Economos).

Apa yang kita ada.

Terdapat piawaian ETSI EN 302 755 yang memperincikan penghantaran, tetapi bukan penerimaan.

Isyarat disiarkan dengan kekerapan pensampelan 9,14285714285714285714 MHz, dimodulasi oleh COFDM dengan 32768 pembawa, dalam jalur 8 MHZ.

Adalah disyorkan untuk menerima isyarat sedemikian dengan dua kali ganda kekerapan pensampelan (supaya tidak kehilangan apa-apa) dan pada frekuensi perantaraan lebih lebar jalur (penerimaan superheterodyne), untuk menghilangkan offset arus terus (DC) dan "kebocoran" pengayun tempatan (LO) kepada input penerima. Peranti yang memenuhi syarat ini terlalu mahal untuk rasa ingin tahu semata-mata.

SdrPlay dengan 10Msps 10bit atau AirSpy dengan ciri yang serupa adalah jauh lebih murah. Tidak ada persoalan dua kali ganda kekerapan pensampelan di sini dan penerimaan hanya boleh dilakukan dengan penukaran terus (Sifar JIKA). Oleh itu (atas sebab kewangan) kami beralih kepada penganut SDR "tulen" dengan penukaran perkakasan minimum.

Ia adalah perlu untuk menyelesaikan dua masalah:

  1. Penyegerakan. Ketahui sisihan RF fasa tepat dan sisihan kekerapan pensampelan yang tepat.
  2. Tulis semula standard DVB-T2 ke belakang.

Tugas kedua memerlukan lebih banyak kod, tetapi boleh diselesaikan dengan ketabahan dan boleh disahkan dengan mudah menggunakan isyarat ujian.

Isyarat ujian tersedia pada pelayan BBC ftp://ftp.kw.bbc.co.uk/t2refs/ dengan arahan terperinci.

Penyelesaian kepada masalah pertama sangat bergantung pada ciri-ciri peranti SDR dan keupayaan kawalannya. Menggunakan fungsi kawalan frekuensi yang disyorkan, seperti yang mereka katakan, tidak berjaya, tetapi memberi banyak pengalaman membacanya. dokumentasi, pengaturcaraan, menonton siri TV, menyelesaikan soalan falsafah..., ringkasnya, projek itu tidak mungkin ditinggalkan.

Kepercayaan kepada "SDR tulen" semakin kuat.

Kami mengambil isyarat seperti itu, menginterpolasi hampir kepada analog dan mengeluarkan yang diskret, tetapi serupa dengan yang sebenar.

Gambar rajah blok penyegerakan:

Penerima SDR DVB-T2 dalam C++

Semua di sini adalah mengikut buku teks. Seterusnya adalah sedikit lebih rumit. Penyimpangan perlu dikira. Terdapat banyak literatur dan artikel penyelidikan yang membandingkan kelebihan dan kekurangan kaedah yang berbeza. Daripada klasik - ini ialah "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Reka Bentuk Penerima Optimum untuk Penghantaran Jalur Lebar Berasaskan OFDM - Bahagian I dan II." Tetapi saya belum bertemu seorang jurutera yang boleh dan mahu mengira, jadi pendekatan kejuruteraan digunakan. Menggunakan kaedah penyegerakan yang sama, detuning diperkenalkan ke dalam isyarat ujian. Dengan membandingkan metrik yang berbeza dengan sisihan yang diketahui (dia memperkenalkannya sendiri), yang terbaik dipilih untuk prestasi dan kemudahan pelaksanaan. Sisihan kekerapan penerimaan dikira dengan membandingkan selang pengawal dan bahagian berulangnya. Fasa frekuensi penerimaan dan kekerapan pensampelan dianggarkan daripada sisihan fasa isyarat pandu dan ini juga digunakan dalam penyamaan linear mudah bagi isyarat OFDM.

Ciri penyamaan:

Penerima SDR DVB-T2 dalam C++

Dan semua ini berfungsi dengan baik jika anda tahu bila bingkai DVB-T2 bermula. Untuk melakukan ini, simbol mukadimah P1 dihantar dalam isyarat. Kaedah untuk mengesan dan menyahkod simbol P1 diterangkan dalam Spesifikasi Teknikal ETSI TS 102 831 (terdapat juga banyak cadangan berguna untuk penerimaan).

Autokorelasi isyarat P1 (titik tertinggi pada permulaan bingkai):

Penerima SDR DVB-T2 dalam C++

Gambar pertama (hanya tinggal enam bulan lagi sehingga imej bergerak...):

Penerima SDR DVB-T2 dalam C++

Dan di sinilah kita belajar apa itu ketidakseimbangan IQ, offset DC dan kebocoran LO. Sebagai peraturan, pampasan untuk herotan ini khusus untuk penukaran langsung dilaksanakan dalam pemacu peranti SDR. Oleh itu, ia mengambil masa yang lama untuk memahami: mengetuk keluar bintang dari buruj QAM64 yang mesra ialah kerja fungsi pampasan. Saya terpaksa mematikan segala-galanya dan menulis basikal saya.

Dan kemudian gambar itu bergerak:

Penerima SDR DVB-T2 dalam C++

Modulasi QAM64 dengan putaran buruj khusus dalam standard DVB-T2:

Penerima SDR DVB-T2 dalam C++

Ringkasnya, ini adalah hasil daripada menghantar kembali daging cincang melalui pengisar daging. Piawaian ini menyediakan empat jenis pencampuran:

  • sedikit berselang
  • interleaving sel (mencampurkan sel dalam blok pengekodan)
  • interleaving masa (ia juga dalam kumpulan blok pengekodan)
  • frekuensi interleaving (percampuran frekuensi dalam simbol OFDM)

Akibatnya, kami mempunyai isyarat berikut pada input:

Penerima SDR DVB-T2 dalam C++

Semua ini adalah perjuangan untuk imuniti bunyi isyarat yang dikodkan.

Jumlah

Sekarang kita boleh melihat bukan sahaja isyarat itu sendiri dan bentuknya, tetapi juga maklumat perkhidmatan.
Terdapat dua multipleks di udara. Setiap satu mempunyai dua saluran fizikal (PLP).

Satu keanehan telah diperhatikan dalam multiplex pertama - PLP pertama dilabelkan "berbilang", yang logik, kerana terdapat lebih daripada satu dalam multiplex, dan PLP kedua dilabel "tunggal" dan ini adalah soalan.
Lebih menarik lagi ialah keanehan kedua dalam multiplex kedua - semua program berada dalam PLP pertama, tetapi dalam PLP kedua terdapat isyarat yang tidak diketahui pada kelajuan rendah. Sekurang-kurangnya pemain VLC, yang memahami kira-kira lima puluh format video dan jumlah audio yang sama, tidak mengenalinya.

Projek itu sendiri boleh didapati di sini.

Projek ini dicipta dengan matlamat untuk menentukan kemungkinan penyahkodan DVB-T2 menggunakan SdrPlay (dan kini AirSpy.), jadi ini bukan versi alfa.

PS Semasa saya menulis artikel dengan susah payah, saya berjaya menyepadukan PlutoSDR ke dalam projek.

Seseorang akan segera mengatakan bahawa hanya terdapat 6Msps untuk isyarat IQ pada output USB2.0, tetapi anda memerlukan sekurang-kurangnya 9,2Msps, tetapi ini adalah topik yang berasingan.

Sumber: www.habr.com

Tambah komen