信道编解码(1)BCC编码_Viterbi译码
BCC编码_Viterbi译码
1 信道编解码概述
信道编解码在整个通信链路中的位置如下图所⽰。
802.11n的SIG字段发射机框图中使⽤了BCC编码。
2 BCC编码
BCC(Binary Convolutional Code,⼆进制卷积码),卷积码和分组码的根本区别在于,它不是把信息序列分组后再进⾏单独编码,⽽是由连续输⼊的信息序列得到连续输出的已编码序列。
2.1 结构图
BCC(2,1,2)卷积码编码结构图如下所⽰,图中D1、D2为寄存器,+为异或,每次输⼊1bit输出2bit。
2.2 ⽹格图
BCC(2,1,2)⽹格图如下所⽰,图中黄⾊表⽰当前输⼊对应的输出数据。
⽹格图描述了BCC编码器 输⼊数据 导致的 输出与寄存器状态的变化 关系。
3 Viterbi译码
Viterbi译码算法的核⼼思想在于“ 加、⽐、选”:
(1)“加”指的是将每个路径的分⽀度量进⾏累积。度量的⽅法有汉明距或者欧式距离等⽅法。(2)“⽐”指的是将到达节点的两条路径进⾏对⽐。
(3)“选”指的是选出到达节点的两条路径中度量值⼩的⼀条路径作为幸存路径。
在⾥有⼀个描述Viterbi译码过程的很好的例⼦。
4 仿真
SystemVerilog程序
仿真BCC(2,1,2)编码与Viterbi解码(下⾯程序中只采⽤了硬判决,即输⼊译码器的数据是1个Bit的0或1,⽽不是多个bit的LLR,因此使⽤汉明距离来计算路径的分⽀度量,下⾯程序中每次计算连续的两条路径)。
`timescale 1ns/1ps
module bcc_encoder_decoder();
localparam S0 =2'b00;//DFF state
localparam S1 =2'b01;
localparam S2 =2'b10;
localparam S3 =2'b11;
reg [17:0] input_data  ;
reg [17:0] output_data_a;
reg [17:0] output_data_b;
reg [35:0] output_data  ;
reg [1:0] dff_output    ;
reg [35:0] rec_data    ;
reg [1:0] current_state ;
reg [1:0] next_state    ;
reg [1:0] path          ;
reg [15:0] path_record  ;
reg [3:0] temp          ;
reg [2:0] s0s0s0        ;
reg [2:0] s0s0s2        ;
reg [2:0] s0s2s1        ;
reg [2:0] s0s2s3        ;
reg [2:0] s1s0s0        ;
reg [2:0] s1s0s2        ;
reg [2:0] s1s2s1        ;
reg [2:0] s1s2s3        ;
reg [2:0] s2s1s0        ;
reg [2:0] s2s1s2        ;
reg [2:0] s2s3s1        ;
reg [2:0] s2s3s3        ;
reg [2:0] s3s1s0        ;
reg [2:0] s3s1s2        ;
reg [2:0] s3s3s1        ;
reg [2:0] s3s3s3        ;
reg [15:0] decode_data  ;
integer k=0;
initial begin
$display("\n\n");
$display("BCC(2,1,2) ");
$display("BCC(2,1,2) ");
$display("");
input_data[17:0]=18'b00_1011_1010_1101_0111;//LSB first input
output_data_a[17:0]=18'h0;
output_data_b[17:0]=18'h0;
output_data[35:0]=36'h0;
dff_output[1:0]=2'b00;
for(k=0;k<18;k=k+1) begin
output_data_a[k]= input_data[k]^ dff_output[0]^ dff_output[1];
output_data_b[k]= input_data[k]^                dff_output[1];
output_data[2*k+1-:2]={output_data_b[k], output_data_a[k]};
dff_output[1:0]={dff_output[0], input_data[k]};//dff output update
$display("  input/output : %1b/%2b", input_data[k],{output_data_a[k], output_data_b[k]});    end
$display("input_data  : %18b", input_data[17:0]);
$display("output_data : %36b", output_data[35:0]);
$display("bcc(2,1,2) encoder end.\n\n");
rec_data[35:0]= output_data[35:0];//LSB first receive
rec_data[1]=~rec_data[1];//receive error bit
rec_data[20]=~rec_data[20];//receive error bit
$display("rec_data    : %36b", rec_data[35:0]);
$display("viterbi ");
$display("");
current_state[1:0]=2'b00;
next_state[1:0]=2'b00;
path[1:0]=2'b00;
path_record[15:0]=16'h0;
//process every 4 bits(2 paths in grid diagram)
for(k=0;k<32;k=k+4) begin
//add compare select
case(current_state[1:0])
2'b00: begin
temp[3:0]=4'b00_00 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s0s0s0[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];//path is s0-s0-s0
temp[3:0]=4'b00_11 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s0s0s2[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b11_10 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s0s2s1[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b11_01 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s0s2s3[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
if(s0s0s0 < s0s0s2 && s0s0s0 < s0s2s1 && s0s0s0 < s0s2s3) begin
next_state = S0;
path =2'b00;
end
else if(s0s0s2 < s0s0s0 && s0s0s2 < s0s2s1 && s0s0s2 < s0s2s3) begin
next_state = S2;
path =2'b01;
end
else if(s0s2s1 < s0s0s0 && s0s2s1 < s0s0s2 && s0s2s1 < s0s2s3) begin
next_state = S1;
path =2'b10;
end
else begin
next_state = S3;
path =2'b11;
end
end
2'b01: begin
temp[3:0]=4'b11_00 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s1s0s0[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b11_11 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s1s0s2[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b00_10 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s1s2s1[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b00_01 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s1s2s3[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
if(s1s0s0 < s1s0s2 && s1s0s0 < s1s2s1 && s1s0s0 < s1s2s3) begin
next_state = S0;
path =2'b00;
end
else if(s1s0s2 < s1s0s0 && s1s0s2 < s1s2s1 && s1s0s2 < s1s2s3) begin
next_state = S2;
path =2'b01;
end
else if(s1s2s1 < s1s0s0 && s1s2s1 < s1s0s2 && s1s2s1 < s1s2s3) begin
next_state = S1;
path =2'b10;
end
else begin
next_state = S3;
path =2'b11;
end
end
2'b10: begin
decodertemp[3:0]=4'b10_11 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s2s1s0[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b10_00 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s2s1s2[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b01_01 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s2s3s1[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b01_10 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s2s3s3[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
if(s2s1s0 < s2s1s2 && s2s1s0 < s2s3s1 && s2s1s0 < s2s3s3) begin
next_state = S0;
path =2'b00;
end
else if(s2s1s2 < s2s1s0 && s2s1s2 < s2s3s1 && s2s1s2 < s2s3s3) begin
next_state = S2;
path =2'b01;
end
else if(s2s3s1 < s2s1s0 && s2s3s1 < s2s1s2 && s2s3s1 < s2s3s3) begin
next_state = S1;
path =2'b10;
end
else begin
next_state = S3;
path =2'b11;
end
end
2'b11: begin
temp[3:0]=4'b01_11 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s3s1s0[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b01_00 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s3s1s2[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b10_01 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s3s3s1[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];
temp[3:0]=4'b10_10 ^{rec_data[k], rec_data[k+1], rec_data[k+2], rec_data[k+3]};            s3s3s3[2:0]= temp[0]+ temp[1]+ temp[2]+ temp[3];

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。