قبول وفك تشفير التلفزيون التمثيلي باستخدام SDR و Python

مرحبا يا هبر.

نواصل اليوم موضوع استقبال SDR ومعالجة الإشارات. أصبحت مهتمة بتلقي التلفزيون التمثيلي عن طريق الصدفة ، بعد سؤال من أحد القراء. ومع ذلك ، فقد تبين أن هذا ليس بهذه البساطة ، نظرًا لعدم وجود عينات إشارة عادية - في كثير من الأماكن ، تم إيقاف تشغيل التلفزيون التمثيلي بالفعل. أرسل القارئ حتى تسجيلًا باستخدام RTL-SDR ، ومع ذلك ، فإن عرض التسجيل في RTL يبلغ حوالي 2 ميغاهرتز ، في حين يبلغ عرض نطاق إشارة التلفزيون حوالي 8 ميغاهرتز ، ولم يكن هناك شيء واضح في التسجيل. ونتيجة لذلك ، تم التخلي عن الموضوع لفترة طويلة ، وأخيراً ، الآن ، في الرحلة القادمة إلى أقربائي ، أخذت معي SDRPlay ، وضبطت على ترددات القنوات التلفزيونية ، ورأيت الإشارة المطلوبة على الشاشة.

برنامج Python صغير ، ويعمل كل شيء:



بالنسبة لأولئك الذين يرغبون في التفاصيل ، واصلت تحت الخفض.

نظرية


في سنوات ما بعد الحرب القديمة ، عندما علمت المختبرات الرقمية بنقل الإشارات الرقمية فقط في المختبرات السرية ، ولكن كان الناس يرغبون بالفعل في مشاهدة التلفزيون ، كانت هناك ثلاثة معايير تناظرية متنافسة. الأول كان " NTSC الأمريكية" (لجنة نظام أنظمة التلفزيون الوطنية) ، والتي تم تطويرها منذ الأربعينيات ، وتم "شحذها" لتردد الشبكة الأمريكية البالغ 60 هرتز وكان الدقة الرأسية 486 خطًا فقط. بعد ذلك بقليل في ألمانيا ، تم تطوير معيار PAL (خط تناوب الطور) ، والذي كان أفضل قليلاً من الخط الأمريكي (دقة الخطوط 576 "الكاملة" والتركيز على تردد الشبكة الأوروبية البالغ 50 هرتز) ، وبعد ذلك بقليل ظهر SECAM الفرنسية (Séquentiel couleur à mémoire). لقد قضت على بعض أوجه القصور في PAL المتعلقة باستنساخ الألوان ، وهناك نسخة مفادها أن اعتماد معيارين كان أيضًا قرارًا سياسيًا ، بحيث لم يتمكن سكان بعض البلدان من مشاهدة برامج من بلدان أخرى (كان ذلك قبل حوالي 50 عامًا قبل الاتحاد الأوروبي الموحد وشنغن) . بطريقة أو بأخرى ، ولكن العالم كله كان منقسمًا مثل هذا:



لأن لا يزال Habr موقعًا باللغة الروسية ، ثم سننظر في المستقبل في SECAM ، على الرغم من أنه إذا أرسل شخص ما إشارة PAL ، فسيكون ذلك أيضًا مثيراً للاهتمام.

طيف SECAM ، وفقًا للمخطوطات القديمة ، هو كما يلي:



على اليسار ، عند التردد F0 ، توجد إشارة النصوع المعدلة بالسعة (L). هذه في الواقع صورة بالأبيض والأسود ، والتي لا يزال من الممكن عرضها على تلفزيون أبيض وأسود دافئ ومصباح قديم. كانت مشكلة Legacy ووجود الأجهزة القديمة بين المستخدمين موجودة بالفعل ، لذا تمت إضافة القناة الملونة بشكل منفصل ، دون فقدان التوافق مع أجهزة التلفزيون القديمة. تم إرسال قناتين ملونة بالتناوب في تشكيل التردد على ترددات 4.25 و 4.406 ميغاهرتز. وأخيرًا ، حتى في التردد العالي ، تم نقل الصوت بشكل منفصل ، وكذلك في تعديل التردد.

بالمناسبة ، مع استقبال التلفزيون في سانت بطرسبرغ هناك لحظة مضحكة. كما ذكرت وسائل الإعلام الروسية ، تم إيقاف تشغيل التلفزيون التماثلي في أكتوبر:



ومع ذلك ، فإن هذا ينطبق فقط على قنوات الدولة ؛ لا أحد يجبر القنوات التجارية على إيقاف بثها. على الأقل وقت كتابة هذا التقرير (ديسمبر 2019) ، لا يزال ما يقرب من 5-6 قنوات متاحة في "التناظرية" في وسط مدينة سانت بطرسبرغ. لكن المدة التي ستستغرقها هذه العملية غير معروفة ، لذلك يجب أن يكون أولئك الذين يريدون تسجيل عينات إشارات "للتاريخ" في عجلة من أمرهم.

