在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

卷積碼編碼及譯碼算法的基本原理

FPGA設計論壇 ? 來源:CSDN技術社區 ? 作者: whustxsk ? 2022-04-28 15:02 ? 次閱讀

引言

卷積碼是一種信道糾錯編碼,在通信中具有廣泛的應用。在發送端根據生成多項式進行卷積碼編碼,在接收端根據維特比(Viterbi)譯碼算法進行譯碼,能夠有效抵抗信道噪聲的影響,在誤碼率門限之下可以對傳輸過程中發生的突發錯誤進行糾錯。

1、編碼及譯碼算法的基本原理

卷積碼編碼

卷積碼是一種糾錯編碼,它將輸入的k個信息比特編成n個比特輸出,特別適合以串行形式進行傳輸,時延小。卷積碼編碼器的一般形式如下圖所示。

85aff190-c6c0-11ec-bce3-dac502259ad0.png

如下圖所示為k=1時的編碼框圖,k=1也是最常用的一種編碼器情形:

85bef1e0-c6c0-11ec-bce3-dac502259ad0.png

譯碼算法

卷積碼的譯碼方法有兩類:一類是大數邏輯譯碼,又稱門限譯碼;另一類是概率譯碼,概率譯碼又能分為維特比譯碼和序列譯碼兩種。維特比(Viterbi)譯碼和序列譯碼都屬于概率譯碼。當卷積碼的約束長度不太大時,與序列譯碼相比,維特比譯碼器比較簡單,計算速度更快。接下來的譯碼算法采用的是概率譯碼中的維特比譯碼。采用概率譯碼的一種基本想法是:把已接收序列與所有可能的發送序列做比較,選擇其中漢明碼距最小的一個序列做為發送序列。

編碼及譯碼算法的Matlab實現

根據如上所述的編譯碼基本原理,我們可以在Matlab中進行很方便的仿真,Matlab提供了集成化的函數可供調用,進行仿真,如下所示:

85dd6198-c6c0-11ec-bce3-dac502259ad0.png

2、編碼算法的FPGA實現

根據卷積碼編碼的基本原理 ,我們可以根據相應的生成多項式來進行Verilog編碼,從而可以很方便的實現卷積碼編碼的FPGA實現:

頂層代碼

module convenc(

//system signals

inputclk,

inputrst_n,

inputdata_in,

outputreg [1:0] data_out

);

reg [6:0] conv_reg;

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

conv_reg <= 7'd0;

end

else begin

conv_reg <= {data_in,conv_reg[6:1]};

end

end

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

data_out <= 2'd0;

end

else begin

data_out[1] <= conv_reg[6]^conv_reg[5]^conv_reg[4]^conv_reg[3]^conv_reg[0];//o171

data_out[0] <= conv_reg[6]^conv_reg[4]^conv_reg[3]^conv_reg[1]^conv_reg[0];//o133

end

end

endmodule

測試代碼

