文号
945505
阅读
6374
回复
2
收藏
2
SSDV——面向不可靠信道的数字图像传输设计
马 志伟1
1. 风信子卫星团队, 海南省海口市美兰区人民街道海甸岛碧海大道2-1号
2025/07/11
原创
IP:海南
摘要:SSDV(Slow Scan Digital Video)是一种面向无连接且容易发生丢包和误码的无线信道设计的分组化图像传输格式。本文从模拟慢扫描电视SSTV的局限出发,介绍SSDV的产生背景,并结合JPEG的色彩变换、色度下采样、离散余弦变换、量化和熵编码过程,说明普通JPEG在这一信道条件下的问题,随后分析SSDV通过预设量化表和霍夫曼表、按16×16像素最小编码单元组织数据、重置直流分量、设置图像及数据包编号、CRC校验和可选Reed-Solomon前向纠错等机制提高图像可恢复性的原理,并介绍其数据包结构、传输效率及现有尺寸限制。

一、序言

对人类而言,图像是一种天然的高效信息承载形式,是一种重要的信息媒介。有一句英文成语叫做“A picture is worth a thousand words.”(一画胜千言)。图像远比纯粹的文字或语音更直观、更生动,更具表现力,更能够传递丰富的情境信息与情感色彩。


因此,自无线电技术诞生之初,人们便开始了利用无线信道传输图像的探索。20世纪初,阿瑟·科恩成功地通过无线电波从柏林向巴黎发送了一张照片,这标志着无线图像传输的雏形——无线电传真的诞生。随后,传真技术在新闻、军事等领域迅速得到应用,使得远距离传输静态图像成为可能。


随着电子技术的发展,无线电信道下的图像传输进入了新的高度。20世纪20年代末,约翰·洛吉·贝尔德和菲洛·法恩斯沃斯等先驱们分别通过机械和电子方法实现了电视画面的传输。二战后,电视广播在全球范围内普及,实时动态图像通过无线电信号进入千家万户,彻底改变了人们的生活。


与此同时,业余爱好者们也试图在业余无线电频段传输图像。图像通联有着更大的创作空间,更能够彰显操作员的风格。但由于业余电台的发射功率和带宽限制,传统的电视广播模式在业余无线电活动中并不适用。20世纪50年代,一种被称为 SSTV(慢扫描电视,Slow-Scan Television)的图像传输模式应运而生,这也是当今业余无线电爱好者入门时最先接触的且较为熟知的一种模式。


SSTV将一帧图像分解成多条扫描线,然后以非常缓慢的速度逐线传输这些模拟信号。接收方收到信号后,再将其合成完整的图像。这种方式使得SSTV能够在传统的业余无线电语音频段进行图像通信,即使在恶劣的传播条件下也能收到可辨识的图像。具体原理请参见:


SSTV(慢扫描电视)的调制 - 科创网[1]


目前,SSTV依旧是业余无线电中图像通信的重要形式。除地面电台外,包括国际空间站(ISS)在内的多颗业余卫星均会定期开展SSTV传图活动。对于业余爱好者而言,能亲手接收到来自远方、甚至太空的图像,是一种别具意义的成就感与乐趣。

二、从SSTV到SSDV:步入数字时代

尽管SSTV在业余无线电界广受欢迎,但其模拟传输的本质也带来了一些局限性,例如图像质量受噪声影响较大(不够HiFi),而且无法对其应用纠错机制。随着数字技术在通信领域的飞速发展,将数字技术引入慢扫描图像传输成为必然趋势。


这就是 SSDV(慢扫描数字电视,Slow Scan Digital Video)诞生的背景。SSDV是SSTV在数字时代的演进,它将图像数据进行数字化编码,并通过数字调制技术进行传输。SSDV由英国爱好者 Phil Heron(MI0VIM) 为当时广泛开展的高空气球活动开发。


气球携带的有效载荷需要将拍摄到的图像从数万米的高空传输回地面。传统的SSTV在这种极端条件下,图像容易受到信噪比不佳的影响,导致图像质量下降甚至无法识别。而SSDV通过引入数字编码和纠错机制,极大地提高了图像传输的可靠性和抗干扰能力,使得高空气球能够稳定地传输高质量的图像,这对获取壮丽的地球边缘照片至关重要。(毕竟你也不想让拍到的照片里有一堆噪点吧)


