4.3.2 信道编码 ——卷积码

信道编码是为了保证通信系统的传输可靠性,克服信道中的噪声和干扰而专门设计的一类抗干扰技术和方法。它根据一定的监督规律在待发送的信息码元中(人为的)加入一些必要的监督码元,在接收端利用这些监督码元与信息码元之间的监督规律,发现和纠正差错,以提高信息码元传输的可靠性。

其中,称待发送的码元为信息码元,人为加入的多余码元为监督(或校验)码元。信道编码的目的,是以最少的监督码元为代价,换取最大程度的可靠性提高。

常用的信道编码有线性分组码、循环码、BCH码、RS码和卷积码等。


在IEEE 802.11a中,主要使用了卷积编码,卷积码也是分组的,但它的监督码元不仅与本组的信息元有关,而且还与前若干组的信息元有关。这种码的纠错能力强,不仅可纠正随机差错,而且可纠正突发差错。卷积码根据需要,有不同的结构及相应的纠错能力,但其编码规律都是相同的。

下图以一个约束长度为4、码率 R=1/3 的卷积编码器为例。


IEEE 802.11a协议中规定卷积编码使用的生成多项式 g0 = 133(8进制)和 g1 = 171(8进制),码率为1/2。

注: Signal 域的卷积编码是1/2速率,而Data 域的卷积编码可以根据不同的速率需要进行删余,我们选用的是3/4速率。

摘录《GB 15629.1101-2006》,关于卷积编码器的部分:


也许这样说太空泛了,照例附上代码就清楚到底怎么卷积编码的了。

`timescale 1ns / 10ps
//
// Create Date: 15:37:29 10/08/2014
// Design Name: convolution
// Module Name: conv_encoder
// Project Name: OFDM base on Xilinx KC705
// Description: OFDM 卷积模块,符合IEEE 802.11a 标准,1/2码率卷积输出。
// 生成多项式为g0 = 133[8],g1 = 171[8],码率为1/2。[8]:8进制
// Revision: 1.0
// Copyright: 《基于xlinx FPGA的OFDM通信系统基带设计》
//

module conv_encoder (clk, aclr, data_in, nd, data_out_v, rdy);

input aclr; // 异步复位,低电平有效
input clk; // 60Mhz
input data_in; // 加扰模块输出的数据
input nd; // 输入有效信号
output [1:0] data_out_v;
output rdy;

reg [6:1] shift_reg;
reg [1:0] data_out_v;
reg rdy;

always @ ( negedge aclr or posedge clk )
begin
if ( ! aclr )
begin
shift_reg <= 6'b000000;
data_out_v <= 2'b00;
rdy <= 1'b0 ;
end

else
if ( nd )
begin
data_out_v[0] <= shift_reg[6] + shift_reg[5] + shift_reg[3] + shift_reg[2] + data_in; //数据A多项式:S(x) = x^6 + x^5 + x^3 + x^2 + 1
data_out_v[1] <= shift_reg[6] + shift_reg[3] + shift_reg[2] + shift_reg[1] + data_in; //数据B多项式:S(x) = x^6 + x^3 + x^2 + x + 1
rdy <= 1'b1;
shift_reg <= { shift_reg [5:1], data_in };
end
else
rdy <= 1'b0;

end

endmodule

1/2码率的卷积编码模块,重要的部分是生成表达式:


来说说删余部分,无线通信基带信号处理中,为了提高传输效率,在卷积编码后一般要进行删余(puncture)操作,即周期性的删除一些相对不重要的数据比特,引入了删余操作的卷积编码也称做删余卷积码。

在编码进行了删余操作后,需要在译码时进行depuncture,即在译码之前删余比特位置加以填充。

删余编码规则:

R = 3/4

R = 2/3


本工程采用的是signal域 1/2卷积编码,data域 3/4编码,所以整体为多速率的卷积编码,可以有速率选择。

模块结构框图:

模块有二个时钟,一个是输入时钟,一个是输出时钟(按照所得速率不同而不同)。

signal域,输入时钟(20M),输出时钟(40M)。

data域, 输入时钟(60M),输出时钟(80M)。

模块思想是:首先生成1/2码率的卷积码,然后缓存起来,根据不同的速率要求,给予不同的输出方式。

verilog代码:

`timescale 1ns / 10ps
//
// Create Date: 15:57:29 10/08/2014
// Design Name: convolution
// Module Name: data_conv_encoder
// Project Name: OFDM base on Xilinx KC705
// Description: OFDM 卷积模块,符合IEEE 802.11a 标准,多码率卷积输出。本工程输出是1/2和3/4码率。
// 3/4码率由1/2码率删余处理得到。
// Revision: 1.0
// Copyright: 《基于xlinx FPGA的OFDM通信系统基带设计》
//

