Apakah ada kehidupan sebelum CD Audio? Dekoder perangkat lunak PCM

Pada artikel terakhir, kami berbicara tentang kode QR dinamis yang direkam pada kaset VHS. Epidemi PCM juga menangkap saya, jadi inilah saatnya untuk mengambil format ini.

Ambil dengan prosesor PCM

Pada tahap pertama, kami akan mencoba menerapkan dekoder perangkat lunak. Ini bukan artikel terakhir tentang topik ini, karena di lelang lelang Jepang mungkin berakhir, dan PCM harus ada di setiap rumah! Menemukan pemutar video bukanlah masalah.

Agar berfungsi, Anda memerlukan file dengan rekaman kode QR yang sama ini. Anda bisa mendapatkannya menggunakan kartu video capture. Ya, sumber sinyal, tentu saja. Anda dapat langsung menangkap output prosesor atau merekam pada tape recorder. Idealnya, bekerja segera dengan perangkat penangkap untuk memecahkan kode sinyal secara real time.

Bahasa apa pun bisa digunakan. Saya mulai dengan Python. Tapi ternyata laptop saya agak lambat, jadi saya beralih ke C ++. Ngomong-ngomong, secara independen satu sama lain (hampir) komunitas kecil kami mengembangkan 3 proyek dekoder: pada OpenCV (C ++), pada Qt (C ++) dan di LabView. Yang pertama akan dibahas. OpenCV dipilih karena kesederhanaan bekerja dengan kedua perangkat penangkapan dan video yang direkam sebelumnya. Plus, semua manipulasi dengan gambar di sana sangat dioptimalkan.

Masalah pertama yang akan Anda temui adalah data yang hilang. Bagaimanapun, mereka akan dan tidak dapat dihindari dengan cara apa pun tanpa peralatan "khusus". PCM menggunakan lebih banyak garis daripada pas di area bingkai yang terlihat. Dalam kasus wilayah NTSC, jumlah ini adalah 492 garis per frame dengan area terlihat 480. Dalam kasus PAL, semuanya jauh lebih sedih.
1. PCM NTSC 44,056 kHz, PAL 44,1 kHz.
2. VHS . ( ). , . , . , . .
Ada dua solusi untuk masalah ini. Bekerja dengan kartu penangkap dengan cara yang rumit melewati pengemudi dan mengambil data dari ADC, setelah itu mereka dapat dikonversi ke bingkai PCM penuh, atau palu pada garis yang hilang. Opsi kedua terdengar sedikit liar, tetapi format penyimpanan data memungkinkan Anda memulihkan sebagian data. Dalam kasus wilayah NTSC, ternyata memenuhi batas-batas sistem koreksi kesalahan.

Karena penggunaan saluran layanan, Anda tidak dapat mengambil kartu video dengan output komposit dan membuat prosesor PCM diputar. Besi akan mengabaikan seluruh bingkai jika tidak menemukan judul pada garis tertentu. Ada beberapa pemikiran tentang hal ini, tetapi entah bagaimana nanti.

Untuk mulai dengan, sinyal video interlaced. Setiap frame mengandung dua, terdiri dari garis ganjil dan genap. Mereka disebut bidang. Dengan bidang yang prosesor PCM bekerja. Karena itu, kita juga perlu membagi aliran asli. Tepat sebelum itu, alangkah baiknya untuk mengonversi gambar hitam-putih (skala abu-abu) menjadi biner sehingga akan lebih mudah untuk bekerja.

Pada titik ini kita menemukan tiga kesulitan yang terkait dengan fitur perangkat penangkapan video. Anda tidak dapat menggunakan ambang statis untuk binariisasi gambar. Tetapi OpenCV sendiri memecahkan masalah ini, dengan bantuan yang kami dapatkan hasil yang cukup baik dengan satu jalur ajaib.

threshold(greyFrame, fullFrame, 0, 255, THRESH_BINARY + THRESH_OTSU);

Masalah kedua adalah, tiba-tiba, warna. Prosesor PCM tidak menggunakan komponen warna dari sinyal video, tetapi kartu penangkap dapat mencoba untuk mengekstraknya dari kebisingan. Ini terutama terlihat pada EasyCAP termurah. Ini bisa sedikit merusak hasil binarisasi, jadi pertama-tama Anda perlu mengonversi gambar ke nuansa abu-abu.