与SSTV的模拟信号不同,SSDV传输的是经过压缩和编码的数字数据包。这不仅能在相同带宽下提供更高质量、更保真的图像,或在相同图像质量下占用更少带宽,而且数字信号天生对噪声和干扰具有更强的抵抗力。


SSDV的出现,为业余无线电图像传输带来了革命性的变化。它不仅继承了SSTV慢速传输、低带宽占用的特点,更通过数字技术解决了模拟传输的痛点,提供了更高质量、更可靠的图像通信体验。它使得业余爱好者能够在低速、窄带宽的无线电链路上,体验到接近互联网图像传输的清晰度和稳定性。


本文以Philip Heron开发的SSDV实现作为研究对象。原项目托管于GitHub,该仓库已于2025年12月31日归档并停止更新。

为保证本文所依据源码的可追溯性,本文同时将研究时使用的GitHub仓库版本作为原始数据附件固化保存。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX[2]

三、SSDV的地基:JPEG

SSDV能够实现高质量图像传输的关键,在于其底层采用了高效的图像压缩标准——JPEG。


想要了解SSDV这一数字图像传输模式,就不得不先对JPEG做出了解。JPEG是一种常用的有损压缩标准,被广泛应用于数字图像存储和传输。注意:本章节将只对JPEG基本原理做出阐述,而不注重于文件的格式与其他标准。


一些基本知识:

亮度更多的体现了图像的轮廓、边缘、纹理。视觉系统中负责感光的视杆细胞数量远多于负责色彩的视锥细胞。

另外的,人眼对低频(主要轮廓、平均亮度)成分敏感,对高频成分不敏感。


因此,JPEG通过利用人类视觉系统的特性,考虑到工程实用性、变换可逆性、压缩效率等多个方面,选用了 YCbCr 色彩模式(而不是更符合人类视觉感知的Lab或HSB颜色空间)在这多个方面之间取得了良好的平衡,并便于进行子采样压缩。


JPEG编码器对于色度分量的压缩,是通过下采样进行实现的:

JPEG编码器将图像划分为多个 8x8 的数据块,称为最小编码单元,在下采样之前对应于原图像的一个8x8的像素阵列。然后(一般)使用4:2:0采样模式对色度分量进行空间下采样,每四个亮度块(Y 分量)对应一个色度块。这意味着对于每个 16×16 的像素区域,只有 1/4 数量的色度信息被保留,从而大大减小了数据量,同时对视觉质量影响较小。现在每个亮度数据块对应 8x8 的像素阵列,每个色度数据块对应 16x16 的像素阵列。


现在我们有8×8 的多个数据块,里面每个点是其对应通道中对应像素的强度值,例如有:

$$f(x, y),x, y ∈ [0, 7]$$

直接对其进行传输时,数据量显然很大。我们需要再想一种方式对其进行压缩。先前讲过,除开色度外,人眼对低频(主要轮廓、平均亮度)成分敏感,对高频成分不敏感。于是我们可以把这些强度分布转换为频率信息,分离出图像的低频和高频成分,保留低频,丢掉高频,实现进一步的压缩。[3]


将像素值从空间域转换到频率域,需要抬出二维 离散余弦变换(DCT),其公式如下:

$$F(u,v) = \frac{1}{4} \cdot C(u)C(v) \sum_{x=0}^{7} \sum_{y=0}^{7} f(x,y) \cdot \cos\left[\frac{(2x+1)u\pi}{16}\right] \cdot \cos\left[\frac{(2y+1)v\pi}{16}\right]$$

其中:

  • $f(x,y)$:为$(x,y)$处的灰度值

  • $F(u,v)$:变换结果,表示$u,v$频率成分上的能量

  • $u,v$:频率指标(横向、纵向的频率成分编号),范围 0~7

  • $C(u), C(v)$:归一化系数,用于保留能量一致性

归一化项:

$$C(t) = \begin{cases} \frac{1}{\sqrt{2}} & t = 0 \\ 1 & t \neq 0 \end{cases}$$

将变换后的结果列为矩阵,左上角为低频信息,含有图像主要轮廓和明暗信息(特殊的,$F(0,0)$为DC分量,代表了平均强度);右下角为高频信息,包含纹理和噪声细节。


接下来使用一个预设或自定义的 量化矩阵$Q(u,v)$(量化表,QT)对频率系数进行压缩,每一个系数被除以对应的量化因子,并四舍五入取整:

