본문 바로가기

통신이론

SSTV 디코딩 실습(feat. Robot8, 24, 36)

새해 두번째 블로그 주제는 SSTV 디코딩 실습으로 정했습니다. 마치 암호해독 놀이하듯, 여러분도 이 실습 과정을 호기심으로 같이 즐기시면 좋을 것 같아요! 저도 호기심과 재미를 좇아 끝까지 해봤습니다.^^;

실용적이고 재미 위주의 SDR 취미활동 소재를 계속해서 소개하려고 계획은 잡았는데, 일단 공부하고 나름 소화해서 글을 쓰려니 시간이 오래 걸리고 힘도 부치네요. 신선하고 양질의 컨텐츠를 여러분들에게 제공한다는 보람과 즐거움으로,,, 느리더라도 묵묵히 이어 가 보겠습니다. 많은 응원 부탁드려용! 꾸벅!

전파의 파형에 이미지정보를 어떻게 싣고, 또 어떻게 디코딩하는 지 궁금하지 않으신가요? 이번 글은 이 궁금증을 해결하고 즐길거리를 제공하는 것이 목표입니다.  이 기술은 아날로그TV의 원형이 되었고 이어져 현재  FHD, UHD 까지 점진적 발전되었습니다. 그만큼 중요하고 기본이라는 이야기죠!

 

가장 인기 있는 협대역 영상 전송 모드는 SSTV(Slow-Scan TeleVision)입니다. 클래식 TV와 달리 해상도가 낮은 정적 이미지만 방송할 수 있습니다. SSTV 영상은 오디오 신호로 변환되며, 이 신호는 단파 대역의 통신 송수신기를 통해 음성 채널을 통해 전송될 수 있습니다. 단파 영상 전송의 또 다른 옵션은 라디오팩스로, 현재 일반적으로 사무실 팩스로 알려진 것의 전신입니다. 라디오팩스는 주로 기상 관측소에서 종관지도와 위성 이미지 방송에 사용됩니다.

Robot 36 Color 모드는 우주 통신에서 사용됩니다.

SSTV 방송은 일반적으로 햄 라디오 송수신기를 사용하여 단측파(SSB) 진폭 변조로 수행됩니다. 2,500Hz 이상의 주파수는 강하게 억제되고 SSTV 신호의 최대 레벨인 흰색 주파수는 2,300Hz 입니다.

 

오디오 신호로 정보 전송하니,,, 갑자기 오싹하고 충격적이었던 '터미네이터3'의 이 장면이 연상되었습니다. 

모든 설명자료는 참고1의 handbook에서 발췌했고, 실습자료는 참고2의 mp3파일을 wav파일로 변환해서 작업했습니다.

1. Robot 8_Black and White

수직 동기화는 전송 시작을 감지하는 데 사용됩니다. 
모든 최신 SSTV 시스템은 VIS를 채택하여 자동 SSTV 모드 인식을 위해 더 긴 동기 신호와 디지털 헤더를 사용합니다. 
VIS에는 디지털 코드가 포함되어 있으며, 처음과 마지막 비트는 1200Hz 주파수를 가진 시작 비트와 정지 비트입니다. 나머지 8비트는 모드 식별을 제공하며 하나의 패리티 비트를 포함합니다. 각 비트는 최하위 비트부터 순서대로 전송됩니다.

Vertical synchronization : VIS (Vertical Interval Signaling) code 값 42

흑백(BW) 단색 이미지 방송의 경우, 하나의 신호만 필요합니다. 이는 각 이미지 요소의 밝기/휘도 Y를 나타냅니다. 주파수는 1,500Hz(검은색)에서 2,300Hz(흰색)까지 변하며 이미지 정보를 전송합니다. 이 범위의 각 주파수는 특정 밝기, 즉 128 단계의 회색 수준으로 나타냅니다.

1 scan line of BW image

 

그럼 실습예제 첨부할게요.

R8.wav
1.78MB

 

실제로 위 8초 길이 음성파형(wav파일)을 로드해서 분석해 보면,,,

VIS코드 [1(P) 0 0 0 0 0 1 0] 로부터 모드를(Robot, 160×120, green BW) 인식가능하고,

수직동기 및 라인동기 분석으로 114 line과 대략 평균 [ 0 sync 260  image scan-line 3080 ] 패턴을 찾을 수 있습니다. (6 라인은 검출 실패인것 같아요!)

<소스코드>

 
from scipy.io.wavfile import read
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import hilbert

