主頁 > 前端設計 > 維特比譯碼

維特比譯碼

2020-10-08 15:24:30 前端設計

1.1 前言

隨著現代通信技術的發展,高速傳輸和高可靠性成為資訊傳輸的兩個主要方面,而可靠性尤為重要,資訊在實際信道中傳輸時,信道特性的不理想、加性噪聲和人為干擾等因素的影響,都會使系統接收的資訊不可避免地出現差錯,為降低誤碼率,實作可靠性通信,通常采用的途徑有兩種:一種是通過選擇高質量的傳輸線路、改善信道的傳輸特性、增加發送信號的功率、選擇有較強抗干擾能力的調制解調方式等,來降低信道本身引起的誤碼;另一種是通過信道編碼對信道差錯進行控制,許多情況下,前者常常會受條件的限制,不是所有情況都能采用,而信道差錯控制編碼則可以彌補前者的不,糾錯編碼的基本實作方法是在發送端將被傳輸的資訊附上一些監督碼元,這些多余的碼元與資訊碼元之間以某種確定的規則相互關聯(約束),接收端則根據既定的規則校驗資訊碼元與監督碼元之間的關系,一旦傳輸發生差錯,則資訊碼元與監督碼元的關系就受到破壞,從而在接收端可以發現錯誤乃至糾正錯誤,

1.2糾錯碼的應用和發展

在實際傳輸資訊時,如果由于信道傳輸特性、加性噪聲和人為干擾等因素的影響而使接收到的資訊出現差錯,那么為了使系統能夠達到一定的誤位元率,可以通過合理設計基帶信號,選擇調制、解調方式,采用頻域均衡或時域均衡等手段,使誤位元率盡可能降低,但如果誤位元率仍達不到要求,那么必須通過信道編碼即糾錯編碼來進一步降低誤位元率,由于信道編碼可以使傳輸質量提高1-2個數量級或更多,所以在現代通信系統中,信道編碼已經成為系統重要的組成部分,對提高整個系統的傳輸性能起著重要的作用,

1948年,香農(Shannon)在他的開創性論文“通信的數學理論“中,首次闡明了在有擾信道中實作可靠通信的方法,提出了著名的有擾信道編碼定理:對于一個給定的有擾信道,若信道容量為C,只要發送端以低于C的速率R發送資訊,則一定存在一種編碼方法,使譯碼錯誤概率Pe隨著碼長n的增加,

目前,各種糾錯碼如回圈碼、BCH碼、RS碼、LDPC碼以及調制與糾錯碼相結合的TCM碼等都得到很好的研究、發展和應用,可以說糾錯碼已滲透到很多領域,在移動通信中,糾錯碼被廣泛用于模擬體制的信令傳輸及數字體制的整個傳輸,以提高傳輸的可靠性和節省寶貴的頻譜資源;在衛星通信中,糾錯碼技術已成為降低對高功放的要求和減少地球站天線孔徑尺寸的經濟且可靠的方法;在電話網上的資料傳輸中,糾錯碼技術已成為將高速資料傳輸變成現實的關鍵技術;在計算機存貯和運算系統中,也廣泛應用了糾錯碼技術,此外,在超大規模集成電路設計中采用糾錯碼技術后,大大提高了集成電路芯片的成品率,同時又降低了芯片成本,

由信道編碼理論可知,隨著碼長n的增加,譯碼錯誤概率按指數方式趨近于零,因此為提高糾錯碼有效性,就必須使用長碼,但碼長增加,碼率會相應下降,譯碼設備復雜性與計算量也相應增加,以致難以實作,要解決這一矛盾,可采用級聯碼的方法,級聯碼一般由內碼和外碼兩級組成,內碼既可以用作純糾錯,也可以用做糾錯與檢錯,但一般情況下,級聯碼被用在組合信道中,內碼中出現的錯誤往往超過了內碼的糾錯能力,所以,內碼通常僅用來糾正少量錯誤,其主要能力用來檢錯,指出錯誤位置;糾錯任務則由外碼譯碼器完成,這樣兩級譯碼的結果,得到了好的糾錯效果,還使得內/外譯碼器均較簡單,內譯碼器是檢錯譯碼器,外譯碼器是糾錯譯碼器,