$$F_q(u,v) = \text{round} \left( \frac{F(u,v)}{Q(u,v)} \right)$$

这一步骤会舍弃人眼不敏感的高频细节,极大的减小数据量,是 JPEG 有损压缩的核心所在。

量化后的系数按照 Zig-Zag 扫描顺序排列成一维向量。Zig-Zag 顺序有利于将低频(非零)系数集中到序列前部,高频(大多为零)系数排到后部,有利于后续压缩。


然后,JPEG编码器对这些系数进行熵编码:

  • DC 分量采用差分脉冲编码(DPCM),记录本块与前块 DC 的差值

  • AC 分量使用游程长度编码(RLE)与 Huffman 编码相结合,对连续的 0 进行压缩编码


最终,所有编码数据被按块顺序合并成一个压缩图像数据流。


打包图像时,编码器将在图像文件开头预先定义图像的基本信息和压缩过程中所用到的各种参数,如图像的大小,通道,位深,DPI,量化表QT、霍夫曼表HT等等内容,然后再将图像压缩数据流附在最后。[3]

四、面向不可靠信道的图像传输设计

从理论上看,JPEG图像本质上就是一个压缩后的小文件,为什么不直接通过无线电链路把完整的JPEG文件发送出去,而是采用更复杂的SSDV格式?这个问题乍看简单,实则涉及到无线电链路的特点、实时接收能力的要求、以及图像恢复机制的设计理念等多方面因素。


在上一章节,我们讲解了JPEG的基本知识。有三点较为重要:

  1. DC 分量采用了差分脉冲编码

  2. 编码数据仅按块顺序合并成一个压缩图像数据流

  3. 霍夫曼码表等解码所需要的信息仅在文件开头定义


这三点决定了JPEG格式是极其脆弱的,一旦没有在发射刚刚开始时就进行接收,或者在接收发射的过程中产生了一个字节的丢失或错误,就可能导致整张图像无法显示、花屏、色彩细节错乱甚至彻底报错。同样,其他的图像格式也或多或少面临着这些问题。


相比于网络或本地文件系统,无线电链路的最大特点就是——不可靠。即使信道状况良好,也经常发生单个字节,甚至成百上千个字节的丢失或者错误。这些错误在普通数据通信中可能尚可通过重传机制弥补,但在广播式的图像传输中,丢包即意味着损毁。直接传输普通数字图像显然不是一个明智的选择。所以,我们需要针对这种不可靠信道特别设计一种流式图像格式——这就是SSDV的目的。


SSDV是基于JPEG格式的。

但有所不同的是,SSDV 定义了原始标准量化表、量化表缩放因子、标准霍夫曼码表等一系列参数。它在编码阶段将图像以按质量等级缩放后的量化表与预设的霍夫曼码表重新进行处理,然后将一个个16x16像素作为一个最小编码单元进行裁切,塞入数据帧内(每帧的第一个MCU的各个通道组件DC值都按相对于0进行了重置),再给每帧标记好所使用的质量等级与采样模式。这样即使从任意一个数据包开始接收,或者遇到部分数据包丢失,也能知道数据包所用的编码参数,进而恢复出图像的主体内容;

五、Packet Format 帧格式

Offset

Name

Size

Description

0

同步字

1

0x55 - May be preceded by one or more sync bytes

1

数据包类型字

1

0x66 - Normal mode (224 byte packet + 32 byte FEC)




0x67 - No-FEC mode (256 byte packet)

2

呼号

4

Base-40 encoded callsign. Up to 6 digits

6

图像编号

1

Normally beginning at 0 and incremented by 1 for each new image

7

数据包编号

2

The packet number, beginning at 0 for each new image (big endian)

9

图像宽度

1

Width of the image in MCU blocks (pixels / 16) 0 = Invalid

10

图像高度

1

Height of the image in MCU blocks (pixels / 16) 0 = Invalid

11

质量级别,子采样模式等类型标记

1

00qqqexx: 00 = Reserved, qqq = JPEG quality level (0-7 XOR 4), e = EOI flag (1 = Last Packet), xx = Subsampling Mode (0 = 2×2, 1 = 1×2, 2 = 2×1, 3 = 1×1)

12

MCU 偏移

1

Offset in bytes to the beginning of the first MCU block in the payload, or 0xFF if none present

13