cvtColor(srcFrame, greyFrame, CV_BGR2GRAY);

Selain yang di atas, EasyCAP berhasil mengacaukan bidang di beberapa tempat. Lebih tepatnya, ia melompati baris pertama, karena semua garis lainnya tidak ada. Untuk merekam pertunjukan siang dari TK, ini tidak terlalu penting, tetapi di sini sudah menjadi masalah. Mengatur garis dalam urutan yang benar cukup mudah. Di akhir setiap frame ada area tanpa data. Jika kita memindahkan garis yang berisi sinyal bermanfaat ke stop, maka bidang dijamin akan kembali ke tempat mereka. Ketika belajar, saya mencoba menggunakan tiga perangkat penangkap dari rentang harga yang berbeda, tetapi yang paling bermanfaat pada akhirnya ternyata yang termurah, karena mengungkapkan sejumlah masalah.

Pengambilan EasyCAP dari kaset video

Bintik-bintik warna dan tingkat kecerahan bit data yang lebih tinggi dapat diamati dalam gambar jika dibandingkan dengan ilustrasi pertama dari artikel yang ditangkap pada Magewell Pro Capture AIO.

Sudah waktunya untuk mengingat apa sinyal disimpan. Perekam kaset VHS tidak berbeda dalam kualitas khusus, karena ini adalah format rumah tangga. Pulsa sinkronisasi frame dan garis saja tidak cukup untuk operasi yang stabil. Oleh karena itu, tanda sinkronisasi tambahan ditambahkan ke sinyal video. Di setiap baris di awal ada urutan bolak-balik dua "piksel" putih dan dua hitam, dan di ujung garis ada area kecil dengan kecerahan maksimum, yang menyesuaikan AGC. Bit data sendiri memiliki kecerahan 60% dari maksimum untuk 1 dan kurang dari 20% untuk 0. Berikut adalah contoh mengapa label ini diperlukan: inversi gambar dari kaset di awal dan akhir frame.

Liku di awal bingkai

Menurut tanda sinkronisasi, di setiap baris ada area data. Selanjutnya, Anda perlu menentukan lebar bit (hanya 128 bit per baris) dan mengecilkan garis gambar menjadi 16 byte.

Mari kita lihat lebih dekat format data. Baris ini terdiri dari 8 blok 14 bit yang masing-masing berisi nilai untuk output ke DAC (sampel) dan kode koreksi kesalahan, dan satu blok dengan checksum (CRC-16 / CCITT-FALSE). Dengan checksum, garis yang dijatuhkan ditentukan, data di mana perangkat akan mencoba untuk pulih. Setiap baris berisi tiga sampel untuk saluran kiri dan kanan, blok paritas P (xor dari semua sampel) dan Q misterius. Urutannya adalah sebagai berikut: L0, R0, L1, R1, L1, L2, R2, P, Q. Hari ini, koreksi Q tidak dimungkinkan kami akan, karena materi ini belum sepenuhnya dipahami dan implementasi membutuhkan debugging.

Urutan Data dalam Baris

Jika Anda menggunakan "apa adanya", maka garis putus-putus berarti hilangnya tiga sampel sekaligus, yang akan terlihat oleh telinga pada cincin logam. Tapi dida lebih pintar dan memutuskan untuk merekam data dengan tangga. Hanya satu blok yang diambil dari satu baris. Selanjutnya diambil dengan sedikit offset. Langkah tangga membutuhkan 16 garis. Blok L0 diambil dari 1 baris. Blok R0 dengan baris 17 ... Dengan demikian, menggunakan blok paritas, Anda dapat memulihkan data dari 16 baris yang hilang dalam satu baris. Tetapi hanya jika ada satu kesalahan di dalam tangga. Blok Q memungkinkan Anda untuk memperbaiki dua kesalahan, yang mengembalikan hingga 32 baris yang hilang.

gambar