`timescale 1ns/1ps;

module tb();

reg clk;

reg rst_n;

reg data_in;

wire [1:0] data_out;

reg bits[255:0];

integer out_file;

integer i;

convenc demo(

.clk(clk),

.rst_n(rst_n),

.data_in(data_in),

.data_out(data_out)

);

initial

begin

clk = 1'b1;

rst_n = 1'b1;

#5 rst_n = 1'b0;

#5 rst_n =1'b1;

$readmemb("F:/FPGA_DSP/Viterbi/bits.txt",bits);

out_file = $fopen("F:/FPGA_DSP/Viterbi/result.txt","w");//獲取文件句柄

for(i = 0; i <= 255; i = i + 1)begin

data_in = bits[i];

#10;

$fwrite(out_file,"%b %b ",data_out[1],data_out[0]);

end

end

always #5 clk = ~clk;

endmodule

仿真結果

85f121f6-c6c0-11ec-bce3-dac502259ad0.png

3、維特比譯碼(Viterbi)算法的FPGA實現

維特比譯碼(Viterbi)算法在數學原理上是比較復雜的,從理解算法到實現需要做大量的工作,但是Xilinx的Vivado工具給我們提供了Viterbi decoder IP核,我們可以很方便地調用這個IP核進行算法的FPGA實現和落地。

Viterbi decoder IP核輸入輸出數據格式

Viterbi decoder IP核的接口是基于AXI-Stream協議的,在之前的文章中已經有提及AXI-Stream協議的握手過程,如果有不懂的可以去看前面的文章,下面主要介紹一下該IP和輸入輸出數據的基本格式組成:

輸入數據:

當IP核作為接收輸入數據的時候,扮演的是從機的角色,輸入數據的格式如下圖所示,下圖對應的是編碼速率為2的情況。如果編碼速率為N,那么數據的位寬相應為N*8。

860bc88a-c6c0-11ec-bce3-dac502259ad0.png

861bceb0-c6c0-11ec-bce3-dac502259ad0.png

當IP核配置為硬判決時,輸入數據位寬為1,其余位用0補齊, 當IP核配置為軟判決時,輸入數據位寬為3-5,其余位用0補齊,DATA_IN1對應高位,DATA_IN0對應低位。

輸出數據:

IP核的譯碼輸出數據總是1位,格式如下圖所示。

8633d780-c6c0-11ec-bce3-dac502259ad0.png

最低位為譯碼數據,其他數據可以不做深入了解。

另外除了待譯碼數據的輸入端口和譯碼數據輸出端口外,該IP核還可以進行誤碼率(BER)的計算,其余端口位誤碼率計算配置端口和結果輸出端口,具體詳情請參考官方手冊pg027。

IP核生成流程

Vivado軟件為我們提供了Viterbi譯碼IP核,可以進行圖形化配置然后進行調用和使用,配置參數要與編碼過程中的相關參數嚴格對應,具體過程如下所示:

86524404-c6c0-11ec-bce3-dac502259ad0.png

8672cb02-c6c0-11ec-bce3-dac502259ad0.png

868c6e04-c6c0-11ec-bce3-dac502259ad0.png

86a630dc-c6c0-11ec-bce3-dac502259ad0.png

86c0c60e-c6c0-11ec-bce3-dac502259ad0.png

在圖形化配置IP核完成后,我們提取相應的網表文件在Modelsim環境下進行了仿真,如何在Modelsim環境下仿真Vivado IP核我們在前面也有提及,如有不懂的也可翻閱前面的文章進行學習,相關測試程序如下。

`timescale 1 ns / 1 ps

module dec_tb ();

glbl glbl();

reg aclk;

reg aresetn;

reg [15:0]s_axis_data_tdata;

reg s_axis_data_tvalid;

wire s_axis_data_tready;

wire [7:0]m_axis_data_tdata;

wire m_axis_data_tvalid;

reg m_axis_data_tready;

reg [15:0] s_axis_dstat_tdata;

reg s_axis_dstat_tvalid;

wire s_axis_dstat_tready;

wire [15:0]m_axis_dstat_tdata;

wire m_axis_dstat_tvalid;

reg m_axis_dstat_tready;

reg codeData[511:0];

reg [9:0]i;

reg [9:0]j;

integer out_file;

initial begin

aclk = 1'b1;

aresetn = 1'b1;

#5 aresetn = 1'b0;

#5 aresetn = 1'b1;

$readmemb("F:/FPGA_DSP/Viterbi/codeData.txt",codeData);

out_file = $fopen("F:/FPGA_DSP/Viterbi/decodeData.txt","w");//獲取文件句柄

end

always #5 aclk = ~aclk;

//送數據

always @(posedge aclk or negedge aresetn) begin

if (!aresetn) begin

s_axis_data_tvalid <= 1'b0;

s_axis_data_tdata <= 16'd0;

i <= 9'd0;

j <= 9'd1;

end

else if (s_axis_data_tready) begin