module data_conv_encoder (DCONV_DIN, DCONV_ND, RATE_CON, DCONV_RST, DCONV_CLK_I,
DCONV_CLK_O, DCONV_DOUT, DCONV_INDEX, DCONV_RDY);

input DCONV_DIN; // 输入数据
input DCONV_ND; // 输入有效信号
input [3:0] RATE_CON; // 由Signal域得到的编码速率,决定截断方式
input DCONV_RST; // 复位信号,低电平有效
input DCONV_CLK_I; // 卷积码输入时钟(60Mhz)
input DCONV_CLK_O; // 卷积码输出时钟,根据截断方式不同,分别为输入时钟的3/4倍或2/3倍。(这里是80Mhz,数据的4/3倍)
output DCONV_DOUT; // 输出数据
output [8:0] DCONV_INDEX; // 输出数据计数
output DCONV_RDY; // 输出数据有效信号

wire [1:0] DATA_OUT_V;
wire RDY;
reg BUF_RDY;
reg [1:0] i;
reg [2:0] j;
reg [1:0] Puncture_BUF_12;
reg [5:0] Puncture_BUF_34;
reg [3:0] Puncture_BUF_23;
reg [9:0] INDEX_TEMP;
reg DCONV_DOUT;
reg [8:0] DCONV_INDEX;
reg DCONV_RDY;

conv_encoder conv_base(
.data_in(DCONV_DIN),
.nd(DCONV_ND),
.clk(DCONV_CLK_I),
.aclr(DCONV_RST), // 异步复位,低电平有效
.data_out_v(DATA_OUT_V),
.rdy(RDY)
);

always @ ( negedge DCONV_RST or posedge DCONV_CLK_I ) // 将产生的卷积数据存入buff中
begin
if(!DCONV_RST)
begin
Puncture_BUF_12 <= 2'd0;
Puncture_BUF_34 <= 6'd0;
Puncture_BUF_23 <= 4'd0;
i <= 2'd0;
end

else
begin
if(RDY)
case(RATE_CON)
4'b1101,4'b0101,4'b1001: // Rate is 1/2 .
begin
Puncture_BUF_12 <= DATA_OUT_V;
BUF_RDY <= 1;
end

4'b1111,4'b0111,4'b1011,4'b0011: // Rate is 3/4 .
begin
case(i)
2'b00:
begin
Puncture_BUF_34 [1:0] <= DATA_OUT_V;
BUF_RDY <= 1;
i <= i + 2'd1;
end
2'b01:
begin
Puncture_BUF_34 [3:2] <= DATA_OUT_V;
BUF_RDY <= 1;
i <= i + 2'd1;
end
2'b10:
begin
Puncture_BUF_34 [5:4] <= DATA_OUT_V;
BUF_RDY <= 1;
i <= 2'd0;
end
default:
begin
Puncture_BUF_34 <= 6'd0;
BUF_RDY <= 0;
i <= 2'd0;
end
endcase
end

4'b0001: // Rate is 2/3 .
begin
case(i)
2'b00:
begin
Puncture_BUF_23 [1:0] <= DATA_OUT_V;
BUF_RDY <= 1;
i <= i + 2'd1;
end
2'b01:
begin
Puncture_BUF_23 [3:2] <= DATA_OUT_V;
BUF_RDY <= 1;
i <= 2'd0 ;
end
default:
begin
Puncture_BUF_23 <= 4'd0;
BUF_RDY <= 0;
i <= 2'd0 ;
end
endcase
end
endcase
else
begin
BUF_RDY <= 0;
Puncture_BUF_12 <= 2'd0;
Puncture_BUF_34 <= 6'd0;
Puncture_BUF_23 <= 4'd0;
i <= 2'd0;
end
end
end

always @ ( negedge DCONV_RST or posedge DCONV_CLK_O ) // 删余,即从buff中取对应的数据输出
begin
if(!DCONV_RST)
begin
DCONV_DOUT <= 0 ;
DCONV_RDY <= 0;
j <= 3'b000;
end

