نقوم بترميز وفك تشفير رسالة لحضارات خارج كوكب الأرض

مرحبا هبر.



الدافع وراء هذا المقال هو ، في الواقع ، مناسبة حزينة. انهار تلسكوب راديو أريسيبو الشهير عالميا في بورتوريكو ولا يمكن إصلاحه. لسنوات عديدة كان أكبر تلسكوب لاسلكي في العالم بفتحة كاملة (قطر 304 م ، نطاق تردد يصل إلى 10 جيجاهرتز) ، بمساعدة العديد من الاكتشافات. هنا في صورة من ويكيبيديا ، ما زالت تعمل:





المصدر: en.wikipedia.org/wiki/Arecibo_Observatory



لكن النص في الواقع يتعلق بحدث آخر. في عام 1974 ، تم إرسال رسالة إلى الحضارات الفضائية من هذا التلسكوب. ماذا وكيف تم ترميزه فيه ، تفاصيل تحت الخفض.



الترميز



بادئ ذي بدء ، من المثير للاهتمام فهم كيفية نقل الرسالة. كما تعلم ، كان حجم الرسالة 1679 بت فقط (210 بايت تقريبًا) ، وتم إرسالها بتردد 2.38 جيجا هرتز بقوة 450 كيلو واط. استُخدم تعديل التردد بمعدل 10 بت / ثانية للإرسال. لم يتم اختيار الرقم 1679 بالصدفة - إنه حاصل ضرب عددين أوليين 23 و 73 ، لذلك هناك طريقة واحدة فقط لتوسيع الصورة على شكل مستطيل.



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



توليد. py
import scipy.io.wavfile as wav
import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import os


message = """0000001010101000000000000101000001010000000100100010001000100
             1011001010101010101010100100100000000000000000000000000000000
             0000011000000000000000000011010000000000000000000110100000000
             0000000000101010000000000000000001111100000000000000000000000
             0000000001100001110001100001100010000000000000110010000110100
             0110001100001101011111011111011111011111000000000000000000000
             0000010000000000000000010000000000000000000000000000100000000
             0000000001111110000000000000111110000000000000000000000011000
             0110000111000110001000000010000000001000011010000110001110011
             0101111101111101111101111100000000000000000000000000100000011
             0000000001000000000001100000000000000010000011000000000011111
             1000001100000011111000000000011000000000000010000000010000000
             0100000100000011000000010000000110000110000001000000000011000
             1000011000000000000000110011000000000000011000100001100000000
             0110000110000001000000010000001000000001000001000000011000000
             0010001000000001100000000100010000000001000000010000010000000
             1000000010000000100000000000011000000000110000000011000000000
             1000111010110000000000010000000100000000000000100000111110000
             0000000010000101110100101101100000010011100100111111101110000
             1110000011011100000000010100000111011001000000101000001111110
             0100000010100000110000001000001101100000000000000000000000000
             0000000001110000010000000000000011101010001010101010100111000
             0000001010101000000000000000010100000000000000111110000000000
             0000001111111110000000000001110000000111000000000110000000000
             0110000000110100000000010110000011001100000001100110000100010
             1000001010001000010001001000100100010000000010001010001000000
             0000001000010000100000000000010000000001000000000000001001010
             00000000001111001111101001111000"""

def fftnoise(f):
    f = np.array(f, dtype='complex')
    n_p = (len(f) - 1) // 2
    phases = np.random.rand(n_p) * 2 * np.pi
    phases = np.cos(phases) + 1j * np.sin(phases)
    f[1:n_p+1] *= phases
    f[-1:-1-n_p:-1] = np.conj(f[1:n_p+1])
    return np.fft.ifft(f).real

def band_limited_noise(min_freq, max_freq, samples, samplerate=1):
    freqs = np.abs(np.fft.fftfreq(samples, 1/samplerate))
    f = np.zeros(samples)
    idx = np.where(np.logical_and(freqs>=min_freq, freqs<=max_freq))[0]
    f[idx] = 1
    return fftnoise(f)


