帮助理解 ka9q viterbi27 流式操作

信息处理 维特双算法
2022-02-02 12:35:21

我正在努力实现 ak=7、r=1/2 卷积码和 Viterbi 解码器以进行前向纠错。我想在流模式下操作,以便在整个消息完成之前从流中提取数据。我计划有一个 64 位的历史记录,并提取最旧的 16 位,在代码完成之前保持 48 位未解析。

[编辑] - 我发现代码有一个问题(见下文),但仍然不确定为什么在修复该问题后会出现如此多的错误。此处解释输出的任何输入都会有所帮助。

我在 Phil Karn 的 ka9q 网站上找到了我需要的代码: http ://www.ka9q.net/suitsat/dsp/ 。这为流行的速率 1/2、约束 7 卷积码实现了流式 Viterbi 解码器。我已经编译并运行了测试代码(viterbi27_streamtest.c),但输出看起来不对。我在默认配置(无命令行参数)下运行测试,输出看起来显示接近 50% 的错误。将 eb/n0 值增加到 20dB 会产生类似的输出。下面是输出的前几行,eb/n0 = 3dB。谁能解释这个输出,如果我理解这表明 10000 位中有大约 5000 个错误是正确的?

[编辑] 好的 - 我在代码中发现了一个错误。测试代码的第 132 行在设置后直接清除接收到的数据。不知道为什么。

    /* Convolutional encode, add noise */
    sr = (sr << 1) | databit;
    symbols[sym_p] = noise * rnor() + 127.5 + (parityb(sr & V27POLYA) ? Gain : -Gain);
    symbols[sym_p+1] = noise * rnor() + 127.5 + (parityb(sr & V27POLYB) ? Gain : -Gain);

    symbols[sym_p] = 0; symbols[sym_p+1] = 0;  <<<<<<<<< Here <<<<<<<<<<< 

原始结果

Bits = 10000
Decoder memory = 128 ebn0 = 3.00 dB
noise = 22.6543 RMS, data amplitude = +/-32
Total bit errors, chainback from 0 state: 629731
Total bit errors, chainback from best state: 629882
Error counts:
position      zero-state           best-state
 -1                 4917                 4918
 -2                 4917                 5078
 -3                 4917                 4916
 -4                 4917                 4916
 -5                 4917                 4919
 -6                 4916                 4917

(它有 128 行,数据相似)

删除有问题的行后,仍然会出现位错误,但要少得多:

Bits = 10000
Decoder memory = 128 ebn0 = 3.00 dB
noise = 22.6543 RMS, data amplitude = +/-32
Total bit errors, chainback from 0 state: 33797
Total bit errors, chainback from best state: 33517
Error counts:
position      zero-state           best-state
 -1                 4077                 4013
 -2                 3664                 3643
 -3                 3331                 3285
 -4                 2894                 2883
 -5                 2445                 2405
 -6                 2023                 2089
 -7                 1817                 1780
 -8                 1565                 1619
 -9                 1323                 1371
-10                 1073                 1108
-11                  918                  898
-12                  777                  786
-13                  635                  647
-14                  525                  548
-15                  448                  429
-16                  382                  364
-17                  311                  310
-18                  229                  248
-19                  199                  188
-20                  183                  170
-21                  159                  136
-22                  113                  118
-23                  106                   96
-24                  100                   85
-25                   80                   60
-26                   72                   52
-27                   65                   42
-28                   57                   36
-29                   53                   36
-30                   50                   36
-31                   49                   33
-32                   44                   34
-33                   38                   34
-34                   31                   35
-35                   31                   26
-36                   32                   24
-37                   32                   22
-38                   31                   22
-39                   30                   22
-40                   29                   20
-41                   26                   22
-42                   26                   20
-43                   26                   21
-44                   25                   22
-45                   24                   21
-46                   24                   23
-47                   25                   21
-48                   26                   23
-49                   26                   25
-50                   27                   26
-51                   27                   27
-52                   27                   28
-53                   28                   29
-54                   29                   29
-55                   29                   30
-56                   29                   30
-57                   30                   30
1个回答

问和回答:-)