else
begin
if(BUF_RDY)
case(RATE_CON)
4'b1101,4'b0101,4'b1001: // Rate is 1/2 .
begin
case(j)
3'b000:
begin
DCONV_DOUT <= Puncture_BUF_12 [j] ;
DCONV_RDY <= 1;
j <= j +1 ;
end
3'b001:
begin
DCONV_DOUT <= Puncture_BUF_12 [j] ;
DCONV_RDY <= 1;
j <= 3'b000 ;
end
default:
begin
DCONV_DOUT <= 0 ;
DCONV_RDY <= 0;
j <= 3'b000 ;
end
endcase
end

4'b1111,4'b0111,4'b1011,4'b0011: // Rate is 3/4 .
begin
case(j)
3'b000,3'b001,3'b010:
begin
DCONV_DOUT <= Puncture_BUF_34 [j] ;
DCONV_RDY <= 1;
j <= j + 1 ;
end
3'b011:
begin
DCONV_DOUT <= Puncture_BUF_34 [j+2] ;
DCONV_RDY <= 1;
j <= 3'b000 ;
end
default:
begin
DCONV_DOUT <= 0;
DCONV_RDY <= 0;
j <= 0;
end
endcase
end

4'b0001: // Rate is 2/3 .
begin
case(j)
3'b000,3'b001:
begin
DCONV_DOUT <= Puncture_BUF_23 [j] ;
DCONV_RDY <= 1;
j <= j + 1 ;
end
3'b010:
begin
DCONV_DOUT <= Puncture_BUF_23 [j] ;
DCONV_RDY <= 1;
j <= 3'b000 ;
end
default:
begin
DCONV_DOUT <= 0 ;
DCONV_RDY <= 0 ;
j <= 0 ;
end
endcase
end
endcase
else
begin
DCONV_DOUT <= 0 ;
DCONV_RDY <= 0 ;
end
end
end

always @ ( negedge DCONV_RST or posedge DCONV_CLK_O ) // 有效数据的个数
begin
if(!DCONV_RST)
begin
DCONV_INDEX <= 0 ;
INDEX_TEMP <= 0;
end
else
begin
if(BUF_RDY)
case(RATE_CON)
4'b1101,4'b1111:
begin
if(INDEX_TEMP < 47)
begin
INDEX_TEMP <= INDEX_TEMP + 1 ;
DCONV_INDEX <= INDEX_TEMP ;
end
else
begin
INDEX_TEMP <= 0 ;
DCONV_INDEX <= INDEX_TEMP ;
end
end
4'b0101,4'b0111:
begin
if(INDEX_TEMP < 95)
begin
INDEX_TEMP <= INDEX_TEMP + 1 ;
DCONV_INDEX <= INDEX_TEMP ;
end
else
begin
INDEX_TEMP <= 0 ;
DCONV_INDEX <= INDEX_TEMP ;
end
end
4'b1001,4'b1011:
begin
if(INDEX_TEMP < 191)
begin
INDEX_TEMP <= INDEX_TEMP + 1 ;
DCONV_INDEX <= INDEX_TEMP ;
end
else
begin
INDEX_TEMP <= 0 ;
DCONV_INDEX <= INDEX_TEMP ;
end
end
4'b0001,4'b0011:
begin
if(INDEX_TEMP < 287)
begin
INDEX_TEMP <= INDEX_TEMP + 1 ;
DCONV_INDEX <= INDEX_TEMP ;
end
else
begin
INDEX_TEMP <= 0 ;
DCONV_INDEX <= INDEX_TEMP ;
end
end
endcase
else
DCONV_INDEX <= 0 ;
end
end

endmodule

