Penerima SDR DVB-T2 dalam C++

Software Defined Radio adalah metode menggantikan pekerjaan logam (yang sebenarnya baik untuk kesehatan Anda) dengan pemrograman yang memusingkan. SDR memprediksi masa depan yang cerah dan keuntungan utamanya adalah penghapusan pembatasan dalam penerapan protokol radio. Contohnya adalah metode modulasi OFDM (Ortogonal pembagian frekuensi multiplexing), yang hanya dimungkinkan dengan metode SDR. Namun SDR juga memiliki satu lagi peluang rekayasa murni - kemampuan untuk mengontrol dan memvisualisasikan sinyal pada titik mana pun dengan sedikit usaha.

Salah satu standar komunikasi yang menarik adalah televisi terestrial terestrial DVB-T2.
Untuk apa? Tentu saja, Anda cukup menyalakan TV tanpa bangun, tetapi sama sekali tidak ada yang bisa ditonton di sana dan ini bukan lagi pendapat saya, melainkan fakta medis.

Serius, DVB-T2 dirancang dengan kemampuan yang sangat luas, antara lain:

  • aplikasi dalam ruangan
  • modulasi dari QPSK ke 256QAM
  • bandwidth dari 1,7MHz hingga 8MHz

Saya memiliki pengalaman menerima televisi digital dengan prinsip SDR. Standar DVB-T ada dalam proyek GNURadio yang terkenal. Ada blok gr-dvbs2rx untuk standar DVB-T2 (semuanya untuk GNURadio yang sama), tetapi memerlukan sinkronisasi sinyal awal dan ini menginspirasi (terima kasih khusus kepada Ron Economos).

Apa yang kita miliki.

Ada standar ETSI EN 302 755 yang merinci transmisi, tetapi tidak merinci penerimaan.

Sinyal mengudara dengan frekuensi sampling 9,14285714285714285714 MHz, dimodulasi oleh COFDM dengan 32768 operator, dalam pita 8 MHZ.

Disarankan untuk menerima sinyal seperti itu dengan frekuensi sampling dua kali lipat (agar tidak kehilangan apa pun) dan pada frekuensi menengah lebih banyak bandwidth (penerimaan superheterodyne), untuk menghilangkan offset arus searah (DC) dan “kebocoran” osilator lokal (LO) ke masukan penerima. Perangkat yang memenuhi persyaratan ini terlalu mahal untuk sekadar rasa ingin tahu.

SdrPlay dengan 10Msps 10bit atau AirSpy dengan karakteristik serupa jauh lebih murah. Tidak ada pertanyaan tentang menggandakan frekuensi pengambilan sampel di sini dan penerimaan hanya dapat dilakukan dengan konversi langsung (Zero IF). Oleh karena itu (karena alasan keuangan) kami beralih ke pihak penganut SDR “murni” dengan konversi perangkat keras yang minimal.

Ada dua masalah yang perlu diselesaikan:

  1. Sinkronisasi. Cari tahu deviasi RF akurat fase dan deviasi frekuensi pengambilan sampel.
  2. Tulis ulang standar DVB-T2 ke belakang.

Tugas kedua memerlukan lebih banyak kode, tetapi dapat diselesaikan dengan ketekunan dan dapat dengan mudah diverifikasi menggunakan sinyal pengujian.

Sinyal uji tersedia di server BBC ftp://ftp.kw.bbc.co.uk/t2refs/ dengan instruksi rinci.

Pemecahan masalah pertama sangat bergantung pada karakteristik perangkat SDR dan kemampuan kontrolnya. Menggunakan fungsi kontrol frekuensi yang direkomendasikan, seperti yang mereka katakan, tidak berhasil, tetapi memberikan banyak pengalaman dalam membacanya. dokumentasi, pemrograman, menonton serial TV, menyelesaikan pertanyaan filosofis..., singkatnya, tidak mungkin untuk meninggalkan proyek tersebut.

Keyakinan terhadap “SDR murni” semakin kuat.

Kami mengambil sinyal apa adanya, menginterpolasinya hampir ke analog dan mengeluarkan sinyal diskrit, tetapi mirip dengan yang asli.

Diagram blok sinkronisasi:

Penerima SDR DVB-T2 dalam C++