if(i <= 9'd510)begin

s_axis_data_tvalid <= 1'b1;

s_axis_data_tdata <= {7'd0,codeData[j],7'd0,codeData[i]};

i <= i + 2;

j <= j + 2;

end

else

s_axis_data_tvalid <= 1'b0;

end

end

//取數據

always @(posedge aclk or negedge aresetn) begin

if (!aresetn) begin

m_axis_data_tready <= 1'b1;

end

else if (m_axis_data_tvalid) begin

$fwrite(out_file,"%b ",m_axis_data_tdata[0]);

end

end

//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG

viterbi_0 your_instance_name (

.aclk(aclk), // input wire aclk

.aresetn(aresetn), // input wire aresetn

//接收數據時為從設備

.s_axis_data_tdata(s_axis_data_tdata), // input wire [15 : 0] s_axis_data_tdata

.s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid

.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready

//發送數據時為主設備

.m_axis_data_tdata(m_axis_data_tdata), // output wire [7 : 0] m_axis_data_tdata

.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid

.m_axis_data_tready(m_axis_data_tready), // input wire m_axis_data_tready

//BER測量

.s_axis_dstat_tdata(s_axis_dstat_tdata), // input wire [15 : 0] s_axis_dstat_tdata

.s_axis_dstat_tvalid(s_axis_dstat_tvalid), // input wire s_axis_dstat_tvalid

.s_axis_dstat_tready(s_axis_dstat_tready), // output wire s_axis_dstat_tready

.m_axis_dstat_tdata(m_axis_dstat_tdata), // output wire [15 : 0] m_axis_dstat_tdata

.m_axis_dstat_tvalid(m_axis_dstat_tvalid), // output wire m_axis_dstat_tvalid

.m_axis_dstat_tready(m_axis_dstat_tready) // input wire m_axis_dstat_tready

);

endmodule

仿真波形:

86dd00a8-c6c0-11ec-bce3-dac502259ad0.png

原文標題:卷積碼編碼及維特比譯碼(Viterbi)算法的原理及其FPGA實現

文章出處:【微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1629

    文章

    21736

    瀏覽量

    603421
  • 算法
    +關注

    關注

    23

    文章

    4612

    瀏覽量

    92901
  • 卷積碼
    +關注

    關注

    0

    文章

    19

    瀏覽量

    9314

原文標題:卷積碼編碼及維特比譯碼(Viterbi)算法的原理及其FPGA實現

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是卷積碼? 什么是卷積碼的約束長度?

    什么是卷積碼分組是把k 個信息元編成n 個碼元的碼字,每個碼字的n ? k 個校驗位僅與本碼字的k 個信息元有關,而與其他碼字無關。為了達到一定的糾錯能力和編碼效率,分組的碼長一般
    發表于 05-30 16:06

    什么是Turbo 的迭代譯碼算法?當前Turbo譯碼算法有哪些?有哪些形式的Turbo

    BCJR 算法做了一定修正,對 α 和β 作歸一化。對約束長度為N 的卷積碼,每一分量,使似然加法完全變成求最大值運算,則得到MAX-LOG-MAP 算法。它大大降低了存儲量和計算復雜度,而
    發表于 05-30 16:24

    卷積碼的Viterbi高速譯碼方案

    本文探討了無線通信中廣泛涉及的差錯控制問題,介紹了卷積碼的編譯碼原理。提出了一種卷積碼編碼,及其高速Viterbi 譯碼的實現方案,對
    發表于 01-06 15:06 ?13次下載

    卷積碼的Viterbi高速譯碼方案

    本文探討了無線通信中廣泛涉及的差錯控制問題,介紹了卷積碼的編譯碼原理。提出了一種卷積碼編碼,及其高速Viterbi譯碼的實現方案,對
    發表于 07-21 17:20 ?22次下載

    基于OCDMA的新型卷積碼譯碼方案

    對光碼分多址(OCDMA)的誤碼特性和卷積碼進行研究,根據兩者的特點提出了一種新的基于OCDMA多址干擾信道模型的卷積碼譯碼方法。針對這種新型卷積碼
    發表于 08-26 16:40 ?17次下載

    卷積碼/Viterbi譯碼,卷積碼/Viterbi譯碼是什么

    卷積碼/Viterbi譯碼,卷積碼/Viterbi譯碼是什么意思 卷積碼在一個二進制分組(n
    發表于 03-18 14:09 ?2289次閱讀

    卷積碼,卷積碼是什么意思

    卷積碼,卷積碼是什么意思 卷積碼在一個二進制分組(n,k)當中,包含k個信息位,組長度為n,每個
    發表于 03-19 16:46 ?1918次閱讀

    卷積碼,什么是卷積碼

    卷積碼,什么是卷積碼 卷積碼在一個二進制分組(n,k)當中,包含k個信息位,組長度為n,每個
    發表于 04-03 12:11 ?7235次閱讀

    基于FPGA的卷積碼譯碼器的方案

    卷積碼是深度空間通信系統和無線通信系統中常用的一種差錯控制編碼。它克服了分組由于以塊為單位編譯碼而使分組間的相關信息丟失的缺點。(2,1
    發表于 10-12 15:05 ?1674次閱讀
    基于FPGA的<b class='flag-5'>卷積碼</b><b class='flag-5'>譯碼</b>器的方案

    基于Viterbi算法卷積碼性能分析

    本文主要對卷積碼編碼和Viterbi譯碼進行MATLAB實現,并在此基礎上分析移位寄存器對糾錯能力的影響。論文首先根據MATLAB的存儲特點及函數特征,主要介紹卷積
    發表于 01-13 16:56 ?39次下載
    基于Viterbi<b class='flag-5'>算法</b>的<b class='flag-5'>卷積碼</b>性能分析

    卷積碼編碼器怎么畫 淺談卷積碼編碼器設計

    卷積碼擁有良好的糾錯性能,是一種被廣泛應用于移動通信的信道編碼系統。
    的頭像 發表于 08-20 15:30 ?1.4w次閱讀
    <b class='flag-5'>卷積碼</b><b class='flag-5'>編碼</b>器怎么畫 淺談<b class='flag-5'>卷積碼</b><b class='flag-5'>編碼</b>器設計

    卷積編碼之維特比譯碼介紹 淺析卷積碼之應用

    以(n,k,m)來描述卷積碼,其中k為每次輸入到卷積編碼器的bit數,n為每個k元組碼字對應的卷積碼輸出n元組碼字,m為編碼存儲度,也就是
    發表于 08-21 09:56 ?3474次閱讀

    卷積碼編碼譯碼程序仿真程序 卷積碼應用詳解

    卷積碼是一種差錯控制編碼,由P.Elias于1955年發明。因為數據與二進制多項式滑動相關故稱卷積碼
    發表于 08-21 10:34 ?4104次閱讀
    <b class='flag-5'>卷積碼</b><b class='flag-5'>編碼</b><b class='flag-5'>譯碼</b>程序仿真程序 <b class='flag-5'>卷積碼</b>應用詳解

    卷積碼編碼和維特比譯碼的原理、性能與仿真分析

    卷積碼編碼器是由一個有k位輸入、n位輸出,且具有m位移位寄存器構成的有限狀態的有記憶系統,通常稱它為時序網絡。編碼器的整體約束長度為v,是所有k個移位寄存器的長度之和。具有這樣的編碼
    的頭像 發表于 11-14 08:10 ?1.3w次閱讀
    <b class='flag-5'>卷積碼</b><b class='flag-5'>編碼</b>和維特比<b class='flag-5'>譯碼</b>的原理、性能與仿真分析

    在FPGA中基于VB譯碼算法實現HDTV收縮卷積碼的解碼

    在HDTV 地面廣播COFDM系統中,所用內碼為收縮卷積碼,除1/2主碼率外,還有2/3。3/4、5/6、7/8率的卷積編碼。在實際的傳輸信道中,噪聲一般是加性高斯白噪聲(AWGN)
    的頭像 發表于 07-11 08:01 ?3305次閱讀
    在FPGA中基于VB<b class='flag-5'>譯碼</b><b class='flag-5'>算法</b>實現HDTV收縮<b class='flag-5'>卷積碼</b>的解碼
    主站蜘蛛池模板: 天天看黄| 久色tv| 日本边添边爱边摸边做边爱| 五月婷丁香| 欧美激情在线| 亚洲人成伊人成综合网久久| 免费大片黄在线观看日本| 天堂网在线最新版www| 香蕉成人国产精品免费看网站 | 午夜官网| 亚洲国产欧美在线人成aaa | 成人男女啪啪免费观看网站| 四虎影在永久地址在线观看| 国产精品www视频免费看| 成年全黄大色大黄| 亚洲a影院| a免费在线| xxxx性欧美极品另类| 日本黄色影片| 天堂网在线www资源在线| 精品国产污污免费网站入口| 久久精品视频国产| 国产在线观看福利| 特级做a爰片毛片免费看| 又大又粗又爽黄毛片| 性免费视频| 狼狼色丁香久久女婷婷综合| 毛片天天看| 亚洲欧美成人在线| 在线免费看一级片| 日本一区二区不卡视频| 久久99精品一级毛片| 456成人免费高清视频| 日韩在线三级| 秋霞麻豆| 亚1州区2区3区4区产品乱码| 一级美女视频| 国产成人无精品久久久久国语| 天堂成人网| 天天射网| 亚洲a在线观看|