4.3.2 信道编码 ——卷积码相关推荐

  1. 信道编码-卷积码、QC-LDPC码

    转载为下次阅读方便,若有侵权立删. 目录 1.卷积码(Convolutional Code) 1.1 卷积码简介 1.2 卷积码表示方法 1.2.1 生成多项式 1.2.2 状态图 1.2.3 网格图 ...

  2. MATLAB与FPGA数字信号处理(数字滤波器设计)、数字IC、无线通信、图像处理、信道编码系列

    FPCA.数字IC笔试题系列 不容错过的FPGA/数字IC秋招笔试面试汇总帖(2022届) 1. FPGA.数字IC系列(1)--乐鑫科技2021数字IC提前批笔试 2. FPGA.数字IC系列(2) ...

  3. UICC,USIM卡与SIM的区别

    USIM卡与SIM的区别 SIM卡(Subscriber Identity Module) ,即用户识别卡,是全球通数字移动电话的一张个人资料卡.它采用A 级加密方法制作,存储着用户的数据.鉴权方法及 ...

  4. USIM卡与SIM的区别

    最近在研究android读取SIM联系人的东东,结果越看越深.怎奈自己才疏学浅,还是想巩固下基础吧! 关于USIM卡和SIM卡,在android系统读取卡信息时加以区分,这里有必要对这些知识加以梳理. ...

  5. cdma特有效应_CDMA原理部分考试题(含答案).doc

    一.填空题:(30分,每题2分) 1.CDMA系统的前向信道有_导频信道 , 同步信道, 寻呼信道,前向业务信道.反向信道有 接入信道, 反向业务信道. 2.功控的主要目的是降低干扰,克服远近效应,既 ...

  6. 第一章:数字移动通信基础知识

    1.移动通信的发展 1.1.移动通信的定义 现代社会是信息的社会,而信息的转输需要进行大量的通信.由于人们对通信的要求越来越高,任何时间.任何地点.向任何个人提供快速可靠的通信服务已成为未来通信的目标 ...

  7. Python Commpy简介

    简介 Commpy 是python的一个开源库,使用了NumPy.SciPy和Matplotlib库,用于实现数字通信,类似于Matlab的comm库. 实现功能 下边列出了支持的feature, 信 ...

  8. WCDMA基本概念总结

    Reference: http://www.mscbsc.com/bbs/thread-202970-1-1.html 概念 解释 UMTS频段划分 FDD 上行:1920-1980MHz:下行:21 ...

  9. 信道编码:分组码和卷积码

    分组码和卷积码是前向纠错(FEC)中常用的两种码型代码类型允许通过不可靠的连接发送消息,当消息到达时仍然可以破译. 分组编码(Block Coding) 卷积编码(Convolutional Codi ...

  10. 信道编码之差错控制方式

    信道编码的作用,形象的说就是给信号穿上防护服,也就是说信道编码能提高系统传输的可靠性,降低数据通信的误比特率. 如何进行信道编码呢?先不着急,看看几种差错控制方式吧. 在通信系统中,差错控制方法有自动 ...

最新文章

  1. 【Ubuntu】解决ubuntu系统root用户下Chrome无法启动问题
  2. 7 成中国职场人厌班,我们为什么会陷入职业倦怠?
  3. Spring Boot系列四 Spring @Value 属性注入使用总结一
  4. emplace与insert
  5. 诺基亚首款Windows Phone智能手机将在年内推出
  6. 计算机通信网络面试题,【算法通信面试题】面试问题:计算机网络(七… - 看准网...
  7. android audio arch
  8. 【推荐系统】推荐系统中的图网络模型
  9. 在GRIDVIEW中合并单元格
  10. android runtime异常,在做android下拉刷新时遇到异常java.lang.RuntimeException: Can't create handle...
  11. 常见的英文文本处理步骤
  12. 常见的Nginx 502 Bad Gateway解决办法
  13. X-XSS-Protection
  14. 【PHP渗透技巧拓展】————3、LFI、RFI、PHP封装协议安全问题学习
  15. 当你用STMS传输请求时,那些选项都是啥意思
  16. 带你走进微处理架构的世界
  17. 研报网站waitu.com介绍
  18. 从零开始···AMQ主题模式实现
  19. 你为什么离职——面试常见问题解析
  20. 在线计算机扫描软件,Virscan Uploader

热门文章

  1. matlab申明数值型的符号常量,实验四 MATLAB符号运算
  2. 数据可视化大屏真不是个事,这 30 个精美的模板拿走吧
  3. 使用阿里云发送短信验证码教程(简单易学)
  4. 计算机文件不能复制到u盘,大文件无法复制到u盘里解决方法
  5. 怎么彻底卸载cad2017_彻底卸载cad2010的方法步骤
  6. 调用服务器直接打印文件,使用 LP 打印命令设置直接连接的打印机
  7. matlab 汽车 仿真,MATLAB编程与汽车仿真应用
  8. [网站设计] 素材网罗
  9. 人工智能时代的投影融合软件
  10. vue 点击图片放大预览