Pertimbangkan contoh sederhana. Ada fragmen bingkai PCM di mana beberapa baris rusak (disorot dengan warna merah). 4 tangga pertama diproses secara normal. Kelima akan menangkap garis putus-putus. Blok Q hilang terlebih dahulu, tetapi karena berfungsi untuk memperbaiki kesalahan, dan sampel itu sendiri tidak rusak, Anda bisa melangkah lebih jauh. Dengan tangga keenam, kami melakukan hal yang sama. Kemudian lagi ada tangga yang tidak rusak hingga 21. Blok P menderita di dalamnya. Ini juga berfungsi untuk mengembalikan data. Anda bisa melewati. Jadi kami pergi ke 37 tangga, di mana sampel saluran yang tepat akan rusak. Untuk mengembalikannya, Anda perlu melakukan XOR untuk blok paritas dan semua sampel lainnya:

R2=L0R0L1R1L2P


Hasilnya, kami mendapatkan nilai awal. Jika ada dua kesalahan, upaya dilakukan untuk memulihkan dengan menggunakan blok Q. Jika ada lebih dari itu, maka tidak ada yang harus dilakukan dengan ini kecuali untuk menginterpolasi nilai sampel yang dipukuli atau meresetnya.

Proses melewati lapangan dapat diamati pada animasi GIF kecil.

gambar

Dan jadi kami pergi sampai langkah terakhir tangga bersandar pada ujung lapangan. Hardware PCM memiliki buffer melingkar. Segera setelah baris diproses, dapat diisi dengan data baru. Dengan demikian, langkah terakhir melompat tanpa mengganggu pemutaran.

Saya memilih prinsip kerja yang sedikit berbeda. Sekarang tidak ada lagi batas memori seperti itu, sehingga buffer memiliki ukuran yang sedikit lebih besar: ketinggian lapangan ditambah ketinggian tangga. Begitu tangga mencapai ujung buffer, 111 baris terakhir ditransfer ke awal, dan mengisi dengan data baru sudah dari 112 baris. Tentu saja, kita tidak boleh lupa bahwa ketika bekerja dengan kartu penangkap, kita kehilangan beberapa garis. Karena itu, pastikan untuk mengisi garis yang hilang dengan nol untuk menandai mereka untuk pemulihan lebih lanjut oleh kesalahan CRC.

PCM awalnya 14-bit. Namun seiring waktu, ketika perekam video VHS meningkatkan kualitas gambar, pabrikan beralih ke 16 bit, tanpa melupakan kompatibilitas ke belakang.
3. 14- PCM 12 . ( ).
Dalam PCM 16-bit, tidak ada blok Q sama sekali, jadi ada tanda khusus di kolom judul "koreksi Q tidak mungkin". Sebagai gantinya, 2 potongan sampel yang hilang dan P. dikumpulkan. Dalam hal ini, ketinggian tangga bukanlah 8 langkah, tetapi hanya 7, karena bit yang hilang dari blok disimpan pada jalurnya sendiri, dan tidak secara terpisah. Memahami bagaimana PCM 16-bit bekerja cukup sederhana menggunakan contoh menangkap berliku-liku dengan frekuensi 100 Hz dan amplitudo maksimum. Semuanya segera jatuh ke tempatnya.

Perbandingan PCM 14-bit dan 16-bit

Sekarang saatnya menyimpan hasil dalam file wav. Perpustakaan libsndfile akan membantu dalam hal ini. Meskipun ... PCM tidak menyimpan file, tetapi segera memutarnya. Di sini Anda dapat mengingat tentang hal yang sangat keren, seperti pipa. Ketika output dari satu program dimasukkan ke yang lain. Kami cukup menentukan stdout sebagai tujuan dan mengarahkan aliran ke program ffplay.

./ggg -i easycap.avi -o - | ffplay -

Sekarang Anda dapat menikmati tetesan dan terus men-debug kode untuk menyingkirkannya ...

Itu saja untuk hari ini. Anda dapat mengunduh sumber dekoder dari halaman di GitHub: https://github.com/walhi/pcm . Ada juga generator. Suatu hari saya akan mendesainnya sebagai plugin untuk foobar ...

Pekerjaan aktif sedang berlangsung untuk menyelesaikan pemulihan pada blok Q, jadi untuk pekerjaan yang kurang lebih benar, Anda harus melompati komitmen. Tapi ini sepele. Mereka yang ingin bermain dapat mengunduh contoh tangkapan.

All Articles