女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

卷積碼編碼及譯碼實驗 淺談卷積編碼下的FPGA實現

ss ? 作者:工程師譚軍 ? 2018-08-21 10:26 ? 次閱讀

卷積編碼是現代數字通信系統中常見的一種前向糾錯碼,區別于常規的線性分組碼,卷積編碼的碼字輸出不僅與當前時刻的信息符號輸入有關,還與之前輸入的信息符號有關。

本文主要是關于卷積碼編碼及譯碼實驗的相關介紹,并著重分析闡述了基于卷積編碼下的FPGA實現。

卷積編碼

卷積碼的編碼分為兩類:前饋和反饋,在每類中又可分為系統和非系統形式。我們這里只考慮非系統形式的前饋編碼器。‘

卷積碼編碼及譯碼實驗 淺談卷積編碼下的FPGA實現

上圖是WLAN 802.11a協議中采用的卷積編碼器結構,輸入比特k=1,輸出n=2,存儲器長度m=6,編碼輸出不僅與當前輸入有關,還與存儲器存儲的之前的輸入數據有關,具體由之前的哪些數據得到編碼輸出呢,由生成多項式確定其連接關系。這里,生成多項式為g0=133(八進制)和g1=171(八進制)(右邊是最高位),輸出數據A的生成多項式為:

輸出數據B的生成多項式為:

生成多項式確定了卷積編碼器輸出的連接關系。根據多項式的系數,在相應項進行連接。生成多項式寫成二進制序列的形式分別為:g0 = [1 0 1 1 0 1 1]和g1 = [1 1 1 1 0 0 1](右邊是最高位)。我們假設信息序列u,兩個編碼器輸出序列分別為v(0)和v(1),編碼器可以看成一個線性系統,系統的信道響應脈沖最多持續m+1個時間單元,編碼輸出可以寫成編碼輸入與信道脈沖響應的卷積(即生成多項式),即

其中需要注意的是,所有的加法都是模2加運算。

卷積碼編碼及譯碼實驗

基本原理

1、卷積碼編碼

卷積碼是一種糾錯編碼,它將輸入的k個信息比特編成n個比特輸出,特別適合以串行形式進行傳輸,時延小。卷積碼編碼器的形式如圖17-1所示,它包括:一個由N段組成的輸入移位寄存器,每段有k段,共Nk個寄存器;一組n個模2和相加器;一個由n級組成的輸出移位寄存器,對應于每段k個比特的輸入序列,輸出n個比特。

卷積碼編碼及譯碼實驗 淺談卷積編碼下的FPGA實現

由圖17-1可以看到,n個輸出比特不僅與當前的k個輸入信息有關,還與前(N-1)k個信息有關。通常將N稱為約束長度(有的書中也把約束長度定為nN或N-1)。常把卷積碼

記為:(n 、k 、N ),當k =1時,N -1就是寄存器的個數。編碼效率定義為:

/c R k n = (17-1) 卷積碼的表示方法有圖解表示法和解析表示法兩種:解析法,它可以用數學公式直接表達,包括離散卷積法、生成矩陣法、碼生成多項式法;圖解表示法,包括樹狀圖、網絡圖和狀態圖(最的圖形表達形式)三種。一般情況下,解析表示法比較適合于描述編碼過程,而圖形法比較適合于描述譯碼。

(1)圖解表示法

(2)解析法

下面以(2,1,3)卷積編碼器為例詳細講述卷積碼的產生原理和表示方法。(2,1,3)卷積碼的約束長度為3,編碼速率為1/2,編碼器的結構如圖17-2所示。

j

j

圖17-2 (2,1,3)卷積編碼器

這里我們主要介紹碼多項式法。我們可以用多項式來表示輸入序列、輸出序列、編碼器中移位寄存器與模2和的連接關系。

為了簡化,仍以上述(2,1,3)卷積碼為例,例如輸入序列1011100…可表示為 ()2341M x x x x =++++ (17-2) 在一般情況下,輸入序列可表示為