Semuanya di sini sesuai dengan buku teks. Berikutnya sedikit lebih rumit. Penyimpangan perlu dihitung. Ada banyak literatur dan artikel penelitian yang membandingkan kelebihan dan kekurangan berbagai metode. Dari yang klasik - ini adalah “Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Desain Penerima Optimum untuk Transmisi Broadband Berbasis OFDM – Bagian I dan II.” Tapi saya belum pernah bertemu satu pun insinyur yang bisa dan mau berhitung, jadi pendekatan teknik yang digunakan. Dengan menggunakan metode sinkronisasi yang sama, detuning dimasukkan ke dalam sinyal uji. Dengan membandingkan metrik yang berbeda dengan penyimpangan yang diketahui (dia memperkenalkannya sendiri), metrik terbaik dipilih berdasarkan kinerja dan kemudahan penerapan. Deviasi frekuensi penerimaan dihitung dengan membandingkan interval penjaga dan bagian berulangnya. Fase frekuensi penerimaan dan frekuensi sampling diperkirakan dari deviasi fase sinyal pilot dan ini juga digunakan dalam equalizer linier sederhana dari sinyal OFDM.

Karakteristik equalizer:

Penerima SDR DVB-T2 dalam C++

Dan semua ini berfungsi dengan baik jika Anda mengetahui kapan frame DVB-T2 dimulai. Untuk melakukan ini, simbol pembukaan P1 ditransmisikan dalam sinyal. Metode untuk mendeteksi dan mendekode simbol P1 dijelaskan dalam Spesifikasi Teknis ETSI TS 102 831 (ada juga banyak rekomendasi berguna untuk penerimaan).

Autokorelasi sinyal P1 (titik tertinggi di awal frame):

Penerima SDR DVB-T2 dalam C++

Gambar pertama (hanya tersisa enam bulan hingga gambar bergerak...):

Penerima SDR DVB-T2 dalam C++

Dan di sinilah kita mempelajari apa itu ketidakseimbangan IQ, DC offset, dan kebocoran LO. Sebagai aturan, kompensasi untuk distorsi khusus untuk konversi langsung ini diterapkan di driver perangkat SDR. Oleh karena itu, butuh waktu lama untuk memahami: melumpuhkan bintang-bintang dari konstelasi QAM64 yang bersahabat adalah pekerjaan fungsi kompensasi. Saya harus mematikan semuanya dan menulis sepeda saya.

Dan kemudian gambarnya berpindah:

Penerima SDR DVB-T2 dalam C++

Modulasi QAM64 dengan rotasi konstelasi tertentu dalam standar DVB-T2:

Penerima SDR DVB-T2 dalam C++

Singkatnya, ini adalah hasil memasukkan kembali daging cincang melalui penggiling daging. Standar ini menyediakan empat jenis pencampuran:

  • sedikit interleaving
  • interleaving sel (mencampur sel dalam blok pengkodean)
  • interleaving waktu (juga dalam kelompok blok pengkodean)
  • interleaving frekuensi (pencampuran frekuensi dalam simbol OFDM)

Hasilnya, kami memiliki sinyal berikut pada input:

Penerima SDR DVB-T2 dalam C++

Semua ini merupakan perjuangan untuk kekebalan kebisingan dari sinyal yang dikodekan.

Total

Sekarang kita tidak hanya dapat melihat sinyal itu sendiri dan bentuknya, tetapi juga informasi layanan.
Ada dua multipleks yang mengudara. Masing-masing memiliki dua saluran fisik (PLP).

Satu keanehan terlihat pada multipleks pertama - PLP pertama diberi label "multiple", yang logis, karena ada lebih dari satu di multipleks, dan PLP kedua diberi label "tunggal" dan ini adalah sebuah pertanyaan.
Yang lebih menarik lagi adalah keanehan kedua pada multipleks kedua - semua program ada di PLP pertama, namun di PLP kedua terdapat sinyal yang sifatnya tidak diketahui dengan kecepatan rendah. Setidaknya pemutar VLC, yang memahami sekitar lima puluh format video dan jumlah audio yang sama, tidak mengenalinya.

Proyek itu sendiri dapat ditemukan di sini.

Proyek ini dibuat dengan tujuan untuk menentukan kemungkinan decoding DVB-T2 menggunakan SdrPlay (dan sekarang AirSpy.), jadi ini bahkan bukan versi alpha.

PS Saat saya menulis artikel dengan susah payah, saya berhasil mengintegrasikan PlutoSDR ke dalam proyek.

Seseorang akan langsung mengatakan bahwa hanya ada 6Msps untuk sinyal IQ pada output USB2.0, tetapi Anda memerlukan setidaknya 9,2Msps, tetapi ini adalah topik yang terpisah.

Sumber: www.habr.com

Tambah komentar