Turbo碼是由C.Berron等人在1993年提出的接近香農極限的一種并行級聯碼,是在綜合幾十年來級聯碼、乘積碼、最大后驗概率譯碼及迭代譯碼等理論基礎上的一種創新,其基本原理是通過編碼器的巧妙構造,即多個子碼通過交織器進行并行或串行級聯(PCC/SCC),然

后進行迭代譯碼,從而獲得卓越的糾錯性能,Turbo碼不但在抑制加性高斯噪聲方面性能優越,而且還具有很強的抗衰落、抗干擾能力,在低于香農極限0.7dB的情況下,可以得到10-5

的誤碼率,正是由于Turbo碼超乎尋常的性能,使得它的一經出現就立即引起編碼學界的極大轟動,圍繞Turbo碼的研究也成了通信系統中的一個熱點,

隨著近年來電子技術和集成電路技術的發展,糾錯編碼技術不但早已應用于實際的通信設備之中,而且不斷的有更高性能、更低功耗的譯碼器出現,正是這種實際應用與糾錯碼理論研究的相互促進,使得糾錯編碼技術不斷呈現出蓬勃向上的活力,

1.3 本課題研究意義

進行信道編碼時,可采用多種糾錯碼,其中卷積碼和分組碼是糾錯碼的兩種主要形式,在碼率和編碼器復雜程度相同的情況下,卷積碼的性能要優于分組碼,而且更易于實作最佳譯碼和準最佳譯碼,由于卷積碼的優異性能,使得它在很多方面都得到了應用,由于卷積碼各碼組之間的相互關聯,在對卷積碼的分析時,至今未找到像分組碼那樣嚴密的數學分析手段,因此對卷積碼的性能分析比較困難,目前大多是通過計算機進行好碼的搜索,卷積碼的譯碼也較分組碼容易,可有兩大類譯碼方法:代數譯碼和概率譯碼,在概率譯碼中,維特比譯碼演算法是一種最大似然演算法,在碼的約束度較小時,其效率比序列譯碼演算法更高、速度更快,譯碼器也較之更為簡單,所以,自維特比譯碼演算法提出以來,在理論和實踐方面都得到了極其迅速的發展,被廣泛地應用于各種數傳系統,

1.4 卷積編碼和維特比譯碼

現代資訊和編碼理論的奠基人C.E.Shannon在1948年提出了著名的有噪信道編碼定理,在定理中Shannon給出了在數字通信系統中實作可靠通信的方法以及在特定信道上實作可靠通信的資訊傳輸速率上限,同時,該定理還給出了有效差錯控制編碼的存在性證明,從而促進了信道編碼領域研究的快速發展,

卷積碼是Elias等人在1955年提出的,是一種非常有前途的編碼方法,尤其是在其最大似然譯碼演算法-Viterbi譯碼演算法提出之后,卷積碼在通信系統中得到了極為廣泛的應用,其中約束長度K=7,碼率為1/2和1/3的卷積碼己經成為商業衛星通信系統中的標準編碼方法,在“航海家“以及“先驅者”等太空探測器上也都采用了卷積碼作為其差錯控制編碼方法,在移動通信領域,GMS采用約束長度K=5,碼率為1/2的卷積碼;在IS-95中,上行鏈路中采用的是約束長度K=9,碼率為1/3的卷積碼,在下行鏈路中采用的是約束長度K=9,碼率為1/2的卷積碼,特別在第三代移動通信標準中也是以卷積碼以及與卷積碼相關的編碼方法作為差錯控制編碼方案的,

1.5 本課題主要研究內容

