matlab实用喷泉码

LT 码是第一代实用喷泉码 (Luby, 2002),核心思想:发送端产生无限编码包 (每个包是 K 个源符号的随机 XOR),接收端只要收到 ≈K(1+ε) 个包就能高概率恢复全部 K 个源符号,不需要握手重传。


一、Robust Soliton 度分布(核心)

参数:

  • (KKK):源符号数
  • (ccc):冗余控制(典型 0.1~0.5)
  • (δ\deltaδ):译码失败概率上界(典型 0.01~0.05)

R=cKln⁡(K/δ),τi={RiK,i=1,...,K/R−1RKln⁡(Rδ),i=K/R0,i>K/RR = c\sqrt{K}\ln(K/\delta),\quad \tau_i = \begin{cases} \displaystyle\frac{R}{iK}, & i=1,\dots,K/R-1\\6pt \displaystyle\frac{R}{K}\ln\left(\frac{R}{\delta}\right), & i=K/R\\6pt 0, & i>K/R \end{cases}R=cK ln(K/δ),τi=⎩ ⎨ ⎧iKR,KRln(δR),0,i=1,...,K/R−1i=K/Ri>K/R

ρi=μi+τi∑(μ+τ),μi={1/K,i=11/i(i−1),i=2..K\rho_i = \frac{\mu_i+\tau_i}{\sum(\mu+\tau)},\qquad \mu_i=\begin{cases} 1/K, & i=1\\ 1/i(i-1), & i=2..K \end{cases}ρi=∑(μ+τ)μi+τi,μi={1/K,1/i(i−1),i=1i=2..K

matlab 复制代码
%% robust_soliton.m
function rho = robust_soliton(K, c, delta)
% RSD 度分布, 返回 1×K 向量 rho(d) for d=1..K
    R = c * sqrt(K) * log(K/delta);

    % Ideal Soliton μ
    mu = zeros(1, K);
    mu(1) = 1/K;
    for i = 2:K
        mu(i) = 1/(i*(i-1));
    end

    % Robust 附加峰 τ
    tau = zeros(1, K);
    for i = 1:K
        if i < K/R
            tau(i) = R / (i*K);
        elseif i == floor(K/R)
            tau(i) = R/K * log(R/delta);
        end
    end

    rho = (mu + tau) / sum(mu + tau);
end

典型值 c=0.1, δ=0.01,平均度 ≈ c·ln(K/δ) ≈ 3~5,小 K 时稍大。


二、LT 编码

每个编码包:按 RSD 采度 d → 随机选 d 个源符号 → XOR。

matlab 复制代码
%% lt_encode.m
function [code, neighbors] = lt_encode(src, rho, N)
% src: 1×K 二进制源符号(也可扩到 GF(2^m))
% rho: RSD 度分布
% N: 要产生的编码包数
% code: N×1 编码符号
% neighbors: cell, 每个元素是选中的源符号下标

    K = length(src);
    code = zeros(N, 1);
    neighbors = cell(N,1);

    for n = 1:N
        d = randsample(K, 1, true, rho);      % 按 RSD 采样度
        idx = randsample(K, d, false);        % 随机选 d 个源符号
        neighbors{n} = idx;
        code(n) = mod(sum(src(idx)), 2);      % XOR
    end
end

三、Peeling 译码(BEC / 无噪理想情况)

这是 LT 最经典的译码,消息传递的简化版 :找度=1 的编码包 → 恢复对应源符号 → 从相连其他编码包里"消去"它 → 度数减 1,产生新的度=1 包(叫 ripple),循环。

matlab 复制代码
%% lt_decode_peeling.m
function [decoded, success, iter] = lt_decode_peeling(code, neighbors, K)
% code: M×1 收到的编码包(BEC 下假设没丢,丢包=没收到,M<K 也能试)
% neighbors: cell(M,1)
% decoded: 1×K 恢复结果
% success: 是否全部恢复

    M = length(code);
    decoded = nan(1, K);
    % 维护每个编码包的当前值和剩余度
    val = code(:).';
    deg = cellfun(@length, neighbors);

    iter = 0;
    while true
        % 找度=1 且对应源未恢复的编码包
        cand = find(deg == 1);
        if isempty(cand), break; end

        idx = cand(1);
        sid = neighbors{idx}(1);          % 唯一的源符号
        if isnan(decoded(sid))
            decoded(sid) = val(idx);      % 恢复!
        else
            % 已被恢复,跳过(数值应一致,否则冲突)
        end

        % 消去:在所有包含 sid 的其他编码包中 XOR 掉
        for j = 1:M
            if any(neighbors{j} == sid) && j ~= idx
                val(j) = mod(val(j) + decoded(sid), 2);
                neighbors{j}(neighbors{j}==sid) = [];
                deg(j) = deg(j) - 1;
            end
        end
        % 本包已用完
        deg(idx) = 0; neighbors{idx} = [];
        iter = iter + 1;
    end

    success = ~any(isnan(decoded));
end

参考代码 LT码 喷泉码的MATLAB实现 www.youwenfan.com/contentcsw/82576.html

四、主脚本:扫 overhead,画成功率

matlab 复制代码
%% main_lt.m
clear; clc; close all;

K = 500;
c = 0.1; delta = 0.01;
rho = robust_soliton(K, c, delta);

overhead = 1.0:0.05:1.5;      % M/K
trials = 200;
success_rate = zeros(size(overhead));

for o = 1:length(overhead)
    M = round(K * overhead(o));
    cnt = 0;
    for t = 1:trials
        src = randi([0 1], 1, K);
        [code, neigh] = lt_encode(src, rho, M);
        [dec, ok] = lt_decode_peeling(code, neigh, K);
        if ok && isequal(dec, src), cnt = cnt + 1; end
    end
    success_rate(o) = cnt / trials;
    fprintf('M/K=%.2f, success=%.2f\n', overhead(o), success_rate(o));
end

figure('Color','white')
plot(overhead, success_rate, 'bo-', 'LineWidth',1.5)
xlabel('Overhead M/K')
ylabel('Decode Success Rate')
title(sprintf('LT Code (K=%d, c=%.2f, \\delta=%.3f)', K, c, delta))
grid on

跑出来典型曲线:overhead≈1.05~1.1 开始起飞,1.2 以后接近 1,符合 RSD 设计预期。

相关推荐
CodeStats2 小时前
《源纹天书》第121-125章:源匠归来——全栈重构与归元圣域的2.0时代
java·开发语言·源纹天书
binbin_522 小时前
UIAbility 与 WindowStage:窗口创建、加载、销毁的完整链路
开发语言·javascript·深度学习·华为·harmonyos
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第154题】【06_Spring篇】第14题:Spring 支持的 Bean 作用域
java·开发语言·spring·面试
Evand J2 小时前
【MATLAB例程】一维非线性状态滤波对比:经典EKF、MCC-EKF、MVC-EKF。在含异常测量的场景下,对比三种滤波方法的估计曲线和误差统计。
matlab·mvc·ekf·滤波·mcc
旖-旎2 小时前
QT界面优化(6)
开发语言·c++·qt
AI科技星2 小时前
基于超复数广义分形流形的电磁耦合与缪子反常磁矩几何理论
开发语言·平面·重构·概率论·量子计算·乖乖数学·全域数学
组合缺一2 小时前
用 ChatModel 构建 LLM 驱动的 Java 应用
java·开发语言·ai·llm·solon·rag
零点零一2 小时前
QT 5升级到 Qt 6 使用 Clazy 检查将 C++ 应用程序移植到 Qt 6
开发语言·c++·qt
caimouse2 小时前
reactos 测试安装32位微信失败的日志
开发语言·微信
爱奥尼欧2 小时前
轻量级可扩展日志框架-异步日志与系统集成
开发语言·数据库·c++·学习