MCU 索引

2

The number of the MCU pointed to by the offset above (big endian), or 0xFFFF if none present

15

图像载荷数据

205 / 237

Payload data

220 / 252

校验和

4

32-bit CRC

224

FEC 向前纠错

32

Reed-Solomon forward error correction data. Normal mode only (0x66)

大小和偏移量以字节为单位,每个数据包总共为 256 字节。

(在最新版本中,数据包大小可自行设置,但本文还是以默认的256字节为例。)


SSDV 数据包分为带有前向纠错(0x66)与不带有前向纠错(0x67)的两种类型。

前向纠错(FEC)能够让数据包更加健壮,在恶劣的信道环境下不易直接损坏。但前向纠错会额外占据32字节的空间,使得每帧中携带的数据载荷量更少,传输时间更长,有时反倒会起到负面的效果。


随后,每个数据帧会嵌入呼号,以表示数据包来源,避免在多个数据来源的状态下错误的拼接在一起。为了节约空间,呼号使用了 Base40 进行编码。(虽然Base36也行,但是反正使用Base36和Base40都能把呼号压到四个字节,用Base40还可以有更多的发挥空间)

image.png

图:Base40算法


然后就是用于区分不同图像和数据包所用的编号。防止多个图片混合解码,防止数据包产生偏差。


再然后嵌入图像的宽高基本信息。


然后提供类型标记,展示该数据包对应的图像质量和图像采样类型。


前文提到了 SSDV 定义了一个原始标准量化表和一套量化表缩放因子。不同的传输质量对应不同的缩放因子,可以由此缩放出七种不同强度的量化表。

image.png

图:SSDV协议中采用的原始标准量化表(QT)


因为编解码所使用的量化表相同,所以只需要在类型标记中传输图像质量即可。


MCU 偏移和MCU 索引对应了本帧第一个MCU在图片中所对应的位置,后续的MCU将依次排列。


最后需要说明的是,SSDV发展较早,其原型大约诞生自十五年前,因此SSDV协议在设计时产生了部分妥协,以兼容嵌入式设备,由此产生一些问题——

  • 虽然JPEG本身通过一些手段支持了不规整宽高的图片,但SSDV尚未实现对不规整宽高图片的支持,图片的宽度和高度必须是 16 的倍数。

  • 在0x66前向纠错模式下,每个数据包包含205字节有效载荷,因此65536个数据包对应的理论有效载荷上限为13434880字节,约为12.81 MiB。无前向纠错的0x67模式每包可包含237字节有效载荷,其理论上限约为14.81 MiB。

  • 数据包中的图像宽度和高度字段各占1字节,并以16像素宽的MCU块为单位,因此单个方向最多表示255个MCU块,对应的最大尺寸为4080像素;同时,16位MCU索引要求图像包含的MCU总数不超过65535。


六、后记


SSDV的技术原理并不复杂,但为了适应不可靠的信道,SSDV在JPEG的基础上做出了较多的细节变更。这些细节杂而乱,本文仅挑选了其中一些较为重要的部分。欢迎读者做出进一步的探讨,也欢迎读者就源码进行研究。

参考文献
  1. [1]
    马志伟. SSTV(慢扫描电视)的调制[EB/OL]. [2026-09-08] https://www.kechuang.org/t/90795.
  2. [2]
    Heron P.. SSDV: A robust packetised version of the JPEG image format[EB/OL]. (2025-12-31) [2026-09-08] https://github.com/fsphil/ssdv.
  3. [3]
    ITU-T. T.81 Information technology—Digital compression and coding of continuous-tone still images—Requirements and guidelines:Information technology—Digital compression and coding of continuous-tone still images—Requirements and guidelines[S/OL]. 1992.
原始数据
[ 修改于1个月22天前 - 2026/09/08 22:22:40 ]
+10
科创币
Merlin_1D
2025/07/11
继续努力
2
8
1个月28天前IP:中国
952062
2楼
引用smith发表于1楼的内容
这个项目输入数据是什么,IQ数据文件吗?我这边研究基于AD936X的QPSK无线图传,把摄像头数据通笔记本电脑编码成h264的ts流,再通过plutosdr进行QPSK解码调制,解码端发现一个很好的项...

抱歉,刚才看到消息)

SSDV是一个表示层的协议,并不关心底层的信道,所以原版只是负责编解码数据包。

引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的