أخيرًا ، حان الوقت لتشغيل حقوق السحب الخاصة ومعرفة ما لدينا في الحياة الواقعية:



قناة الصوت ليست صعبة ، يمكنك فقط تجاوزها مع "الماوس" في HDSDR ، واختيار FM مع عرض النطاق الترددي حوالي 50 كيلو هرتز والاستماع. سنبدأ فك التشفير من قناة السطوع ، سيتيح لنا ذلك الحصول على "صورة" جاهزة.

فك


كما هو موضح أعلاه ، يتم إرسال إشارات النصوع إلى AM. حتى لا تكتب وحدة فك ترميز بنفسك ، نستخدم راديو جنو - فنحن ننقل الطيف إلى تردد صفري ، ونبدأ وحدة فك ترميز AM ونحفظ النتيجة في ملف.



الآن يمكننا فتح الملف المحفوظ في بيثون:

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) 

نرى سلسلة من 4 إطارات على الشاشة.



يبلغ طول إطار 0.02 ثانية - هذا 1/50 فقط - مضاعف تردد الشبكة البالغ 50 هرتز ، والذي تعمل إشاراته على أنه "مولد مدار الساعة" (لا تنس أن الإشارة تمثيلية). لكل إطار ، يتم إرسال 320 خطًا - لدينا مسح متشابك ، وبالتالي فإن معدل الإطار النهائي هو 25 هرتز.

دعونا نرى الخطوط الفردية بمزيد من التفاصيل:



كما ترون ، تتوافق بداية كل سطر مع "ساعة" ، ثم يتوافق تأرجح الإشارة مع قيم السطوع الحالية في هذا الخط. كل شيء بسيط للغاية ، وربما بدون أي تغيير تقريبًا ، تم تطبيق مثل هذه الإشارة على أنبوب أشعة الكاثود في التلفزيون.

الباقي هو مسألة التكنولوجيا. نقوم بإنشاء صورة في الذاكرة ونسخ إطارين بها ، لأن لقد تشابك. لا يتجاوز مدى الإشارة +200 ، مما يسمح لنا بكتابة هذه القيم مباشرة كألوان RGB.

 # Output image frame_size = fs*1//50 img_x, img_y = 320, 650 img_size = (img_y, img_x, 3) img_data = np.zeros(img_size, dtype=np.uint8) img_data.fill(255) frame_num = 0 # Frame #1 pos_x, pos_y = 0, 0 for px in range(frame_num*frame_size, (frame_num+1)*frame_size): val = lum_data[px] if val < 0: val = 0 if val > 255: val = 255 img_data[pos_y][pos_x] = (0, val, 0) pos_x += 1 if lum_data[px] <= 0 and lum_data[px+1] > 0: pos_x = 0 pos_y += 2 print("Scan lines 1:", pos_y) # Frame #2 pos_x, pos_y = 0, 0 for px in range((frame_num+1)*frame_size, (frame_num+2)*frame_size): val = lum_data[px] if val < 0: val = 0 if val > 255: val = 255 img_data[pos_y+1][pos_x] = (0, val, 0) pos_x += 1 if lum_data[px] <= 0 and lum_data[px+1] > 0: pos_x = 0 pos_y += 2 img_resized = cv2.resize(img_data, dsize=(3*img_x, img_y), interpolation=cv2.INTER_CUBIC) plt.imshow(img_resized, interpolation='nearest') 

كما ترون ، أنا أستخدم نقطة الصفر لاكتشاف بداية السطر الجديد. تحولت الصورة إلى ضغط عموديًا ، في هذه الحالة ، تعتمد على تردد أخذ العينات من SDR ، وفي النهاية قمت بتغيير حجمها.

النتيجة النهائية للرسوم المتحركة المكونة من 10 إطارات (لم تعد تقبل ملف أرشيف Habr):



استنتاج


ومن المثير للاهتمام تحليل هذه المعايير ، لأن أولاً ، أنها سهلة التنفيذ ، وثانياً ، تعتبر دراستهم أيضًا جزءًا من الاهتمام التاريخي. بالطبع ، لم يكن لدي هدف لإنشاء موالف تلفزيون كامل البرامج ، لذلك يتم عرض الشفرة في شكل قابل للتشغيل إلى الحد الأدنى.

إذا كانت تقييمات المقالة إيجابية ، في الجزء الثاني سيكون من الممكن التفكير في العمل مع اللون وعرض صورة ملونة كاملة.

بالنسبة لأولئك الذين يرغبون في تجربة من تلقاء أنفسهم ، يمكن تحميل ملف IQ هنا .

جميع التجارب الناجحة.

Source: https://habr.com/ru/post/ar482014/


All Articles