#-- Copy all the samples into an array
fs , audio = read("R8.wav")
audio = audio[:,0]

#-- Generate the Hilbert transformed vector of the samples
analytic_signal = hilbert(audio)
instantaneous_phase = np.unwrap(np.angle(analytic_signal))
fi = np.diff(instantaneous_phase) / (2.0*np.pi) * fs

#-- Plot the frequency over time graph
plt.figure(1)
t = np.arange(0, len(fi))/fs
plt.axhline(1200, color="red", linestyle=":")
plt.axhline(1500, color="red", linestyle=":")
plt.axhline(2300, color="red", linestyle=":")
plt.plot(fi)
plt.ylabel('Frequency')
plt.ylim([1000, 2500])
plt.show(block=False)

plt.figure(2)
w = 160
d = np.int64(np.linspace(260, 3080, w))
x = np.empty((0,w), dtype=np.uint8)
SyncH , hitH = 0 , 0
msec = 44.1   # threshold , 1 msec
for j in range(0, len(fi)) :
    # Horizontalsynchronization
    if (1050< fi[j] <1350) :   # 1200
        if SyncH : hitH += 1
        else : SyncH = j
    else :
        if SyncH and (5*msec< hitH <7*msec) :   # 6
            x = np.append(x, [np.uint8( ((fi[SyncH+d] - 1500.0)/800)*255 )], axis=0)
        SyncH , hitH = 0 , 0

h = plt.imshow(x, cmap='gray')
plt.show(block=False)
 

 

Robot 8 B/W

 

2. Robot 24

각 컬러 성분 R, G, B 는 휘도(Y, luminance)와 색차(CrCb, chrominance) 신호로 변환됩니다. RGB와 달리 이미지의 전송 시간은 더 짧아지고, 이 색상 코딩은 텔레비전 방송에서 흑백과 색상 호환성이 있습니다.

색차 신호는 두 개의 차분 색상 신호 𝑅−𝑌와 𝐵−𝑌로 구성됩니다. 신호 𝑌는 밝기라고 불리며, 𝑌 = 0.30𝑅 + 0.59𝐺 + 0.10𝐵 라는 식으로 생성된 밝기와 관련된 신호를 포함합니다.

 

Color의 YCrCb 신호로 분해

24초 모드는 256×120 해상도 및 4:2:2 색상 포맷의 YCrCb를 사용합니다. 색차정보는 두 인접한 픽셀의 평균에서 얻습니다.

자~ 이제 그럼,,, 남은 것은 여러분이 이미지를 디코딩하는 일밖엔 없습니다!

여러분의 몫이 부디 즐거운 놀이가 되시기를...

R24.wav
4.47MB

 

4:2:2 색상 포맷의 YCrCb

 

3. Robot 36

36초 모드는 256×240 해상도 및 4:2:0 색상 포맷의 YCrCb를 사용합니다. 색차정보는 두 인접한 픽셀과 라인의 평균에서 각각 얻습니다. 

robot 36 컬러는 미르, 국제우주정거장(ISS), 우주왕복선 임무에서의 SSTV 전송을 위해 사용되었습니다. 저궤도 우주정거장을 공전 중 10분 만에 수신할 수 있기 때문에 이미지 품질과 전송 시간 사이에 꽤 좋은 타협점입니다.

R36.wav
6.48MB

 

4:2:0 색상 포맷의 YCrCb
Robor36 최종 디코딩 컬러 이미지

 

여러분! 컬러 이미지 잘 디코딩되나요?!

마지막 단계로 wav 오디오신호를 아마추어무전기 aux로 입력하여 실제 무선통신으로 이미지 전송해 보는 것은 어떨까요?

 

<참고자료>

1. Image Communication on Short Waves – SSTV, WEFAX, HamDRM

2. Slow-Scan Television (SSTV) - Signal Identification Wiki

3. GitHub - MossFrog/SSTV-Decoder: An SSTV decoder created using python. The input files consists of 8 second frequency modulated transmissions.

4. Slow-scan television - Wikipedia

'통신이론' 카테고리의 다른 글

ATIS_비행정보방송(feat. SDR)  (0) 2025.12.18
동기화(Synchronization)  (0) 2025.09.30
간단한 OFDM 체험기  (8) 2025.08.15
대역확산스펙트럼 기술들(DSSS, FHSS)  (1) 2025.06.17
다중경로 페이딩과 극복기술  (1) 2025.05.25