本文首先介紹糾錯編碼的應用和發展,對本課題研究的現實意義進行了簡要闡述,然后介紹了與卷積碼有關的基本概念,同時對與Viterbi譯碼相關的兩種卷積碼的表示方法進行了介紹,然后詳細介紹了Viterbi譯碼演算法,由于Viterbi譯碼是一種最大似然譯碼,所以首先對此進行了介紹;然后從理論的角度,分析了Viterbi譯碼演算法;軟判決Viterbi譯碼的性能要優于硬判決譯碼,對此也進行了介紹和比較,然后利用MATLAB進行卷積編碼和維特比譯碼的仿真和性能分析,

卷積碼是Elias在1955年提出的,在分組碼中,把k個資訊位元序列編成n個位元的碼組,每個碼組中的(n-k)個校驗位僅與本碼組的k個資訊位有關,而與其它碼組無關,為了達到一定的糾錯能力和編碼效率,分組碼的碼組長度一般比較大,編譯碼時必須把整個資訊碼組存盤起來,由此產生的譯碼延遲會隨著n的增加而增加,和分組碼不同,卷積碼前后各碼組之間具有相關性,即卷積碼編碼后的n個碼元不僅與當前段的k個資訊有關,而且還與前面(N-1)(N為編碼約束度)段的資訊有關,在卷積碼中,k個資訊位元也被編成n個位元的碼組,但k和n通常很小,并且可以通過串行或并行的方式進行傳輸,而且時延很小,編碼程序中互相關聯的碼元個數為nN,由于卷積碼在編碼程序中,充分地利用了各碼組之間的相關性,且k和n都比較小,因此,在與分組碼同樣的碼率和設備復雜性條件下,從理論和實際兩個方面,均已證明卷積碼的性能至少不比分組碼差,且實作最佳和準最佳也較分組碼容易,但卷積碼沒有分組碼那樣嚴密的數學分析手段,目前,好的卷積碼大多是通過計算機進行搜索得到的,

卷積碼編碼器如圖3-1所示:

圖3-1碼率為k/n,編碼約束度為N的卷積碼編碼器

圖3-1主要包括:一個輸入移位暫存器(分為N段,每段k位);n個模2加法器;一個輸出資料選擇器(n選一),某一時刻,輸入到編碼器的k個資訊元組成一個資訊組,相應的輸出序列是由n個碼元組成的碼段,這里,稱N為編碼約束度,說明編碼程序中互相約束的碼段個數,令N=m+1,則m稱為編碼存盤,它表示輸入資訊組在編碼器中需存盤的單位時間(有時為了簡化,編碼器中只用m段的輸入移位暫存器),稱Nn為編碼約束長度,說明編碼程序中互相約束的碼元個數,如m=2,n=2,則Nn=6,所以m或N以及Nn都是表示卷積碼編碼器復雜性的重要引數,

卷積碼的表示方法主要有多項式矩陣表示法、狀態圖表示法和網格圖表示法,其中,多項式矩陣表示法主要用于代數譯碼,而Viterbi譯碼演算法主要采用后面兩種方法來表示,下面以(2,1,2)碼為例來介紹狀態圖表示法和網格圖表示法,設(2,1,2)碼的兩個子生成元為:

所以,該碼的生成多項式矩陣為:

根據G(D)可得如圖3-2所示的編碼電路:

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

3.3 卷積碼的狀態表示法

圖3-3 (2,1,2)卷積編碼狀態圖

上圖為圖3-2所示卷積碼編碼器的狀態圖,編碼器的暫存器在任一時刻的所存盤的內容稱為編碼器的一個狀態,以s1表示,本例中,編碼存盤m=2,k=1,編碼器由兩級移位暫存器構成,所以,移位暫存器所存盤的內容只有四種情況:00、10、01和11,這就是說本例中的編碼器共有四種狀態:s0、s1、s2和s3,隨著資訊序列不斷送入,編碼器會不斷地從一個狀態轉移到另一個狀態,利用狀態轉移路徑不但可以表示出該轉移程序中所對應的輸出碼段,同時還可以顯示所對應的輸入資訊元,雖然狀態圖能夠表示卷積碼編碼器在不同輸入的資訊序列下,編碼器各狀態之間的轉移轉移關系,但卻不能描述隨時間變化時系統狀態轉移的軌跡,為了解決這個問題,可引入下面要介紹的網格圖表示法,

