Hai, Habr.
Hari ini kami melanjutkan topik penerimaan SDR dan pemrosesan sinyal. Saya menjadi tertarik pada penerimaan TV analog secara tidak sengaja, setelah pertanyaan dari salah satu pembaca. Namun, ini ternyata tidak begitu sederhana, karena kurangnya sampel sinyal dangkal - di banyak tempat TV analog telah dimatikan. Pembaca bahkan mengirim rekaman dengan RTL-SDR, namun, lebar rekaman di RTL sekitar 2 MHz, sedangkan bandwidth sinyal TV sekitar 8 MHz, dan tidak ada yang jelas pada rekaman. Akibatnya, topik itu lama sekali ditinggalkan, dan akhirnya, baru saja, pada perjalanan berikutnya ke kerabat saya, saya membawa SDRPlay, dan mendengarkan frekuensi saluran TV, saya melihat sinyal yang diinginkan di layar.
Program Python kecil, dan semuanya berfungsi:

Bagi yang tertarik dengan detail, lanjutkan di bawah cut.
Teori
Pada tahun-tahun pasca-perang, ketika laboratorium digital tahu tentang transmisi sinyal digital hanya di laboratorium rahasia, tetapi orang-orang sudah ingin menonton TV, ada tiga standar analog yang bersaing. Yang pertama adalah
NTSC Amerika (Komite Sistem Sistem Televisi Nasional), yang telah dikembangkan sejak tahun 40-an, "dipertajam" untuk frekuensi jaringan Amerika 60Hz dan memiliki resolusi vertikal hanya 486 baris. Beberapa saat kemudian di Jerman, standar
PAL (Phase Alternating Line) mulai dikembangkan, yang sedikit lebih baik daripada yang Amerika (resolusi "keseluruhan" 576 baris dan fokus pada frekuensi jaringan 50Hz Eropa), dan sedikit kemudian
SECAM Perancis (Séquentiel couleur à mémoire) muncul. Ini menghilangkan beberapa kekurangan PAL yang terkait dengan reproduksi warna, dan ada versi yang mengadopsi dua standar juga merupakan keputusan politik, sehingga penduduk di beberapa negara tidak dapat menonton program dari negara lain (sekitar 50 tahun sebelum Uni Eropa dan Schengen bersatu) . Satu atau lain cara, tetapi seluruh dunia terbagi seperti ini:

Karena Habr masih merupakan situs berbahasa Rusia, maka di masa depan kami akan mempertimbangkan SECAM, meskipun jika seseorang mengirim sampel sinyal PAL, itu juga akan menarik.
Spektrum SECAM,
menurut gulungan lama , adalah sebagai berikut:

Di sebelah kiri, pada frekuensi F0, adalah sinyal amplitudo termodulasi (L). Ini sebenarnya adalah gambar hitam dan putih, yang masih dapat ditampilkan pada TV hitam putih
hangat dan lampu . Masalah Legacy dan keberadaan perangkat lama di kalangan pengguna sudah ada saat itu, sehingga saluran warna ditambahkan secara terpisah, tanpa kehilangan kompatibilitas dengan perangkat televisi lama. Dua saluran warna dikirim secara bergantian dalam modulasi frekuensi pada frekuensi 4,25 dan 4,406 MHz. Dan akhirnya, frekuensi yang lebih tinggi, suara dipancarkan secara terpisah, juga dalam modulasi frekuensi.
Omong-omong, dengan penerimaan TV di St. Petersburg ada momen lucu. Seperti yang dilaporkan media Rusia, TV analog dimatikan pada bulan Oktober:

Namun, ini hanya berlaku untuk
saluran negara , tidak ada yang memaksa
saluran komersial
untuk mematikan siaran mereka. Setidaknya pada saat penulisan (Desember 2019), sekitar 5-6 saluran masih tersedia di "analog" tepat di pusat St. Petersburg. Tapi berapa lama itu tidak akan diketahui, jadi mereka yang ingin merekam sampel sinyal "untuk sejarah" harus tetap terburu-buru.
Akhirnya, saatnya menghidupkan SDR dan melihat apa yang kita miliki dalam kehidupan nyata:

Saluran audio tidak sulit, Anda bisa mengarahkannya dengan "mouse" di HDSDR, pilih FM dengan bandwidth sekitar 50KHz dan dengarkan. Kami akan mulai decoding dari saluran kecerahan, ini akan memungkinkan kami untuk mendapatkan "gambar" yang sudah jadi.
Decoding
Seperti dijelaskan di atas, sinyal pencahayaan ditransmisikan ke AM. Agar Anda tidak dapat menulis dekoder sendiri, kami menggunakan GNU Radio - kami mentransfer spektrum ke frekuensi nol, memulai dekoder AM dan menyimpan hasilnya ke file.

Sekarang kita dapat membuka file yang disimpan dengan Python:
import numpy as np import matplotlib.pyplot as plt lum_data = np.fromfile("pal_lum.raw", dtype='int32') lum_data = -lum_data - 4700 fs = 9000000//2 x_time = np.linspace(0, len(lum_data)/fs, num=len(lum_data)) plt.plot(x_time, lum_data)
Kami melihat urutan 4 frame di layar.

Panjang satu frame 0,02s - ini hanya 1/50 - adalah kelipatan dari frekuensi jaringan 50Hz, yang sinyalnya berfungsi sebagai "clock generator" (jangan lupa bahwa sinyalnya analog). Untuk setiap frame, 320 baris ditransmisikan - kami memiliki pemindaian interlaced, sehingga frame rate akhir adalah 25 Hz.
Mari kita lihat masing-masing baris secara lebih rinci:

Seperti yang Anda lihat, awal setiap baris berhubungan dengan "jam", kemudian ayunan sinyal sesuai dengan nilai kecerahan saat ini di baris ini. Semuanya cukup sederhana, dan mungkin dengan hampir tidak ada perubahan, sinyal seperti itu diterapkan pada tabung sinar katoda TV.
Sisanya adalah masalah teknologi. Kami membuat gambar di memori dan menyalin dua frame ke dalamnya, karena kami telah interlaced. Rentang sinyal tidak melebihi +200, yang memungkinkan kita untuk menulis nilai-nilai ini secara langsung sebagai warna RGB.
Seperti yang Anda lihat, saya menggunakan zero crossing untuk mendeteksi awal baris baru. Gambar ternyata dikompresi secara vertikal, dalam hal ini tergantung pada frekuensi pengambilan sampel SDR, pada akhirnya saya hanya mengubah ukuran lebar.
Hasil akhir pada animasi 10 frame (tidak lagi menerima arsip file Habr):

Kesimpulan
Sangat menarik untuk menganalisis standar tersebut, karena pertama, mereka cukup sederhana untuk diterapkan, dan kedua, studi mereka juga merupakan bagian dari kepentingan sejarah. Tentu saja, saya tidak memiliki tujuan untuk membuat TV tuner perangkat lunak lengkap, sehingga kode ditampilkan dalam bentuk yang dapat dioperasikan secara minimal.
Jika peringkat artikelnya positif, di bagian kedua akan dimungkinkan untuk mempertimbangkan bekerja dengan warna dan menampilkan gambar warna yang lengkap.
Bagi mereka yang ingin bereksperimen sendiri, file IQ dapat diunduh di
sini .
Semua percobaan berhasil.