【传统JSCC+Deep JSCC】联合信源信道编码完全指南

联合信源信道编码 (JSCC) 完全指南

📡 通信与AI交叉领域的"革命性技术"

🎯 目标 :从香农分离定理出发,讲透从传统优化到深度学习端到端传输的演进逻辑

💡 核心 :打破"压缩"与"纠错"的界限,实现优雅的抗干扰传输

📅 最后更新:2025年12月


📋 目录


1. 起源:为什么我们要打破"经典规则"?

1.1 香农分离定理 (The Separation Theorem)

在通信教科书里,有一个"金科玉律":信源编码和信道编码可以分开做,且互不影响最优性。

复制代码
┌──────────┐   ┌──────────┐   ┌──────────┐
│ 信源编码 │ → │ 信道编码 │ → │  调制    │ → 无线信道
└──────────┘   └──────────┘   └──────────┘
  (压缩)         (加纠错码)     (变波形)
  • 压缩的人 (Source Coding):只管把文件压得越小越好,不管是发给谁。
  • 纠错的人 (Channel Coding):只管保护比特不丢,不管里面装的是照片还是文字。

1.2 现实中的"翻车"现场

香农定理成立有一个前提:码长无限长(意味着你可以容忍无限的延迟)。但在现实应用(如无人机图传、自动驾驶)中,我们面临两个问题:

  1. 时延敏感:不能为了完美纠错等太久。
  2. 信道剧烈变化 :如果不针对当前信道调整压缩策略,会出现悬崖效应 (Cliff Effect)

悬崖效应

当信道质量稍稍低于预设门槛,传统数字系统的解码会彻底失败,视频直接卡死或黑屏。

JSCC (Joint Source-Channel Coding) 的出现,就是为了解决这个问题:把"压缩"和"保护"这两件事放在一起考虑。


2. 传统 JSCC:在规则内的"精打细算"

在深度学习出现之前,传统的 JSCC 主要是基于数学优化资源分配。它并没有抛弃"比特",而是更聪明地分配比特。

2.1 核心策略:不等差错保护 (UEP)

传统数据(如 JPEG 图片或 MPEG 视频)中,比特的重要性是不一样的:

  • 重要比特:文件头、低频分量、高位 (MSB)。如果它们错了,整张图就废了。
  • 次要比特:高频纹理、低位 (LSB)。如果它们错了,只是图稍微噪一点。

传统 JSCC 的做法

复制代码
资源分配逻辑:

总带宽有限 (假设只能发 100 个包)
    ↓
重要数据 (占 20%) ──分配──> 50 个包 (极强的纠错码,保护严实)
次要数据 (占 80%) ──分配──> 50 个包 (弱纠错码,甚至不保护)

2.2 联合速率分配

系统实时监测信噪比 (SNR),动态调整压缩率编码率的平衡点:

  • 信道好:少纠错,多传数据(画质高)。
  • 信道差:多纠错,少传数据(画质低,但能连上)。

局限性:依然基于"0/1 比特"和"模块化设计",计算复杂度高,且在极低信噪比下依然会崩溃。


3. Deep JSCC:颠覆性的"端到端"架构

Deep JSCC 彻底抛弃了"信源编码"和"信道编码"的模块划分,也抛弃了中间的二进制比特 。它把通信系统看作一个自动编码器 (Autoencoder)

3.1 架构图解

复制代码
      发送端 (Encoder)              信道 (Channel)             接收端 (Decoder)
┌─────────────────────────┐   ┌───────────────────────┐   ┌─────────────────────────┐
│ 输入图像 x (H×W×C)      │   │                       │   │ 输入:噪声信号 y        │
│    ↓                    │   │                       │   │    ↓                    │
│ [ 神经网络特征提取 ]    │   │  y = h·z + n          │   │ [ 神经网络特征恢复 ]    │
│ (Conv / Transformer)    │   │                       │   │ (Deconv / Transformer)  │
│    ↓                    │   │  h: 衰落系数          │   │    ↓                    │
│ 特征向量 (浮点数)       │   │  n: 高斯噪声          │   │ 恢复图像 x_hat          │
│    ↓                    │   │                       │   │                         │
│ [ 功率归一化 ]          │→→→│ (模拟波形传输)        │→→→│                         │
│    ↓                    │   │                       │   │                         │
│ 发送符号 z (复数)       │   │                       │   │                         │
└─────────────────────────┘   └───────────────────────┘   └─────────────────────────┘

3.2 关键变革:从"比特"到"语义特征"

  • 传统:图像 010101 调制 010101 图像
  • Deep JSCC :图像 连续的高维特征向量 模拟波形 带噪特征 图像

这为什么重要?

因为它把数字通信变成了模拟通信的变体。特征值的微小扰动(噪声),只会导致解出的图像有微小模糊,而不会导致解码失败。


4. Deep JSCC 的核心技术细节

4.1 带宽压缩比 (Bandwidth Compression Ratio)

这是 Deep JSCC 最重要的参数,决定了传输效率。

  • k: 信源维度(例如图片像素总数 )。
  • n: 信道使用符号数(Channel Uses,即发送端输出向量的长度)。
  • 逻辑:神经网络通过"瓶颈层 (Bottleneck Layer)"将高维图片 压缩成低维符号 。 越小,传得越快,但丢失信息越多。

4.2 功率归一化 (Power Normalization)

因为是直接发射模拟信号,必须遵守物理世界的能量守恒和硬件限制。

在 Encoder 输出 之前,必须强制限制其平均功率为 1 (或 ):

4.3 可微信道层 (Differentiable Channel)

为了让神经网络能从头训练到尾(End-to-End Training),中间的物理信道必须用数学公式模拟,并且支持梯度反向传播

