[Перевод] Декодирование сигнала с видеофона 1988 года выпуска

В наши дни можно легко связаться по видеосвязи практически с любой точкой мира. Но потребовалось много времени, чтобы технология достигла такого уровня. Я покажу, какие решения использовали инженеры в 1988 году, чтобы вы могли не только говорить, но и видеть своего друга или партнера во время разговора.

Однажды я увидел на YouTube обзор Sony PCT-15 — это устройство, сделанное в Японии, подключалось к обычной телефонной линии и позволяло не только разговаривать с собеседником, но также отправлять и получать изображения во время разговора. В то время высокоскоростная связь была доступна только для учреждений, военных и правительства, поэтому телефонная линия была единственным возможным способом связи с миром:

Источник ​ Popular Photography 1988Источник ​ Popular Photography 1988

Как это работает? Давайте разберемся.

Декодирование

Видеообзор был опубликован на YouTube-канале Techmoan, который специализируется на ретро-устройствах. Но примечательным для меня был тот факт, что передача данных была слышна на видео. Я просто сохранил сигнал в WAV и решил проанализировать его с помощью Python.

Давайте сначала проверим форму сигнала:

import scipy.io.wavfile as wav
import scipy.signal as signal
import matplotlib.pyplot as plt
import numpy as np

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

plt.rcParams["figure.figsize"] = (20,6)

time = np.linspace(0, len(data) / fs, num=len(data))
plt.plot(time, data)
plt.xlabel("Time, sec")
plt.ylabel("Amplitude")
plt.title("Signal")
plt.show()

Сигнал в начале, вероятно, используется в качестве триггера для начала приема. На волновой форме мы также можем видеть серию «пиков»:

ffe858aca8e05029d91cd64715c44a3c.png

Проверим сигнал в частотной области:

plt.specgram(data, NFFT=1024, Fs=fs)
plt.title("Spectrum")
plt.xlabel("Time, sec")
plt.ylabel("Frequency")
plt.show()

Примечательно, что все данные передаются в полосе частот 1–3 КГц, которая была оптимальной для аналоговой телефонной линии:

a9dd030c1b1e99a69aa97e7990f7031b.png

Теперь вернемся к осциллограмме сигнала. Я могу предположить, что каждый «пик» представляет одну строку изображения, а данные передаются в аналоговой форме:

d1a2916e5870a37b0e33feea54e69f74.png

Это был стандартный подход для аналогового телевидения в 80-х годах. Давайте увеличим один «пик». Очевидно, что это амплитудная модуляция. Я предполагаю, что она кодирует яркость, и это легко проверить. Сначала применим к данным преобразование Гильберта:

def hilbert(data):
    analytical_signal = signal.hilbert(data)
    amplitude_envelope = np.abs(analytical_signal)
    return amplitude_envelope
data_am = hilbert(data)
plt.plot(time, data_am)

После преобразования мы получаем огибающую сигнала (желтая линия):

95ac4fbf7d535111d7e159f1eb6623af.png

Как я уже писал, сигнал, вероятно, кодируется яркостью — из спецификации устройства мы знаем, что Sony PCT-15 имеет монохромный экран, и одного канала яркости должно быть достаточно. Легко поместить одномерные данные на двухмерное изображение и посмотреть результат.

frame_width = 1211
w, h = frame_width, data_am.shape[0]//frame_width
image = Image.new('RGB', (w, h))
px, py = 0, 0
for p in range(data_am.shape[0] - 1):
    lum = int(data_am[p]//128)
    if lum < 0: lum = 0
    if lum > 255: lum = 255
    image.putpixel((px, py), (lum, lum, lum))
    px += 1
    if px >= w:
        px = 0
        py += 1
        if py >= h:
            break

image = image.resize((w//2, 4*h))
plt.imshow(image)

plt.show()

После выполнения кода мы можем увидеть закономерность:

90462c29cb021742e97618883d14bfe2.png

Мне неясно, как работает синхронизация строк в реальном устройстве, я могу предположить, что PCT-15 использует заголовок данных для начала приема изображения. Формат заголовка мне неизвестен, поэтому я просто подправил параметр frame_width вручную в исходном коде.

И наконец, мы можем получить изображение:

f266e06a88d184953af4ff7f37f70aaf.png

Цифры 0…250 на изображении являются «виртуальными», они зависят только от частоты дискретизации записанного аудиофайла. Как мы знаем из спецификации, реальное разрешение изображения составляет всего 96×100, но устройство также может передавать изображения в режиме «высокого разрешения» 160×100. Я просил Techmoan в комментариях к видео поделиться образцом WAV «высокого разрешения», но владелец канала с количеством зрителей >1М не считает нужным отвечать на вопросы подписчиков, поэтому это единственный образец, который у меня есть. В любом случае, этого достаточно, чтобы оценить качество изображения.

Заключение

Было интересно проанализировать данные и посмотреть, что было «передовой» технологией в конце 80-х годов. Тогда не было ни Skype, ни WhatsApp, а скорость модемной линии составляла около 2400–14400 бит (не мегабит:) в секунду, что было явно недостаточно для «нормального» видеозвонка. А таких устройств, как «веб-камеры», вообще не было, их просто еще не изобрели. Поэтому инженеры Sony решили использовать для передачи и приема изображения аналоговую телевизионную передачу с низкой скоростью. Как мы видим, время передачи составляет около 6–10 секунд на изображение, что, очевидно, достаточно только для неподвижных изображений, но это было лучше, чем ничего — особенно для людей, живущих в разных странах или городах, это могло быть единственным способом видеть друг друга в «почти» реальном времени.

Я не знаю, были ли продажи Sony PCT-15 успешными в 80-х годах. Первая веб-камера была представлена позже, в 1994 году, так что вполне возможно, существовал маркетинговый спрос со стороны людей, которые хотели видеть друг друга в то время, когда цифровые и веб-камеры еще не были доступны. С другой стороны, черно-белое изображение с разрешением 160×100, которое передается примерно за 10 с, звучит не очень здорово даже для 80-х годов. В любом случае, совершая видеозвонок со смартфона на отдыхе, приятно вспомнить, как зарождалась эта технология, и проникнуться уважением к инженерам и ученым, которые сделали ее простой и возможной.

Как мы видим из статьи, для декодирования «передовой» технологии конца 80-х годов, использовался современный язык программирования Python. В OTUS вы можете изучить не только Python, но и другие популярные языки программирования, а также пройти курсы по инфраструктуре, тестированию, базам данных, управлению, информационной безопасности и еще ряду направлений. Прямо сейчас на нашем сайте действуют летние скидки, поэтому приглашаем вас ознакомиться с предложением по ссылке ниже.

https://otus.pw/3tkp/https://otus.pw/3tkp/

ПОСМОТРЕТЬ СПЕЦИАЛЬНОЕ ПРЕДЛОЖЕНИЕ

© Habrahabr.ru