衡阳派盒市场营销有限公司

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

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

3天內不再提示

基于 Vertibi算法的卷積碼解碼設計實現

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

本文主要是基于 Vertibi算法的卷積碼解碼設計實現的相關介紹,并就卷積編碼展開了詳盡的闡述。

卷積編碼

在信道編碼研究的初期,人們探索、研究出各種各樣的編碼構造方法,其中包括卷積碼。早在1955年,P.Elias首先提出了卷積碼。但是它又經歷了十幾年的研究以后,才開始具備應用價值。在這十幾年期間,J.M.Wozencraft提出了適合大編碼約束度的卷積碼的序列譯碼,J.L.Massey提出了實現簡單的門限譯碼,A.J.Viterbi提出了適合小編碼約束度的卷積碼Viterbi算法。20年后,即1974年,L.R.Bahl等人又提出一種支持軟輸入軟輸出(SISO,Soft-Input Soft-Output)的最大后驗概率(MAP,Maximum A Posteriori)譯碼——BCJR算法。其中,Viterbi算法有力地推動了卷積碼的廣泛應用,BCJR算法為后續Turbo碼的發現奠定了基礎。

淺談卷積編碼

實際上編碼過程就可以應用一個經典的“狀態機模型”,而狀態機模型的不同表達方式也使得整個編碼過程在時間和空間兩個維度展現出來。例如,狀態圖,即是一個很好的表示狀態變化的圖形。但是由于循環反復的利用狀態信息,但在時間上,并未很好的體現卷積碼的編碼過程。相比,樹形圖,在時間上進行延展,很直觀的表現出狀態變化的過程,但是狀態信息未重復利用,使得存儲空間大小得到限制(指數增加)。最后,網格圖很好的展現了時間和空間兩個維度信息,很適合分析卷積碼的編碼過程。而用Matlab實現卷積碼編碼的時候,我按照傳統卷積碼編碼方法(只考慮實現,未考慮算法的優化),中規中矩的編碼思路,但在速度上,并未得到很好的保證。而老師給的編程思想則是:給出每個以為寄存器中隨時間變化存儲的二進制信息。例如,4個移位寄存器,則每個移位寄存器存儲的信息分別為:[abcdefg000;0abcdefg00;00abcdefg0;000abcdefg],所以矩陣的縱列信息即為所有寄存器中瞬時狀態信息,而生成多項式中數值為‘1’的移位寄存器存儲比特信息將參與mod2運算。這樣利用矩陣的乘法直接完成查找移位寄存器中對應生成多項式數值為‘1’位置的信息。相比我的編碼思路(循環查找寄存器里對應生成多項式數值為‘1’的信息),運算速度大大提升。同時,在對狀態機模型的認識也進一步深入,即,編碼過程為移位寄存器中狀態不斷變化的過程。(編碼用‘狀態’描述,并且將‘狀態’融入到算法實現中)

基于 Vertibi算法的卷積碼解碼設計實現

在完成解碼的過程中,找了許多關于Viterbi算法的papers,但在編碼過程對狀態機模型的認識過程中,意識到,解碼過程對狀態機模型的依賴。實際上,Viterbi算法就是一個在狀態機模型基礎上不斷減少可能路徑的一個過程。因為解碼是編碼的一個逆序過程,接受比特和初始狀態是我們已知的信息,我們無法找到一個逆序的算法來計算輸入比特信息。

所以Viterbi算法利用的就是‘重新編碼’的思想,計算每條路徑可能的概率值大小,用概率最大的路徑來模擬編碼過程。從而得到輸入比特信息。而狀態機模型的應用大大提升了解碼過程尋找正確路徑的速度。而在用matlab算法實現的過程中,老師用initial state和next state作為矩陣的行列號,查找輸入比特的速度比我實現時不斷循環查找狀態表提升很多,也使最后所畫的誤碼率對比圖達到理想的接受比特個數(提高了系統的運算能力)。

