萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

12
返回列表 发新帖
楼主: eisenstange

[电子] 一个简单的用维特比算法进行的卷积码编码和解码的例子

[复制链接]
 楼主| 发表于 2007-9-16 13:52 | 显示全部楼层
主程序如下:

% Coding  (编码)
% Interleaving (洗牌,插序)
% AWGN-Kanal (有线传输信道噪声模型)
%

clear;

N         = 300;                    % 随机比特序列长度
M         = 30;                      % Interleaving的行数,必须能被N整除
SNR      = -6 : 2 : 6;             % 信噪比单位dB
packets = 50;                      % 仿真的包数目
mod      = 'QAM';                 % 调制方式(QAM, 16QAM, 64QAM)

ov         = 8;
delay     = 6;
g           = rcosine(1, ov, 'sqrt/fir', 0.25, delay);

% ===== 循环信噪比 =====
display ('开始计算...');
for k = 1 : length(SNR)
    n_error = 0;
    % ===== 循环所有包 =====
    for pa = 1 : packtes

        % ===== 生成随机序列 =====
        bitSequence = randint (N, 1);

        % ===== 发送端构建数据报文 =====

       % 编码率 R = 1/2, 约束长度 L = 3 polynom {5,7}进行编码
        codedBits = convEncoder (bitSequence);

        % 进行洗牌
        [i_codedBits, n_pad] = interleaving (codedBits, M);

        % 编码
        tx_symbols = mapping (i_codedBits, mod);

        % 传输
        tx_symbols_u = upsample (tx_symbols, ov);
        tx_data = conv (tx_symols_u, g );

        % ===== 加入信道噪声 =====

        % 加入高斯白噪声
        rx_data = awgn (tx_data, SNR(k) - 10*log10(ov), 'measured');

        % ===== 接受端解码 ======

        %  匹配滤波器滤出信号,滤波器 g_MF(t) = K*g*(T-t)
        rx_data_mf = conv ( rx_data, g);

        % 下采样
        rx_data_d   = downsample (rx_data_mf, ov);
        rx_data_dd = rx_data_d (2 * delay + 1 : end - 2 * delay);

        % 解调
        decidedBits = demapping (rx_data_dd, mod);

        % 去洗牌
        d_codedBits = deinterleaving (decidedBits, M, n_pad);

        % 解码
        [decodedBits, metric] = viterbiDekoder (d_codedBits);

        % ===== 计算误码 =====
        n_error = n_error + sum(xor(bitSequences, decodedBits));
         
    end
  
    % ===== 计算误码率 =====
    if (n_error > 0)
        BER(k) = log10(n_error/(N * packets));
    else
        BER(k) = - Inf;
    end
    display(sprintf('当信噪比 = %i 时误码率 = %f', SNR(k), BER(k)));
end

% ===== 打印误码率曲线 =====
plot (SNR, BER);
title ('系统的误码率');
xlabel ('SNR [dB]');
ylabel ('log_{10}(BER)');
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-9-23 17:11 | 显示全部楼层
我上次也没说得很仔细,这些上级程序不是问题,可以根据具体需要具体设计。主要是解码部分的Algorithmus。目前比较实用的两种维特比算法无非也就是windows-basiert和frame-basiert这两种模式。

我大概看了一下你的上级程序,你的算法属于第二种,但是300的寄存长度有点资源浪费,也可能你需要解的码级数太高了。不过现在的维特比解码技术只适用于级数在10以内的记忆性编码。也就是说,可能存在的最长路经存储器的长度也不过是50。比如对于一个2. Grad的编码,长度为10的存储器就绝对够用了,再长的也只是浪费资源,对BER不会再有一丁点提高了。如果你坚持要设定这么大的路径存储器长度, 那么你就要把两种算法模式的特点综合一下。也就是说,引进windows-basiert模式中的maximal Traceback-Depth设定。意思就是,你每一步的回溯长度没必要超过5*n,因为Pfadvereinigung的缘故。如此你才可以使你的frame-basierte Viterbi-Decodierung实现真正的同步解码。不信的话你可以做一个试验,到时你会发现,你得出的误码率跟你原先程序中设定的回溯长度为300的解码的效果是基本一样的,然而用我上面描述的方法你只需要5*n的路径存储器长度,优势显而易见。另外这么做的话,你的CPU在模拟运算中也会轻松一些。

我现在开始向自动化方面发展了,这些通讯方面的都是以前研究的了。

评分

1

查看全部评分

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-10-1 21:00 | 显示全部楼层
基本上有点明白你的意思了,我觉得寄存器的长度不应该是固定不变的,而是根据信道的干扰不同而动态变化的。实际上这只是一个简化的模型,在无线通信中AWGN信道是不存在的。不过我本身也不是搞通讯的,呵呵。这是一门选修课上的作业,我拿来给那些需要的人参考一下。谢谢你的回帖,学到了。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网 |网站地图

GMT+2, 2024-4-29 21:57 , Processed in 0.051112 second(s), 15 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表