所以,第二个问题是“最佳状态”起始状态的计算。测试代码将“-1”传递给 chainback 函数以请求它从“最佳”状态开始,但库代码 (viterbi27.c) 无法识别这一点,只是从状态 0b111111 (= -1 % 64)。我将以下代码添加到 viterbi27.c::chainback_viterbi27(..) - 从第 86 行开始 - 现在输出更有意义。
[编辑] 我发现了第三个问题,即使 Eb/N0 很好,也会导致残留错误。- 见下文。

/* Do Viterbi chainback */
int chainback_viterbi27(
      void *p,
      unsigned char *data, /* Decoded output data */
      unsigned int nbits, /* Number of data bits */
      int endstate){ /* Terminal encoder state */

  struct v27 *vp = p;
  decision_t *d;

  assert(vp->magic == V27MAGIC);

>>  if(endstate < 0){ // Start at the state with the best metric
>>    // Search through the stored metrics, finding the smallest
>>    int metric = UINT_MAX;
>>    for(int state = 0; state < 64; state++){
>>        if(vp->old_metrics[state] < metric){
>>            metric = vp->old_metrics[state];
>>            endstate = state;
>>        }
>>    }
>>  }

现在输出显示从“最佳”状态开始的更好结果,但是两个回链在 12 位(60dB Eb/N0 = 无错误)和大约 53 位和 3db Eb/N0 之后收敛。

Bits = 10000
Decoder memory = 128 ebn0 = 60.00 dB
noise = 0.032 RMS, data amplitude = +/-32
Total bit errors, chainback from 0 state: 16345
Total bit errors, chainback from best state: 4109
Error counts:
position      zero-state           best-state
 -1                 3086                    0
 -2                 2626                    0
 -3                 2138                    0
 -4                 1646                    0
 -5                 1092                    1
 -6                  688                    2
 -7                  407                    3
 -8                  274                    4
 -9                  150                    5
-10                   87                    6
-11                   46                    6
-12                   29                    6
-13                    6                    6
-14                    6                    6
-15                    7                    7
-16                    7                    7
-17                    8                    8
-18                    8                    8



Decoder memory = 128 ebn0 = 3.00 dB
noise = 22.6543 RMS, data amplitude = +/-32
Total bit errors, chainback from 0 state: 33984
Total bit errors, chainback from best state: 5637
Error counts:
position      zero-state           best-state
 -1                 4033                  156
 -2                 3671                  117
 -3                 3296                  100
 -4                 2855                   76
 -5                 2384                   69
 -6                 2033                   59
 -7                 1733                   45
 -8                 1481                   49
 -9                 1245                   44
-10                  996                   50
-11                  875                   39
-12                  719                   37
-13                  603                   39
-14                  528                   38
-15                  443                   37
-16                  385                   31
-17                  307                   29
-18                  248                   24
-19                  209                   22
-20                  207                   25
-21                  182                   25
-22                  156                   24
-23                  140                   24
-24                  125                   22
-25                  110                   20
-26                  100                   18
-27                   83                   20
-28                   77                   22
-29                   67                   23
-30                   59                   23
-31                   54                   22
-32                   50                   21
-33                   44                   20
-34                   42                   21
-35                   41                   21
-36                   43                   22
-37                   44                   22
-38                   44                   23
-39                   44                   24
-40                   43                   24
-41                   39                   25
-42                   38                   25
-43                   32                   26
-44                   32                   26
-45                   33                   27
-46                   36                   28
-47                   33                   29
-48                   35                   30
-49                   33                   30
-50                   33                   31
-51                   32                   31
-52                   33                   31
-53                   34                   32
-54                   33                   33
-55                   33                   33

[编辑] 第三个问题是当处理的测试位不足时,回链包含未初始化的数据。我在第 147 行将以下几行添加到 viterbi27_streamtest.c::main(..) 中。

>>    // We can't chain back the full buffer yet
>>    //- Skip the checking until we have enough data
>>    if(bit < 8*DECODE_BUF) continue;

    /* Compare results of chainback from 0 state with chainback from best state */
    chainback_viterbi27(vp,decode_data_0,8*DECODE_BUF,0);
    chainback_viterbi27(vp,decode_data_b,8*DECODE_BUF,-1);

这导致了零错误(对于最佳状态回链)和 12 位之后的零错误(对于零状态回链),这对我来说更有意义。