圖3-4編碼器的編碼程序,可以用圖3-4所示的碼樹來描述,圖中每個節點“.”對應于一個輸入碼元,按照習慣,當輸入為“0”時,走上分支:輸入為“1”時,走下分支,并將編碼器的輸出標在每個分支的上面,按此規則,就可以畫出碼樹的路徑,對于任一個碼元輸入序列,編碼器輸出序列一定與碼樹中的一條特殊的路徑相對應,因此,沿著碼元輸入序列,就可以獲得相應的輸出碼序列,例如,如果輸入的資訊序列為1010…,輸出編碼序列為11100010…,如圖中虛線所示,可以看出,編碼器的輸出與當前輸入的碼元mj和先前輸入的兩個碼元mj-2mj-1,的取值有關,我們將編碼器中暫存器內所存盤的,先前輸入的資訊碼元的可能取值稱為編碼器的狀態,編碼器mj-2mj-1,可能的取值有四種:00,01,10和11,我們分別用 s0,sl,s2和s3表示,并將其分別標注在碼樹的各節點上,

圖3-4 (2,1,2)卷積碼的碼樹

在編碼器的輸入端輸入一個新的資訊碼元后,編碼器會從原來的狀態轉換成新的狀態,例如,若編碼器原來的狀態為sl,當輸入碼元為“1”時,編碼器會從sl狀態轉換到s3狀態:當輸入碼元為“0”時,編碼器會從sl狀態轉換到s2狀態,從碼樹上還可以看到,從第四條支路開始,碼樹的各節點從上而下開始重復出現s0,sl,s2,s3四種狀態,并且碼樹的上半部和下半部分完全相同,這意味著從第4位資訊元輸入開始,無論第1位資訊碼是“0”還是“1”,對編碼輸出都沒有影響,即輸出碼已經與第1位資訊碼元無關,這正是約束度N=3的含義,

在碼樹中,從同一個狀態節點出發的分支都相同,我們可以將狀態相同的節點合并在一起,這樣就得到了卷積碼的另外一種更為緊湊的圖形表示方法,即網格圖,雖然狀態圖展示了狀態的轉移的去向,但不能記錄狀態轉移的軌跡,網格圖可以彌補狀態圖的缺陷,它可以將狀態轉移展開在時間軸上,使編碼的全程序躍然紙上,是分析卷積碼的有力工具,在網格圖中,將碼樹中的上分支(對應于輸入碼元為“o”的情況)用實線表示,下支路(對應于輸入碼元為“1”的情況)用虛線表示,并將編碼輸出標在每條支路的上方,網格圖的每一行節點分別代表s0,sl,s2,s3四種編碼器狀態,(2,1,2)卷積碼編碼器的網格圖如圖3-5所示,

圖3-5 卷積碼的網狀圖

在某一時間單位i,離開每一狀態的虛線分支,表示輸入編碼器的資訊碼元mi=0即輸入為0:而實線分支表示此時刻輸入至編碼器的資訊碼元mi=l,即輸入為1,每一分支上的2位數字,表示i時刻編碼器輸出的子組,因而網格圖中的每一條路徑都對應于不同輸入的資訊序列,與碼樹一樣,任何可能的輸入碼元序列都對應著網格圖上的一條路徑,例如輸入至圖3-5中編碼器序列m=(1011100),對應的編碼輸出序列C=(11,10,00,01,10,01,11),它相應于圖3-5中粗

