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

Как это работает? Давайте разберемся.
Декодирование
Видеообзор был опубликован на 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()
Сигнал в начале, вероятно, используется в качестве триггера для начала приема. На волновой форме мы также можем видеть серию «пиков»:

Проверим сигнал в частотной области:
plt.specgram(data, NFFT=1024, Fs=fs) plt.title("Spectrum") plt.xlabel("Time, sec") plt.ylabel("Frequency") plt.show()
Примечательно, что все данные передаются в полосе частот 1-3 КГц, которая была оптимальной для аналоговой телефонной линии:

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

Это был стандартный подход для аналогового телевидения в 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)
После преобразования мы получаем огибающую сигнала (желтая линия):

Как я уже писал, сигнал, вероятно, кодируется яркостью — из спецификации устройства мы знаем, что 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()
После выполнения кода мы можем увидеть закономерность:

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

Цифры 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://habr.com/ru/company/otus/blog/564076/
Добавить комментарий