還記得答辯時候老師問我的那個問題:如果接受比特中錯誤比特的數量一定(假設都是10個),那么錯誤比特均勻分布和集中分布兩種方式哪個誤碼率性能比較好?聽到問題的時候,腦袋想過的編碼過程,錯誤比特的分布情況,所以回答的一塌糊涂。后來才在老師的解釋下,明白了題目的意思。老師想問的是,錯誤比特(信道噪聲影響)的排列分布對解碼時誤碼率性能的影響。卷積碼編碼的時候就假設,每個block是相對獨立的,而瞬時編碼的時候,輸出比特不僅僅與當前的輸入比特信息有關,還與之前的若干blocks里的信息有關(聯合概率)。所以在解碼的時候,每組接收比特的信息也與之前的若干比特信息是相關聯的。

所以,如果誤碼比較集中,在Viterbi時,權值的計算時就會相對增加權值的比重(大的越大,小的越小),容易將該條路徑淘汰。而誤碼分散排列時,一些權值有可能比較接近,無法淘汰。因此誤碼集中分布的情況,系統的誤碼率性能較好。老師的問題,一定程度上又深化了我對整個系統認識的深度。不僅僅在編碼上,而且在解碼端理解卷積碼的意義:用相鄰信息編碼、解碼,使得信息能在信道中準確傳輸。

而拋開狀態機模型的應用,Viterbi算法的關鍵在于路徑選擇的權值(metric)問題。權值的計算的優化能大大提升系統誤碼率的大小。這樣,就到了最后一個問題,硬判決和軟判決對系統誤碼率的提升能力分析。從星座圖的角度看,誤碼率性能體現在是否能夠找到正確的接收比特組合信息,即糾正錯碼的距離(糾正錯碼的能力)。

硬判決在解調時直接將接受比特映射到‘0’,‘1’的星座圖空間上,那么使用漢明距離(100%的概率決定接收比特信息)就可以將接收比特投射到相應的星座圖位置,這樣,如果產生錯碼,硬判決解碼的糾正錯碼的距離將很大(正方形的邊長或對角線)。

而軟判決解調時則在‘0’和‘1’直接設置多個門限,使得接收比特可以投射到范圍內的某個區域里,而通過區域比特的組合信息,使用歐幾何距離(用一定概率值分析接收比特信息)計算最準確的接收比特,這樣,如果產生錯碼,軟判決糾正錯碼的距離將變小(圖b中實點位置,糾正錯碼距離提升),從而得到相對準確的接收比特。因此,軟判決的解碼過程誤碼率性能將優于硬判決。

基于 Vertibi算法的卷積碼解碼設計實現

關于Vertibi算法的原理,網上相關的資料很多,況且來看這篇文章的同學對原理應該不陌生,在這里只是簡單提提。我們以(2,1)卷積編碼器為例,其核心可用下面幾幅圖表示

基于 Vertibi算法的卷積碼解碼設計實現

每個卷積編碼器可用狀態轉移來表示,因此圖中a,b,c,d代表編碼器所處的4個狀態,而j表示時刻,實線表示輸入為1,虛線表示輸入為0,而線上的數字表示輸入對應的輸入;打個比方,圖中(a,0)點到(c,1)點的連接表示:當輸入為0時,寄存器的狀態從0時刻的a(我們設為兩個寄存器的狀態全為0,記為00)到1時刻的c(記為10),且伴隨著輸出為11

而Vertibi譯碼則是從上圖中找出一條路,使這條路徑對應的輸出序列與輸入序列的漢明距離最小(既“最像”)

面對這種問題,我們首先想到的便是樹的深度遍歷,既找出所有路徑然后看看誰“最像”。然而。Vertibi就是靠這個成為南加州大學知名校友,創立高通公司,并且成功讓系主任花半節課將他的生平,自然有其妙♂處。

請看下圖

基于 Vertibi算法的卷積碼解碼設計實現

它闡述了一個定理:如果P是最短路徑,對于P上任意一點x,P1一定是最短路徑。
這個定理可以很輕松的用反證法證明

之后的東西好難用語言描述所以我們直接看偽代碼吧

在這里做些解釋

首先定義路徑長度為兩個狀態轉移時的輸出序列與相應的輸入序列的漢明距離

u[j][s]代表J時刻到達s狀態的累計路徑長度