message = ''.join(i for i in message if i.isdigit())
print("Original message:")
print(message)
print()

# Generate message
fs = 11025
f1, f2 = 3000, 4000
t_sym = 0.1
data = np.zeros(int(fs * t_sym * len(message)))
for p in range(len(message)):
    samples = np.linspace(0, t_sym, int(fs * t_sym), endpoint=False)
    freq = f2 if message[p] == '1' else f1
    data[int(fs * t_sym)*p:int(fs * t_sym)*(p + 1)] = 10000*(0.25*np.sin(2 * np.pi * freq * samples) + band_limited_noise(50, 5000, len(samples), fs))

wav.write('arecibo.wav', fs, np.int16(data))
print("WAV file saved")
      
      





من أجل راحة الاستماع ، قمت بزيادة فصل التردد ، في الرسالة الأصلية كان 10 هرتز فقط. للأسف ، لا يسمح habr بإرفاق ملفات صوتية ؛ يمكن لمن يرغبون إما إنشاء الملف بأنفسهم أو استخدام رابط مؤقت .



بالمناسبة ، تم إرسال الرسالة عام 1974. هناك:





المصدر: en.wikipedia.org/wiki/Messier_13



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



اكتشفنا التشفير ، والآن دعنا نتخيل أننا تلقينا مثل هذه الرسالة - دعنا نرى كيف يمكن فك تشفيرها.



فك



مبدأ تعديل التردد نفسه بسيط - ترددات مختلفة تتوافق مع صفر وواحد. على الطيف ، يبدو الأمر كالتالي:







هناك طرق مختلفة لفك تشفير FSK ، كأبسط طريقة ، ما عليك سوى تصفية أحد الترددات:



fs, data = wav.read('arecibo.wav')

def butter_bandpass(lowcut, highcut, fs, order=5):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = signal.butter(order, [low, high], btype='band')
    return b, a

def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
    b, a = butter_bandpass(lowcut, highcut, fs, order=order)
    y = signal.lfilter(b, a, data)
    return y

f1, f2 = 3000, 4000
data_f2 = butter_bandpass_filter(data, f2 - 200, f2 + 200, fs, order=3)

plt.plot(data)
plt.plot(data_f2)
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.title("Signal")
plt.show()

      
      





النتيجة تناسبنا تمامًا:







بالطبع ، من المرجح أن تكون الإشارة التي مرت 22 ألف عام في الفضاء ضعيفة قليلاً ، ولكن من أجل البساطة ، سنفترض أن الفضائيين لديهم أجهزة راديو جيدة وليست صينية ...



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



لا نعرف حجم الصورة ولكننا نعرف حجم بت واحد ونعرف حجم الرسالة بأكملها. يمكنك فقط فرز جميع الخيارات الممكنة ، حيث لا يوجد الكثير منها:



ss = 1102  # Width of one symbol in samples
for iw in range(12*ss, 25*ss, ss):
    w, h = iw, 80
    image = Image.new('RGB', (w, h))

    px, py = 0, 0
    for p in range(data_f2.shape[0]):
        image.putpixel((px, py), (0, int(data_f2[p]//32), 0))
        px += 1
        if px >= w:
            px = 0
            py += 1
            if py >= h:
                break

    image = image.resize((w//10, 100*h))
    image.save("1/image-%d.png" % iw)
      
      







من أجل الوضوح ، كان لا بد من تمديد الصورة ، لأن عرض 23 بكسل وفقًا لمعايير اليوم ، بعبارة ملطفة ، ليس كافيًا. النتيجة







النهائية واضحة تمامًا: Final Cut: على







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



تم ترميز الكثير من الأشياء في الصورة (بشكل مشروط ، بالطبع) ، على سبيل المثال ، الخط العمودي بعرض 2 بكسل فوق رأس الشخص عبارة عن دوامة DNA (بعد كل شيء ، هذا واضح ، أليس كذلك؟). يمكن الاطلاع على فك تشفير الصور التوضيحية المتبقية على الرابط أعلاه على ويكيبيديا.



خاتمة



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



All Articles