卷積碼的自由距離,是用來衡量所有可能碼字序列對之間的距離的,其定義為:整個編碼碼樹上,所有半無限長序列之間的最小漢明距離,由于卷積碼的自由距離直接決定了它的糾錯能力,所以尋找具有最人白由距離的卷積碼是一項非常重要的作業,不過對于卷積碼的構造,目前除了計算機搜索外還沒有其它更好的方法,下表是由奧登沃爾德和拉森采用計算機搜索方法得到的固定碼率和約束長度時具有最大自由距離的卷積碼,

表2-l卷積碼的自由距離與編碼增益

約束長度K

生成多項式

白由距離

編碼增益db

3

(5,7)

5

4.26

4

(15,17)

6

5.23

5

(23,35)

7

6.02

6

(53,75)

8

6.37

7

(133,171)

10

6.99

8

(247,371)

10

7.72

9

(561,753)

12

7.78

4.1維特比譯碼器的演算法

當前最流行的,最常用的卷積碼譯碼演算法式A.J.維特比于1967年提出的維特比(Vietbri)演算法,1973年,富尼最終證明了維特比演算法實質上就是卷積碼的最大似然譯碼,這就是說,從似然的角度上看,這種演算法已經式最優的了,維特比演算法在約束長度K<10卷積碼譯碼中己成為首選的,最普遍采用的演算法,

卷積編碼的程序就是編碼器狀態沿著時間軸一級一級跳轉的程序,維特比譯碼演算法則是在網格圖上搜索最可能的狀態跳轉路徑的程序,維特比譯碼演算法先讀取t時刻的所有狀態的幸存路徑度量,再根據t+1時刻的輸入,算出跳轉路徑的度量:根據這兩類度量算出t+1時刻到狀態S的所有路徑的度量,比較選出一個具有較小路徑度量的路徑作為t+l時刻狀態S的幸存路徑,這樣對每個狀態都得到一個幸存路徑,根據這些幸存路徑和最終編碼器所處的狀態就可以得到編碼器的狀態轉移路徑即譯碼結果,維特比譯碼結果的可信度取決于幸存路徑的深度和它的路徑度量值,幸存路徑越深、路徑度量值越高,那么譯出資訊的可信度就越高,在譯碼程序中有些路徑被拋棄了,有些路徑被保留了下來,被以為是幸存路徑的,也可能會在后面的搜索程序中被拋棄掉,這樣隨著搜索的深度不斷加深,最終正確的路徑將會被保留下來,所有的幸存路徑都將收斂于一條路徑,由上面的描述可知,維特比譯碼器至少需要完成以下操作:

·t時刻幸存路徑度量的存盤,

·t時刻到t+l時刻的分支度量的生成,

·t+1時刻幸存路徑度量的生成和選擇,

維特比譯碼器的基本結構正是按照這些操作劃分的,前面說過,網格圖是理解維特比演算法的核心,其核心思想是依次在每個時刻對網格圖相應列的每個點(對應于編碼器該時刻的狀態),按照最大似然準則比較所有以它為終點的的路徑,只保留一條具有最大似然值的路徑,稱之為幸存路徑,而將其他路徑堵死棄之不用,故到了下一時刻只要對幸存路徑延伸出來的路徑繼續比較即可,即接收一段,計算、比較一段保留下幸存路徑,如此反復直到最后,

下面舉個簡單例子說明維特比譯碼演算法的程序:

輸入至(2,1,2)編碼器的資訊序列M=(1011100),編碼器輸出的碼序列C=(11,10,00,01,10,01,11),通過二進制對稱信道(BSC)送入譯碼器的序列R=(10,10,00,01,11,01,11)有兩個錯誤,下面我們利用維特比譯碼演算法輸出估計資訊序列M和碼序列C,維特比譯碼器接收序列R的程序如下所示:

·第一時刻接收到子碼R0=10

·第二時刻接收到子碼Rl=10

·第三時刻接收到R2=00

·第四時刻收到子碼R3=0l