l[t][s]代表從t狀態轉到l狀態的的路徑長度

B[s]代表s狀態的對應解碼序列

由于最后路徑會回到a狀態(既寄存器為00狀態),因此按照以上方法執行后,B(a)即為結果

int vertibi(int *seq, int seqLen, int outnum,int innum,int stat[][MAXSTAT], int statRow, int out[][MAXSTAT][MAXBLOCK],int *res , int *fixed) {

/*seq為輸入序列,seqLen為輸入序列長度,outnum為輸出數(對于(2,1)卷積碼而言為2),innum位輸入數(對于(2,1)卷積碼而言為1),stat為二維的狀態轉移表(比如說,若狀態a轉到狀態c需要輸入1,則stat[1][3]=1,無法轉移的值設為-1),statRow為狀態轉移表的列數(既狀態數量),out[][][]為三維的數組,存儲兩個狀態間轉換時的輸出序列,res為解碼結果序列,fixed為糾正后的輸入序列*/

int u[MAXJ][MAXSTAT];

int B[MAXSTAT][MAXLEN/2];

int BB[MAXSTAT][MAXLEN]; /*BB[s]表示s狀態對應的糾正后序列*/

memset(u, 0, sizeof(u));

memset(B, 0, sizeof(B));

memset(BB, 0, sizeof(BB)); /*置零*/

for (int j = 0; j 《 statRow; j++) {

if (!j) u[0][j] = 0;

else u[0][j] = 100;

}

/*因為狀態的起點為狀態a,所以在0時刻除了狀態a(即u[0][0])外其它值都設為無窮大(此處定義為100)*/

int curSeq[MAXBLOCK]; //當前用于計算路徑距離的輸入序列段

for (int J = 1; J 《 seqLen/(outnum*innum); J++) {//此處的J代表時刻

for (int ii = 0; ii 《 outnum*innum; ii++) {

curSeq[ii] = seq[(J-1)*outnum*innum+ii];

} //從輸入中取出當前段

for (int i = 0; i 《 statRow; i++) { //遍歷J時刻的狀態

int min = 100;

int minj = 0; //記錄下保留路徑的起點

for (int j = 0; j 《 statRow; j++) { //遍歷J-1時刻的狀態

int l=0;

for (int jj = 0; jj 《 outnum*innum; jj++) { //遍歷當前段的每個字符來計算路徑距離

if (stat[j][i] 《 0) { //若兩個狀態本來就無轉移關系,則將l設為無窮大,這樣這條路徑就不可能被選擇了

l = 100;

break;

}

if (curSeq[jj] != out[j][i][jj]) //計算漢明距離

l++;

}

if ((u[J - 1][j] + l) 《 min) { min = u[J - 1][j] + l; minj = j; } //選出累計路徑長度最小的

}

u[J][i] = min; //將最小的累計路徑賦給J時刻的i狀態

for (int ii = 0; ii 《 (J - 1) *outnum* innum; ii++) {

BB[i][ii] = BB[minj][ii];

}

for (int jj = 0; jj 《 outnum*innum; jj++) {

BB[i][(J - 1)*outnum*innum + jj] = out[minj][i][jj];

}

//上面兩個for循環實現從狀態minj繼承糾正序列,再往上面填上對應于當前段的糾正段

for (int ii = 0; ii 《 (J - 1) * innum; ii++) {

B[i][ii] = B[minj][ii];

}

for (int jj = 0; jj 《 innum; jj++) {

B[i][(J - 1)*innum + jj] = stat[minj][i];

}

//尾加對應于糾正段的輸入段,原理同上

}

}

for (int i = 0; i 《 seqLen/outnum; i++) {

res[i] = B[0][i];

}

for (int i = 0; i 《 seqLen; i++) {

fixed[i] = BB[0][i];

}

//賦值給res和fixed

return 1;

}

結語

