『壹』 什麼是卷積編碼
卷積碼是將k個信息比特編成n個比特,但k和n通常很小,特別適合以串列形式進行傳輸,時延小。
卷積碼定義:
若以(n,k,m)來描述卷積碼,其中k為每次輸入到卷積編碼器的bit數,n為每個k元組碼字對應的卷積碼輸出n元組碼字,m為編碼存儲度,也就是卷積編碼器的k元組的級數,稱m+1= K為編碼約束度m稱為約束長度。卷積碼將k元組輸入碼元編成n元組輸出碼元,但k和n通常很小,特別適合以串列形式進
卷積碼的編碼器
行 傳輸,時延小。與分組碼不同,卷積碼編碼生成的n元組元不僅與當前輸入的k元組有關,還與前面m-1個輸入的k元組有關,編碼過程中互相關聯的碼元個數為n*m。卷積碼的糾錯性能隨m的增加而增大,而差錯率隨N的增加而指數下降。在編碼器復雜性相同的情況下,卷積碼的性能優於分組碼。
編碼原理:
卷積碼編碼器
以二元碼為例,編碼器如圖。輸入信息序列為u=(u0,u1,…),其多項式表示為u(x)=u0+u1x+…+ulxl+…。編碼器的連接可用多項式表示為g(1,1)(x)=1+x+x2和g(1,2)(x)=1+x2,稱為碼 的子生成多項式。它們的系數矢量g(1,1)=(111)和g(1,2)=(101)稱作碼的子生成元。以子生成多項式為陣元構成的多項式矩陣G(x)=[g(1,1)(x),g(1,2)(x)],稱為碼的生成多項式矩陣。
『貳』 採用卷積編碼器當輸入信息位10110時輸出編碼位多少
參考資料:http://hi..com/wuruide/blog/item/33d28bbf1b34940818d81f26.html
在一個二進制分組碼(n,k)當中,包含k個信息位,碼組長度為n,每個碼組的(n-k)個校驗位僅與本碼組的k個信息位有關,而與其它碼組無關。為了達到一定的糾錯能力和編碼效率(=k/n),分組碼的碼組長度n通常都比較大。編譯碼時必須把整個信息碼組存儲起來,由此產生的延時隨著n的增加而線性增加。
為了減少這個延遲,人們提出了各種解決方案,其中卷積碼就是一種較好的信道編碼方式。這種編碼方式同樣是把k個信息比特編成n個比特,但k和n通常很小,特別適宜於以串列形式傳輸信息,減小了編碼延時。
與分組碼不同,卷積碼中編碼後的n個碼元不僅與當前段的k個信息有關,而且也與前面(N-1)段的信息有關,編碼過程中相互關聯的碼元為nN個。因此,這N時間內的碼元數目nN通常被稱為這種碼的約束長度。卷積碼的糾錯能力隨著N的增加而增大,在編碼器復雜程度相同的情況下,卷段積碼的性能優於分組碼。另一點不同的是:分組碼有嚴格的代數結構,但卷積碼至今尚未找到如此嚴密的數學手段,把糾錯性能與碼的結構十分有規律地聯系起來,目前大都採用計算機來搜索好碼。
下面通過一個例子來簡要說明卷積碼的編碼工作原理。正如前面已經指出的那樣,卷積碼編碼器在一段時間內輸出的n位碼,不僅與本段時間內的k位信息位有關,而且還與前面m段規定時間內的信息位有關,這里的m=N-1通常用(n,k,m)表示卷積碼(注意:有些文獻中也用(n,k,N)來表示卷積碼)。圖8-8就是一個卷積碼的編碼器,該卷積碼的n = 2,k = 1,m = 2,因此,它的約束長度nN = n×(m+1) = 2×3 = 6。
(2,1,2)卷集碼編碼器
在圖8-8中,與為移位寄存器,它們的起始狀態均為零。、與、、之間的關系如下:
(8-41)
假如輸入的信息為D = [11010],為了使信息D全部通過移位寄存器,還必須在信息位後面加3個零。表8-9列出了對信息D進行卷積編碼時的狀態。
表8-9 信息D進行卷積編碼時的狀態 輸入信息D
1
1
0
1
0
0
0
0
b3b2
0 0
0 1
1 1
1 0
0 1
1 0
0 0
0 0
輸出C1C2
1 1
0 1
0 1
0 0
1 0
1 1
0 0
0 0
描述卷積碼的方法有兩類,也就是圖解表示和解析表示。解析表示較為抽象難懂,而用圖解表示法來描述卷積碼簡單明了。常用的圖解描述法包括樹狀圖、網格圖和狀態圖等。基於篇幅原因這里就不詳細介紹了。
卷積碼的解碼方法可分為代數解碼和概率解碼兩大類。代數解碼方法完全基於它的代數結構,也就是利用生成矩陣和監督矩陣來解碼,在代數解碼中最主要的方法就是大數邏輯解碼。概率解碼比較常用的有兩種,一種叫序列解碼,另一種叫維特比解碼法。雖然代數解碼所要求的設備簡單,運算量小,但其解碼性能(誤碼)要比概率解碼方法差許多。因此,目前在數字通信的前向糾錯中廣泛使用的是概率解碼方法。
『叄』 2:1卷積碼 c語言編解碼
charinput[10]={0,0,1,1,1,0,1,1,1,1};
charoutput[5]={0};
intr1=0,r2=0;
inti;
for(i=0;i<5;i++)
{
output[i]=(input[2*i]+r1+r2)&1;
r2=r1;
r1=output[i];
}
for(i=0;i<5;i++)
printf("%d",output[i]);
printf(" ");