RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

卷積碼編碼及譯碼實驗 淺談卷積編碼下的FPGA實現(xiàn)

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

卷積編碼是現(xiàn)代數(shù)字通信系統(tǒng)中常見的一種前向糾錯碼,區(qū)別于常規(guī)的線性分組碼,卷積編碼的碼字輸出不僅與當(dāng)前時刻的信息符號輸入有關(guān),還與之前輸入的信息符號有關(guān)。

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

卷積編碼

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

卷積碼編碼及譯碼實驗 淺談卷積編碼下的FPGA實現(xiàn)

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

輸出數(shù)據(jù)B的生成多項式為:

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

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

卷積碼編碼及譯碼實驗

基本原理

1、卷積碼編碼

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

卷積碼編碼及譯碼實驗 淺談卷積編碼下的FPGA實現(xiàn)

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

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

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

(1)圖解表示法

(2)解析法

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

j

j

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

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

為了簡化,仍以上述(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…為二進(jìn)制表示(1或0)的輸入序列。x 稱為移位算子或延遲算子,它標(biāo)志著位置狀況。

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

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

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

()()()()()

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)

對應(yīng)的碼組為

()()

()()()()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、卷積碼譯碼

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

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

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

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

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

設(shè)輸入編碼器的信息序列為(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 ),編碼器的狀態(tài)轉(zhuǎn)移路線為abcdbdca。若收到的序列R=(0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0 ),對照網(wǎng)格圖來說明維特比譯碼的方法。

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

R=(0 1 0 1 0 1)

1

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

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

1

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

R的距離分別是3和4,

1

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

R的距離分別是4和1;

1

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

R的距離分別是2和3。

1

上述每個節(jié)點都保留碼距較小的路徑為幸存路徑,所以幸存路徑碼序列是(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時刻的幸存路徑。需指出對于某一個節(jié)點而言比較兩條路徑與接收序列的累計碼距時,若發(fā)生兩個碼距值相等,則可以任選一路徑作為幸存路徑,此時不會影響最終的譯碼結(jié)果。圖17-6(b)給出了第5時刻的幸存路徑,讀者可自行驗證。在碼的終了時刻a狀態(tài),得到一根幸存路徑,如圖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),恢復(fù)了發(fā)端原始信息。比較’R和R序列,可以看到在譯碼過程中己糾正了在碼序列第1和第7位上的差錯。當(dāng)然,差錯出現(xiàn)太頻繁,以至超出卷積碼的糾錯能力,則會發(fā)生誤糾,這是不希望的。

FPGA實現(xiàn)

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

conv_encoder(

input clk,

input rst_n,

input e_start_i, //數(shù)據(jù)起始信號,比數(shù)據(jù)uncoded_bits第一個符號早一個時鐘,作為編碼狀態(tài)機(jī)的啟動信號

input uncoded_bits,

output reg e_start_o,

output reg [1:0] coded_bits

);

% 常量定義

parameter UNCODED_BLOCK_LEN = 100; //未編碼的數(shù)據(jù)塊長度

parameter CODED_BLOCK_LEN = 106; //編碼后的單路數(shù)據(jù)塊長度

% 狀態(tài)機(jī)定義

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);

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

// 卷積編碼狀態(tài)機(jī)

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

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

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

// 符號計數(shù)器

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

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

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

// 編碼結(jié)果輸出

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

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

結(jié)語

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

相關(guān)閱讀推薦:什么是卷積碼

相關(guān)閱讀推薦:卷積編碼是什么

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21729

    瀏覽量

    602984
  • 卷積編碼
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    2642
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    卷積碼的Viterbi高速譯碼方案

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

    卷積碼的Viterbi高速譯碼方案

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

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

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

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

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

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

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

    卷積碼編碼器怎么畫 淺談卷積碼編碼器設(shè)計

    卷積碼擁有良好的糾錯性能,是一種被廣泛應(yīng)用于移動通信的信道編碼系統(tǒng)。
    的頭像 發(fā)表于 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><b class='flag-5'>編碼</b>器設(shè)計

    基于VHDL的卷積編碼實現(xiàn) 詳解卷積編碼的應(yīng)用

    在信道編碼研究的初期,人們探索、研究出各種各樣的編碼構(gòu)造方法,其中包括卷積碼。
    的頭像 發(fā)表于 08-20 16:58 ?5469次閱讀
    基于VHDL的<b class='flag-5'>卷積</b><b class='flag-5'>編碼</b><b class='flag-5'>實現(xiàn)</b> 詳解<b class='flag-5'>卷積</b><b class='flag-5'>編碼</b>的應(yīng)用

    基于C語言的卷積編碼實現(xiàn) 淺談卷積和濾波之區(qū)別

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

    卷積編碼之維特比譯碼介紹 淺析卷積碼之應(yīng)用

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

    卷積碼編碼譯碼程序仿真程序 卷積碼應(yīng)用詳解

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

    分組卷積碼的區(qū)別 詳解分組卷積碼

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

    FPGA實現(xiàn)咬尾卷積碼的最優(yōu)算法設(shè)計

    自1955年Elias發(fā)明卷積碼以來,卷積碼作為一種高效的信道編碼已被用在許多現(xiàn)代通信系統(tǒng)中。卷積碼分為零比特卷積碼(Zero Tail C
    的頭像 發(fā)表于 05-03 09:00 ?4792次閱讀
    在<b class='flag-5'>FPGA</b>上<b class='flag-5'>實現(xiàn)</b>咬尾<b class='flag-5'>卷積碼</b>的最優(yōu)算法設(shè)計

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

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

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

    卷積碼是一種信道糾錯編碼,在通信中具有廣泛的應(yīng)用。在發(fā)送端根據(jù)生成多項式進(jìn)行卷積碼編碼,在接收端根據(jù)維特比(Viterbi)譯碼算法進(jìn)行
    的頭像 發(fā)表于 04-28 15:02 ?1.2w次閱讀
    RM新时代网站-首页