·第五時刻接收到子碼R4=11

·第六時刻接收到子碼R5=01

·第六時刻接收到子碼R6=11

線條所示,

上面描述出了各時刻進入每一狀態的幸存路徑及其度量值d(最小漢明距離),以及與此相應的譯碼器估計的資訊序列M,當L+m=7個時刻以后,4條幸存路徑只剩一條,它就是譯碼器輸出的估值序列C=(11,10,00,01,10,01,11),相應的估值資訊序列M=(1011100),R中的兩個錯誤得到了糾正,在某一時刻,如j=3時,進入s0狀態的幸存路徑的確定程序可敘述如下,進入s0狀態的有兩條路徑:一條是由(00)分支加上與此分支相連的前一時刻(第2時刻)的幸存路徑C01=(00,00)連接組成的路徑(C01,00)=(00,00,00),d(R2,00)=d(00,00)=0,因而d(C0l,00,ROR1R2)=d(C0l,ROR1)+d(R2,00)=2+0=2,所以該路徑的度量值d是2;另一條路徑是由(11)分支加上與此分支相連的前一時刻(第2時刻)的幸存路徑C01’=(11,10)連接組成的路徑(C01’,11)==(11,10,11),它的度量值d=d(C0l’11,R0R1R2)=d(C0l’,R0R1)+d(R2,11)=l+2=3,根據最小漢明距離準則可得在第3時刻s0的幸存路徑是C012=(00,00,00),它的度量值d=2,在其他時刻及進入其余狀態的幸存路徑的選擇與此完全相同,若某一時刻進入某一狀態的兩條路徑有相同的度量,如第4時刻,進入s2狀態的兩條路徑(11,10,00,10)和(00,11,01,01),它們的度量值d都為3,故可任選一條作為s2狀態的幸存路徑,在圖中選擇(11,10,00,10),這種任意選的結果,并不會影響最后結果的正確性,

5.2 卷積編碼的MATLAB仿真與分析

卷積編碼的MATLAB代碼如下所示:

function output=encode(G,k0,input)

if rem(length(input),k0)>0

input=[input,zeros(size(1:k0-rem(length(input),k0)))];

end

n=length(input)/k0;

if rem(size(G,2),k0)>0

error('Error,G is not of the right size.')

end

L=size(G,2)/k0;

n0=size(G,1);

u=[zeros(size(1:(L-1)*k0)),input,zeros(size(1:(L-1)*k0))];

u1=u(L*k0:-1:1);

for i=1:n+L-2

u1=[u1,u((i+L)*k0:-1:i*k0+1)];

end

uu=reshape(u1,L*k0,n+L-1);

output=reshape(rem(G*uu,2),1,n0*(L+n-1));

我們來驗證輸入的信號是否正確,加上輸入的信號為:

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ………………………

通過卷積編碼以后,得到信號:

0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 ………………………

卷積編碼比較簡單,這里我們就不做詳細介紹了,下面我們將介紹維特比譯碼的實作,

5.3 維特比譯碼的MATLAB仿真與分析

維特比譯碼的MATLAB代碼如下所示:

·檢驗G的維數

if rem(size(G,2),k)~=0

error('Size of G and k do not agree')

end

if rem(size(channel_output,2),n)~=0

error('channle output not of the right size')

end

L=size(G,2)/k;

number_of_states=2^((L-1)*k);

·產生狀態轉移矩陣,輸出矩陣和輸入矩陣

for j=0:number_of_states-1

for t=0:2^k-1

[next_state,memory_contents]=nxt_stat(j,t,L,k);

input(j+1,next_state+1)=t;

