1.算法仿真效果
matlab2022a仿真結(jié)果如下:
2.算法涉及理論知識概要
隨著現(xiàn)代通信的發(fā)展余境,人們對信息傳輸?shù)目煽啃院陀行缘囊笠苍絹碓礁哂Α>S特比譯碼算法被廣泛的應(yīng)用,因此如何提高維特比譯碼器的性能柠衍,降低譯碼器的功耗和面積是個重要的問題纺且。卷積碼是Elias等人在1955年提出的,是一種非常有前途的編碼方法萤晴,尤其是在其最大似然譯碼算法-Viterbi譯碼算法提出之后,卷積碼在通信系統(tǒng)中得到了極為廣泛的應(yīng)用胁后。其中約束長度K=7店读,碼率為1/2和1/3的卷積碼己經(jīng)成為商業(yè)衛(wèi)星通信系統(tǒng)中的標準編碼方法。在“航海家“以及“先驅(qū)者”等太空探測器上也都采用了卷積碼作為其差錯控制編碼方法攀芯。在移動通信領(lǐng)域屯断,GMS采用約束長度K=5,碼率為1/2的卷積碼;在IS-95中裹纳,上行鏈路中采用的是約束長度K=9,碼率為1/3的卷積碼紧武,在下行鏈路中采用的是約束長度K=9剃氧,碼率為1/2的卷積碼。特別在第三代移動通信標準中也是以卷積碼以及與卷積碼相關(guān)的編碼方法作為差錯控制編碼方案的阻星。
2.1卷積碼編碼器
一個輸入移位寄存器(分為N段朋鞍,每段k位);n個模2加法器妥箕;一個輸出數(shù)據(jù)選擇器(n選一)滥酥。某一時刻,輸入到編碼器的k個信息元組成一個信息組畦幢,相應(yīng)的輸出序列是由n個碼元組成的碼段坎吻。這里,稱N為編碼約束度宇葱,說明編碼過程中互相約束的碼段個數(shù)瘦真。令N=m+1,則m稱為編碼存儲黍瞧,它表示輸入信息組在編碼器中需存儲的單位時間(有時為了簡化诸尽,編碼器中只用m段的輸入移位寄存器)。稱Nn為編碼約束長度印颤,說明編碼過程中互相約束的碼元個數(shù)您机,如m=2,n=2年局,則Nn=6际看。所以m或N以及Nn都是表示卷積碼編碼器復雜性的重要參數(shù)。
編碼電路:
2.2維特比譯碼
卷積編碼的過程就是編碼器狀態(tài)沿著時間軸一級一級跳轉(zhuǎn)的過程矢否。維特比譯碼算法則是在網(wǎng)格圖上搜索最可能的狀態(tài)跳轉(zhuǎn)路徑的過程仿村。維特比譯碼算法先讀取t時刻的所有狀態(tài)的幸存路徑度量,再根據(jù)t+1時刻的輸入兴喂,算出跳轉(zhuǎn)路徑的度量:根據(jù)這兩類度量算出t+1時刻到狀態(tài)S的所有路徑的度量蔼囊,比較選出一個具有較小路徑度量的路徑作為t+l時刻狀態(tài)S的幸存路徑。這樣對每個狀態(tài)都得到一個幸存路徑衣迷,根據(jù)這些幸存路徑和最終編碼器所處的狀態(tài)就可以得到編碼器的狀態(tài)轉(zhuǎn)移路徑即譯碼結(jié)果畏鼓。維特比譯碼結(jié)果的可信度取決于幸存路徑的深度和它的路徑度量值。幸存路徑越深壶谒、路徑度量值越高云矫,那么譯出信息的可信度就越高。在譯碼過程中有些路徑被拋棄了汗菜,有些路徑被保留了下來让禀。被以為是幸存路徑的挑社,也可能會在后面的搜索過程中被拋棄掉。這樣隨著搜索的深度不斷加深巡揍,最終正確的路徑將會被保留下來痛阻,所有的幸存路徑都將收斂于一條路徑。由上面的描述可知腮敌,維特比譯碼器至少需要完成以下操作:
·t時刻幸存路徑度量的存儲阱当。
·t時刻到t+l時刻的分支度量的生成。
·t+1時刻幸存路徑度量的生成和選擇糜工。
維特比譯碼器的基本結(jié)構(gòu)正是按照這些操作劃分的弊添。前面說過,網(wǎng)格圖是理解維特比算法的核心捌木。其核心思想是依次在每個時刻對網(wǎng)格圖相應(yīng)列的每個點(對應(yīng)于編碼器該時刻的狀態(tài))油坝,按照最大似然準則比較所有以它為終點的的路徑,只保留一條具有最大似然值的路徑刨裆,稱之為幸存路徑免钻,而將其他路徑堵死棄之不用,故到了下一時刻只要對幸存路徑延伸出來的路徑繼續(xù)比較即可崔拥。即接收一段极舔,計算、比較一段保留下幸存路徑链瓦,如此反復直到最后拆魏。
考慮Viterbi譯碼,假設(shè)卷積碼的編碼存儲m只是個位數(shù)慈俯。在每一幀被接收時渤刃,譯碼器都必須更新狀態(tài),對于每一個狀態(tài)贴膘,都有2k0條路徑要估算卖子。于是,譯碼器的計算量大致與成正比刑峡,等于洋闽。這是能夠用此方式解碼的碼的約束長度的上限。這個限的大小取決于要求達到的比特率和技術(shù)水平突梦,但是通常情況下诫舅,約束度N取7~9,這些值是目前典型的最大值宫患。更長的約束長度也意味著功能更為強大的碼刊懈,但只能在合理的碼率下用其他技術(shù)來譯碼,例如序貫譯碼。
3.MATLAB核心程序
EbN0dB=-1:1:6;
%采用BPSK調(diào)制
EsN0dB=EbN0dB-10*log10(R);
N0=10.^(-EsN0dB/10);
sigma=sqrt(N0);
plot_EbNo =-1:1:6;
Plot_Pe = [];
Plot_Pe2= [];
x_num=100000;
G=[1 1 1;1 0 1];
for k=1:length(N0)
k
x = bin_generator(x_num);
x(find(x < 0)) = 0;
x(find(x > 0)) = 1;
%卷碼編碼
s=encode(G,1,x);
%BPSK經(jīng)過AWGN信道
r=(2*s-1)+sigma(k)*randn(1,length(s));
r(2:10004)=0.25*r(1:10003)+0.75*r(2:10004);
r(find(r < 0)) = 0;
r(find(r > 0)) = 1;
%譯碼
dd=viterbi(G,1,r);
r=(2*x-1)+sigma(k)*randn(1,length(x));
r(2:10004)=0.25*r(1:10003)+0.75*r(2:10004);
r(find(r < 0)) = 0;
r(find(r > 0)) = 1;
%誤碼計數(shù)
Pe ?= length(find(x - dd))/x_num;
Pe2 = length(find(x - r))/x_num;
Plot_Pe = [Plot_Pe Pe];
Plot_Pe2= [Plot_Pe2 Pe2];
end
semilogy(plot_EbNo,Plot_Pe,'-bs',...
'LineWidth',2,...
'MarkerSize',8,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.0,0.9,0.0])
hold on
semilogy(plot_EbNo,Plot_Pe2,'-bo',...
'LineWidth',2,...
'MarkerSize',8,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.0,0.0])
grid;
xlabel('Eb/No (dB)')
ylabel('BER')
legend('通過維特比譯碼','不加編譯碼');