()231234M x m m x m x m x =++++ (17-3) 這里m 1,m 2,m 3,m 4…為二進制表示(1或0)的輸入序列。x 稱為移位算子或延遲算子,它標志著位置狀況。

我們可以用多項式表示移位寄存器各級與模2加的連接關系。若某級寄存器與模2加相連接,則相應多項式項的系數為1;反之,無連接線時的相應多項式項系數為0,以圖17-2編碼器為例,相應的生成多項式為

()()212211g x x x g x x =++???=+?? (17-4)

利用生成多項式與輸入序列多項式相乘,可以產生輸出序列多項式,即得到輸出序列。

()()()()()

234211234345245646

1111P x M x g x x x x x x x x x x x x x x x x x x x x ==+++++=+++++++++++=+++

(17-5)

()()()

()()2234211P x M x g x x x x x ==++++ (17-6)

對應的碼組為

()()

()()()()461135622121110010111001011,11,10,00,01,10,01,11P x x x x p P x x x x p P p p =+++?==+++?===

(17-7)

2、卷積碼譯碼

卷積碼的譯碼方法有兩類:一類是大數邏輯譯碼,又稱門限譯碼;另一類是概率譯碼,概率譯碼又能分為維特比譯碼和序列譯碼兩種。門限譯碼方法是以分組理論為基礎的,其譯碼設備簡單,速度快,但其誤碼性能要比概率譯碼法差。這里我們主要介紹維特比譯碼。

維特比(Viterbi )譯碼和序列譯碼都屬于概率譯碼。當卷積碼的約束長度不太大時,與序列譯碼相比,維特比譯碼器比較簡單,計算速度更快。維特比譯碼算法,以后簡稱VB 算法。

采用概率譯碼的一種基本想法是:把已接收序列與所有可能的發送序列做比較,選擇其中碼距最小的一個序列做為發送序列。如果發送L 組信息比特對于(,)n k 卷積碼來說,可能發送的序列有2kL 個,計算機或譯碼器需存儲這些序列并進行比較,以找到碼距最小的那個序列。當傳信率和信息組數L 較大時,使得譯碼器難以實現。VB 算法則對上述概率譯碼(又稱最大似然解碼)做了簡化,以至成為了一種實用化的概率算法。它并不是在網格圖上一次比較所有可能的2kL 條路徑(序列),而是接收一段,計算和比較一段,選擇一段有最大似然可能的碼段,從而達到整個碼序列是一個有最大似然值的序列。

下面將用圖17-2的(2,1,3)卷積碼編碼器所編出的碼為例,來說明維特比解碼的方法和運作過程。為了能說明解碼過程,這里給出該碼的狀態圖,如圖17-5所示。維特比譯碼需要利用圖來說明譯碼過程。根據前面的畫網格的例子,讀者可檢驗和畫個該碼網格圖如圖17-4所示。該圖設輸入信息數目L=5,所以畫有L+N=8個時間單位(節點)。這里設編碼器從a 狀態開始運作。該網格圖的每一條路徑都對應著不同的輸入信息序列。由于所有的可能輸入信息序列共有2kL 個,因而網格圖中所有可能路徑也有2kL 條。這里節

a=00,b=01,c=10,d=11。

設輸入編碼器的信息序列為(1 1 0 1 1 0 0 0 ),則由編碼器輸出的序列Y=(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 ),編碼器的狀態轉移路線為abcdbdca。若收到的序列R=(0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0 ),對照網格圖來說明維特比譯碼的方法。

由于該卷積碼的約束長度為6位,因此先選擇接收序列的前6位序列

R=(0 1 0 1 0 1)

1

同到達第3時刻可能的8個碼序列(即8條路徑)進行比較,并計算出碼距。該例中到達第3時刻a點的路徑序列是(0 0 0 0 0 0)和(1 1 1 0 1 1 ),它們與

R的距離分別是3和4;到

1