通常建模为 AWGN (加性高斯白噪声) 信道

或者 瑞利衰落信道

4.4 损失函数 (Loss Function)

训练的目标是让恢复的图像 尽可能接近原图 。

  • MSE (均方误差):。最常用,指标好看(PSNR高),但图片可能发糊。
  • 感知损失 (Perceptual Loss):用 VGG 等网络提取特征进行对比。更符合人眼视觉,纹理更真实。

5. 性能对比:悬崖效应 vs 优雅降级

这是论文中必画的一张图:PSNR (画质) 随 SNR (信号质量) 的变化曲线

维度 传统数字编码 (分离编码) Deep JSCC (端到端)
工作模式 "全有或全无" "尽力而为"
低信噪比 (Low SNR) 崩溃 (Cliff Effect):直接断连,无法解码 模糊:画面噪点多,但能看清轮廓,不中断
高信噪比 (High SNR) 瓶颈:受限于预设的量化精度,画质不再提升 提升:画质随信道变好线性提升
适应性 差,需要频繁握手切换码率 强,天然适应信道波动
数据形态 离散的比特流 (Bits) 连续的语义特征 (Features)

总结逻辑

Deep JSCC 就像两个人对话。

  • 传统方法:必须听清每一个字,听错一个字可能整句话意这就反了。
  • Deep JSCC:听不清字没关系,听个大概语调和口型,脑补一下也能懂(语义通信)。

6. 实战代码示例 (PyTorch)

这是一个最小化的 Deep JSCC 模型实现,帮助你理解数据流向。

python 复制代码
import torch
import torch.nn as nn

class DeepJSCC(nn.Module):
    def __init__(self, channel_dim=16):
        super(DeepJSCC, self).__init__()
        
        # 1. 编码器 (Encoder): 图片 -> 特征 -> 压缩符号
        # 输入: [Batch, 3, 32, 32] (CIFAR-10 图片)
        self.encoder = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            # 瓶颈层:将数据压缩到 channel_dim 个通道
            nn.Conv2d(32, channel_dim, kernel_size=3, stride=1, padding=1)
        )
        
        # 2. 解码器 (Decoder): 噪声符号 -> 特征 -> 恢复图片
        self.decoder = nn.Sequential(
            nn.ConvTranspose2d(channel_dim, 32, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(32, 16, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(16, 3, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.Sigmoid() # 输出归一化到 0-1
        )

    def power_normalization(self, z):
        """
        功率归一化:确保发送信号的平均功率为 1
        """
        # 计算每个样本的平均功率
        # z shape: [Batch, Channel, H, W]
        power = torch.mean(z ** 2, dim=[1, 2, 3], keepdim=True)
        z_norm = z / torch.sqrt(power)
        return z_norm

    def channel(self, z, snr_db):
        """
        AWGN 信道模拟
        """
        # 1. 计算信号功率 (归一化后应为1)
        signal_power = torch.mean(z ** 2)
        
        # 2. 根据 SNR 计算噪声功率
        snr_linear = 10 ** (snr_db / 10.0)
        noise_power = signal_power / snr_linear
        noise_std = torch.sqrt(noise_power)
        
        # 3. 加噪声
        noise = torch.randn_like(z) * noise_std
        return z + noise

    def forward(self, x, snr_db):
        # --- 发送端 ---
        # 1. 提取特征
        features = self.encoder(x)
        # 2. 功率归一化 (变为模拟符号)
        symbols = self.power_normalization(features)
        
        # --- 信道 ---
        # 3. 经过无线信道 (叠加噪声)
        noisy_symbols = self.channel(symbols, snr_db)
        
        # --- 接收端 ---
        # 4. 恢复图像
        reconstructed_img = self.decoder(noisy_symbols)
        
        return reconstructed_img

# --- 使用示例 ---
if __name__ == "__main__":
    # 模拟一张 32x32 的 RGB 图片
    img = torch.rand(1, 3, 32, 32)
    
    # 初始化模型
    model = DeepJSCC(channel_dim=8) # 极高的压缩率
    
    # 前向传播 (假设信噪比 10dB)
    output = model(img, snr_db=10)
    
    print(f"输入尺寸: {img.shape}")
    print(f"输出尺寸: {output.shape}")
    print("流程跑通!")

🎉祝你天天开心,我将更新更多有意思的内容,欢迎关注!

最后更新:2025年12月
作者:Echo

相关推荐
阿杰学AI2 小时前
AI核心知识63——大语言模型之Reasoning Model (简洁且通俗易懂版)
人工智能·ai·语言模型·aigc·cot·推理模型·reasoning model
东方佑2 小时前
使用Python标准库将Word文档转换为HTML:深入解析.docx文件处理脚本
python·html·word
Blossom.1182 小时前
大模型AI Agent实战:ReAct框架从零实现与金融研报分析系统
人工智能·学习·react.js·stable diffusion·金融·aigc·知识图谱
Mintopia2 小时前
🌐 技术迭代速度与监管适配:WebAIGC的发展平衡术
前端·人工智能·aigc
祁思妙想2 小时前
Python中CORS 跨域中间件的配置和作用原理
开发语言·python·中间件
多则惑少则明2 小时前
AI大模型实用(九)Java快速实现智能体整理(使用LangChain4j-agentic + Tool)
java·人工智能·springai·langchain4j
模型启动机2 小时前
告别OCR与分块!ICLR 2025 ColPali实现视觉文档检索精度&速度双碾压
人工智能·ai·大模型·ocr
其美杰布-富贵-李2 小时前
数据清理与特征工程完整指南
笔记·深度学习·特征工程·训练·数据清理
xerthwis2 小时前
Hadoop:大数据世界的“古老基石”与“沉默的共生者”
大数据·人工智能·hadoop