關于Vertibi算法的卷積碼解碼設計應用介紹就到這了,如有不足之處歡迎指正。

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

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

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

    關注

    6

    文章

    957

    瀏覽量

    54951
  • 卷積編碼
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2672
收藏 人收藏

    評論

    相關推薦

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

    和概率譯碼兩種。代數譯碼根據卷積碼自身的代數結構進行譯碼,計算簡單;概率譯碼則在計算時考慮信道的統計特性,計算較復雜,但糾錯效果好得多。典型的算法如:Viterbi 譯碼、序列譯碼等。隨著硬件技術的發展,概率譯碼已占統制地位。[此貼子已經被作者于2008-5-30 16:
    發表于 05-30 16:06

    怎么利用VHDL語言實現卷積碼解碼器的設計

    如何使用VHDL語言設計卷積碼解碼器?
    發表于 04-29 06:39

    大佬們,問一下用FPGA實現卷積碼解碼的難度,畢設選了這個

    求助!大佬們,問一下用FPGA實現卷積碼解碼的難度。
    發表于 10-16 23:26

    基于CPLD的卷積碼解碼器的設計

    卷積碼是一種性能優良的差錯控制編碼。本文闡述了卷積碼解碼器的基本工作原理,在MAX+PLUS2 軟件平臺上,給出了利用復雜可編程邏輯器件設計的(2,1,6)卷積碼
    發表于 08-10 08:39 ?24次下載

    EDA卷積碼解碼實現技術

    EDA卷積碼解碼實現技術針對某擴頻通信系統數據糾錯編碼的需要, 構造并分析了(2 , 1 , 6) 卷積碼解碼器的基本工作原理, 提出
    發表于 12-05 16:17 ?0次下載

    卷積碼的Viterbi高速譯碼方案

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

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

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

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

    卷積碼/Viterbi譯碼,卷積碼/Viterbi譯碼是什么意思 卷積碼在一個二進制分組(n,k)當中,包含k個信息位,組長度為n,每
    發表于 03-18 14:09 ?2294次閱讀

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

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

    卷積碼,什么是卷積碼

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

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

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

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

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

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

    卷積碼是1955年由Elias等人提出的,是一種非常有前途的編碼方法。
    發表于 08-21 11:07 ?3w次閱讀
    分組<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 CC,簡稱ZTCC)和咬尾
    的頭像 發表于 05-03 09:00 ?4965次閱讀
    在FPGA上<b class='flag-5'>實現</b>咬尾<b class='flag-5'>卷積碼</b>的最優<b class='flag-5'>算法</b>設計

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

    卷積碼是一種信道糾錯編碼,在通信中具有廣泛的應用。在發送端根據生成多項式進行卷積碼編碼,在接收端根據維特比(Viterbi)譯碼算法進行譯碼,能夠有效抵抗信道噪聲的影響,在誤碼率門限之下可以對傳輸過程中發生的突發錯誤進行糾錯。
    的頭像 發表于 04-28 15:02 ?1.3w次閱讀
    大发888娱乐场是真是假| 新花园百家乐的玩法技巧和规则| 揭秘百家乐官网百分之50| 尊龙娱乐开户| 百家乐三路法| 金沙百家乐官网的玩法技巧和规则 | bet365官方| 百家乐庄闲和收益| A8百家乐官网赌场娱乐网规则| 黄金城娱乐场| 大发888娱乐城客服| 百家乐之三姐妹赌博机| 百家乐官网suncity| 兰西县| 德州扑克外挂| 豪享博百家乐的玩法技巧和规则| 百家乐网娱乐城| 真人百家乐官网对决| 百家乐官网加牌规则| 高额德州扑克第七季| 百家乐游戏机分析仪| 百家乐官网的玩法技巧和规则 | 百家乐网站源码| 天玉经24山水法| 百家乐官网注册彩金| 博彩通天上人间| 大发888娱乐场lm0| 格龙24山五行| 网上玩百家乐官网游戏有人挣到钱了吗| 百家乐官网怎样玩才能赢| 米脂县| 大发888游戏官方下| 百家乐光纤冼牌机| 凤凰百家乐的玩法技巧和规则| 广州百家乐牌具公司| 澳门百家乐大小| 百家乐是多少个庄闲| 适合属虎做生意的名字| 百家乐官网筹码防伪套装| 全讯网百家乐官网的玩法技巧和规则| 澳门百家乐官网会出老千吗|