達第3時刻b點的路徑序列是(0 0 0 0 1 1)和(1 1 1 0 0 0),它們與

R的距離分別是3和4,

1

到達第3時刻c點的路徑序列是(0 0 1 1 1 0)和(1 1 0 1 1 0),與

R的距離分別是4和1;

1

到達第3時刻d點的路徑序列是(0 0 1 1 0 1)和(1 1 0 1 1 0),與

R的距離分別是2和3。

1

上述每個節點都保留碼距較小的路徑為幸存路徑,所以幸存路徑碼序列是(0 0 0 0 0 0)、(0 0 0 0 1 1)、(1 1 0 1 0 1)和(0 0 1 1 0 1),如圖17-6(a)所示。用與上面類同的方法可以得到第4、5、6、7時刻的幸存路徑。需指出對于某一個節點而言比較兩條路徑與接收序列的累計碼距時,若發生兩個碼距值相等,則可以任選一路徑作為幸存路徑,此時不會影響最終的譯碼結果。圖17-6(b)給出了第5時刻的幸存路徑,讀者可自行驗證。在碼的終了時刻a狀態,得到一根幸存路徑,如圖17-6(c)所示。由此看到譯碼器輸出是‘R=(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0),即可變換成序列(1 1 0 1 1 0 0 0),恢復了發端原始信息。比較’R和R序列,可以看到在譯碼過程中己糾正了在碼序列第1和第7位上的差錯。當然,差錯出現太頻繁,以至超出卷積碼的糾錯能力,則會發生誤糾,這是不希望的。

FPGA實現

這里,采用verilog語言對編碼過程進行描述。通過狀態機控制編碼的過程,設置有三種狀態:IDLE,ENCODING,CLEAR。通常卷積編碼以數據塊為單元,逐塊進行編碼的。當待編碼的數據塊未到達編碼單元時,狀態機處于IDLE態,即空閑狀態,不做任何處理。當數據塊到來時,存在一個觸發信號,讓狀態機開始進入ENCODING狀態,即編碼狀態,編碼狀態持續的時間為輸入的數據塊的長度。此外,狀態機還設置有CLEAR態,因為在卷積編碼中,還有尾比特需要輸出,這時輸入看做全0輸入,存儲器逐漸清空,持續時間為尾比特的長度。這一步完成后,狀態機重新回到IDLE態,等待下一個數據塊的到來。代碼如下:

conv_encoder(

input clk,

input rst_n,

input e_start_i, //數據起始信號,比數據uncoded_bits第一個符號早一個時鐘,作為編碼狀態機的啟動信號

input uncoded_bits,

output reg e_start_o,

output reg [1:0] coded_bits

);

% 常量定義

parameter UNCODED_BLOCK_LEN = 100; //未編碼的數據塊長度

parameter CODED_BLOCK_LEN = 106; //編碼后的單路數據塊長度

% 狀態機定義

parameter IDLE = 3‘b001;

parameter ENCODING = 3’b010;

parameter CLEAR = 3‘b100;

reg [2:0] state;

//

reg [7:0] datain_cnt;

reg [5:0] shift_reg;

//

wire encoder_clear_start;

wire encoder_end;

wire encoder_enable;

assign encoder_clear_start = (datain_cnt == UNCODED_BLOCK_LEN -1);

assign encoder_end = (datain_cnt == CODED_BLOCK_LEN -1);

assign encoder_enable = (state != IDLE);

/*********************************************************************/

// 卷積編碼狀態機

/*********************************************************************/

always @(posedge clk)

begin

if(!rst_n)

state 《= IDLE;

else begin

case(state)

IDLE: state 《= e_start_i ? ENCODING : IDLE;

ENCODING: state 《= encoder_clear_start ? CLEAR : ENCODING;

CLEAR: state 《= encoder_end ? IDLE : CLEAR;

default: state 《= IDLE;

endcase

end

end

/*********************************************************************/

// 符號計數器

/*********************************************************************/