branch_output=rem(memory_contents*G',2);

nextstate(j+1,t+1)=next_state;

output(j+1,t+1)=bin2deci(branch_output);

end

end

input;

state_metric=zeros(number_of_states,2);

depth_of_trellis=length(channel_output)/n;

channel_output_matrix=reshape(channel_output,n,depth_of_trellis);

survivor_state=zeros(number_of_states,depth_of_trellis+1);

[row_survivor col_survivor]=size(survivor_state);

·開始非尾信道輸出的解碼 i為段,j為每一階段的狀態,t為輸入

for i=1:depth_of_trellis-L+1

flag=zeros(1,number_of_states);

if i<=L

step=2^((L-i)*k);

else

step=1;

end

for j=0:step:number_of_states-1

for t=0:2^k-1

branch_metric=0;

binary_output=deci2bin(output(j+1,t+1),n);

for tt=1:n

branch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt));

end

if ((state_metric(nextstate(j+1,t+1)+1,2)>state_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,t+1)+1)==0)

state_metric(nextstate(j+1,t+1)+1,2)=state_metric(j+1,1)+branch_metric;

survivor_state(nextstate(j+1,t+1)+1,i+1)=j;

flag(nextstate(j+1,t+1)+1)=1;

end

end

end

state_metric=state_metric(:,2:-1:1);

end

·開始尾信道輸出的解碼

for i=depth_of_trellis-L+2:depth_of_trellis

flag=zeros(1,number_of_states);

last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k));

for j=0:last_stop-1

branch_metric=0;

binary_output=deci2bin(output(j+1,1),n);

for tt=1:n

branch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt));

end

if ((state_metric(nextstate(j+1,1)+1,2)>state_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,1)+1)==0)

state_metric(nextstate(j+1,1)+1,2)=state_metric(j+1,1)+branch_metric;

survivor_state(nextstate(j+1,1)+1,i+1)=j;

flag(nextstate(j+1,1)+1)=1;

end

end

state_metric=state_metric(:,2:-1:1);

end

·從最優路徑產生解碼輸出

state_sequence=zeros(1,depth_of_trellis+1);

size(state_sequence);

state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1);

for i=1:depth_of_trellis

state_sequence(1,depth_of_trellis-i+1)=survivor_state((state_sequence(1,depth_of_trellis+2-i)+1),depth_of_trellis-i+2);

end

state_sequence;

decoder_output_matrix=zeros(k,depth_of_trellis-L+1);

for i=1:depth_of_trellis-L+1

dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);

dec_output_bin=deci2bin(dec_output_deci,k);

decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)';

end

decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));

cumulated_metric=state_metric(1,1);

通過譯碼以后,我們可以得到信號:

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ………………………

說明譯碼是完全正確的,我們對該信號進行誤碼率分析,得到如下結果:

圖5-1 維特比譯碼的信噪比

該系統的MATLAB代碼如下所示:

x = bin_generator(x_num);

x(find(x < 0)) = 0;

x(find(x > 0)) = 1;

s=encode(G,1,x); %卷碼編碼

r=(2*s-1)+sigma(k)*randn(1,length(s));

r(2:10004)=0.3*r(1:10003)+0.7*r(2:10004);

r(find(r < 0)) = 0;

r(find(r > 0)) = 1;

dd=viterbi(G,1,r); %譯碼

%誤碼計數

Pe = length(find(x – dd))/x_num;

Plot_Pe = [Plot_Pe Pe];

5.4 不通過維特比譯碼的性能仿真

以上信號不通過維特比譯碼,其頂層代碼如下所示:

x = bingen(x_num);

x(find(x < 0)) = 0;

x(find(x > 0)) = 1;

r=(2*x-1)+sigma(k)*randn(1,length(x));

r(2:5000)=0.3*r(1:4999)+0.7*r(2:5000);

r(find(r < 0)) = 0;

r(find(r > 0)) = 1

Pe = length(find(x - r))/x_num;

Plot_Pe = [Plot_Pe Pe];

其性能仿真如下所示:

圖5-2 無維特比譯碼的信噪比

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/163127.html

標籤:其他

上一篇:LeetCode 53 最大子序和

下一篇:【測驗框架】cxxtest

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more