always @(posedge clk)

begin

if(!rst_n)

datain_cnt 《= 8’d0;

else

datain_cnt 《= encoder_enable ? (datain_cnt + 1‘b1) : 8’d0;

end

/*********************************************************************/

// 移位寄存器更新

/*********************************************************************/

always @(posedge clk)

begin

if(!rst_n)

shift_reg 《= 6‘d0;

else

shift_reg 《= encoder_enable ? {shift_reg[4:0], uncoded_bits} : 6’d0;

end

/*********************************************************************/

// 編碼結果輸出

/*********************************************************************/

always @(posedge clk)

begin

if(!rst_n)

coded_bits 《= 2‘d0;

else begin

case(state)

IDLE:

coded_bits 《= 2’d0;

CODING:

begin

coded_bits[0] 《= shift_reg[5] ^ shift_reg[4] ^ shift_reg[2] ^ shift_reg[1] ^ uncoded_bits;

coded_bits[1] 《= shift_reg[5] ^ shift_reg[2] ^ shift_reg[1] ^ shift_reg[0] ^uncoded_bits;

end

CLEAR:

begin

coded_bits[0] 《= shift_reg[5] ^ shift_reg[4] ^ shift_reg[2] ^ shift_reg[1];

coded_bits[1] 《= shift_reg[5] ^ shift_reg[2] ^ shift_reg[1] ^ shift_reg[0];

end

default:

coded_bits 《= 2‘d0;

endcase

end

end

/*********************************************************************/

// 啟動信號輸出

/*********************************************************************/

always @(posedge clk_fpga)

begin

if(!rst_n)

e_start_o 《= 1’b0;

else begin

e_start_o 《= e_start_i;

end

end

結語

關于卷積碼編碼及譯碼實驗的相關介紹就到這了,如有不足之處歡迎指正。

相關閱讀推薦:什么是卷積碼

相關閱讀推薦:卷積編碼是什么

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

    關注

    1643

    文章

    21954

    瀏覽量

    613910
  • 卷積編碼
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2750
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    卷積碼的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 ?2332次閱讀

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

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

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

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

    基于VHDL的卷積編碼實現 詳解卷積編碼的應用

    在信道編碼研究的初期,人們探索、研究出各種各樣的編碼構造方法,其中包括卷積碼
    的頭像 發表于 08-20 16:58 ?5750次閱讀
    基于VHDL的<b class='flag-5'>卷積</b><b class='flag-5'>編碼</b><b class='flag-5'>實現</b> 詳解<b class='flag-5'>卷積</b><b class='flag-5'>編碼</b>的應用

    基于C語言的卷積編碼實現 淺談卷積和濾波之區別

    在信道編碼研究的初期,人們探索、研究出各種各樣的編碼構造方法,其中包括卷積碼
    發表于 08-21 08:31 ?3469次閱讀

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

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

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

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

    分組卷積碼的區別 詳解分組卷積碼

    卷積碼是1955年由Elias等人提出的,是一種非常有前途的編碼方法。
    發表于 08-21 11:07 ?3.1w次閱讀
    分組<b class='flag-5'>碼</b>和<b class='flag-5'>卷積碼</b>的區別 詳解分組<b class='flag-5'>碼</b>和<b class='flag-5'>卷積碼</b>

    FPGA實現咬尾卷積碼的最優算法設計

    自1955年Elias發明卷積碼以來,卷積碼作為一種高效的信道編碼已被用在許多現代通信系統中。卷積碼分為零比特卷積碼(Zero Tail C
    的頭像 發表于 05-03 09:00 ?5462次閱讀
    在<b class='flag-5'>FPGA</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>的原理、性能與仿真分析

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

    卷積碼是一種信道糾錯編碼,在通信中具有廣泛的應用。在發送端根據生成多項式進行卷積碼編碼,在接收端根據維特比(Viterbi)譯碼算法進行
    的頭像 發表于 04-28 15:02 ?1.4w次閱讀