寫寫Matlab的Turbo仿真實現吧

信道編碼作用就是針對無線傳輸環境下複雜多變的信道條件,採取的一種提高發送數據正確率的典型方法。比如對於傳輸的信息比特序列(例如x=[1 1 0 1 0 1 1 0]是一個長度爲8的序列),如果直接經過無線信道,由於各種干擾的存在,接收到的序列y可能出現差錯變爲了y=[1 1 0 1 1 1 1 0]。其中第五位出現了偏差由0變爲了1產生錯誤。信道編碼的職責就是按照某種數學規律在發送數據之後添加一定的校驗位比特(例如c=[1 1 0 0])使得發送的數據變爲信息比特x和校驗比特c的某種組合方式(例如最直接的就是級聯的方式s=[x c]=[1 1 0 1 0 1 1 0 1 1 0 0])。此時發送的數據變爲s。此時經過無線信道,受干擾影響接收到的數據y'是y'=[1 1 0 1 1 1 1 0 1 1 0 0],不過由於比特流之間滿足特定的數學規律,可以糾正這一個錯誤,恢復出原始發送數據s=[1 1 0 1 0 1 1 0 1 1 0 0],進而提高了數據傳輸的可靠性。這種措施是針對信道條件的影響採取的編碼方式來提高傳輸可靠性【1】,信道編碼由此得名。

Turbo編碼屬於信道編碼的一種,而且是一種性能極好的方案。這個“好”在通信系統中具體體現在具有很好的傳輸可靠性以及可以接受的實現複雜度。(Bit Error Rate,BER)就是很好的可靠性衡量準則,比方我發送100個比特,其中錯了18個比特,那麼此時的BER=18%。實現複雜度的問題也可以主觀感受一下,我設計一個特別複雜的編碼方案,接收端對收到的數據進行對應的複雜的操作,這雖然能帶來BER的提升,但是花費的開銷太大,實際應用中實用性不高。Turbo編碼的BER特性是現有所有信道編碼中數一數二的,又具有適度的實現複雜度,因此說Turbo是一種好碼。


寫着寫着就寫多了,這篇文章主要是寫一下Turbo的編譯碼思路以及Matlab的仿真實現(譯碼的話公式沒看懂)。

編碼器:

wKioL1XyniLwA0tVAABV9uaKhY4241.jpg

            圖-1Turbo碼編碼器結構

    從圖中可以看出Turbo碼編碼器由兩個遞歸系統卷積碼編碼器(RSC)和一個交織器(Interleaver)以及一個打空器(Puncturer)組成。和普通的卷積碼編碼器不同的是,遞歸系統卷積碼編碼器有一個反饋支路,同時它有一輸出信號就是原始的輸入信息。RSC的具體的結構如圖-2所示。

wKiom1XynEHQdgByAABN1iDNIvM260.jpg

            圖-2RSC編碼器結構

沒有打孔的Turbo碼編碼器的碼率是1/3,實際中,常常採用變碼率的Turbo碼,這時就需要進行打孔操作,從圖-1中可以看出,打孔針對的是兩個RSC編碼器產生的校驗比特,原始的信息比特是不參加打孔操作的。

假設RSC編碼器的寄存器的個數爲:m

輸入Turbo編碼器的信息記爲:Infor

編碼的具體流程爲:將輸入Turbo碼編碼器的信息(infor)m個尾比特(tail1)輸入進第一個RSC編碼器進行編碼,加m個尾比特的目的是將第一個RSC編碼器的最終狀態迴歸到零狀態,輸出爲parity1。將輸入Turbo碼編碼器的原始信息(infor)進行交織,將交織後的信息再加m個尾比特(tail2)輸入進第二個RSC編碼器進行編碼,加m個尾比特的目的是將第二個RSC編碼器的最終狀態迴歸到零狀態,輸出爲parity2parity1parity2的長度相等,都是輸入信息的長度加上m。假如想得到不同碼率的Turbo碼,可以對兩路校驗信息進行打孔,如不進行打孔操作,則Turbo碼編碼器的輸出即爲:infor+tail1+tail2+parity1+parity2


譯碼器:

wKioL1XynkGiVCPIAABXFNLPLwg483.jpg

            圖-3 Turbo碼譯碼器(MAP)

從圖-3中可以看出,Turbo碼譯碼器(MAP)由兩個MAP譯碼器和兩個交織器,一個解交織器組成。其中MAP Decoder 1MAP Decoder 2分別針對Turbo碼編碼器的RSC 1RSC2進行譯碼操作。由於輸入到第二個RSC編碼器的信息經過了交織的過程,因此,接收到的系統信息在輸入到MAP Decoder 2之前,先要進行交織的操作。解交織器和另一個交織器的功能類似,在此不再說明。

譯碼的流程從圖-3中可以很明顯的看出來:將原始信息,由第一個RSC編碼器產生的第一路校驗信息,第二個MAP譯碼器產生的相對於第一個MAP譯碼器而言的先驗信息(第一次初始化爲零)經過解交織後聯合輸入進第一個MAP譯碼器進行譯碼進行譯碼;將第一個MAP譯碼器輸出的相對於第二個MAP譯碼器的先驗信息經過交織,原始的信息經過交織,第二路校驗信息聯合輸入進第二個MAP譯碼器進行譯碼,這時,第二個MAP譯碼器輸出的便是相對於第一個MAP譯碼器而言的先驗信息,完成了一次迭代。可以根據實際的需要,設定譯碼的迭代次數,一般情況下,隨着迭代次數的增加,譯碼器的性能會增加,但是,當迭代次數增加到一定的程度以後,譯碼器增加的性能就已經很小了,實際中,迭代次數一般選8

Turbo碼大體的編解碼思路就說這麼多,具體的Matlab程序網上流行的一個WuYufei大神的版本,可以從這裏獲得鏈接: http://pan.baidu.com/s/1jG1twhC 密碼: w9qe。


這裏發現的問題是,Wu的程序是AWGN信道下BPSK調製方式的,調製階數比較低,從提高傳輸有效性的角度上需要高階調製(比如之前的BPSK調製,1就代表比特1,-1就代表比特0,高階的調製例如QPSK,s1代表00,s2代表01,s3代表10,s4代表11),這樣同樣傳輸s1~s4中的一個符號,就可以表示兩個比特的數據,速率提升了一倍,同樣帶來的結果是傳輸可靠性會有所下降(因爲s1~s4之間的區分度不如1、-1之間的區分的好,即更容易互相混淆)但是在可容忍的可靠性下降範圍內採用QPSK調製確實提高了傳輸有效性。所以我需要做的就是在Wu的程序基礎上加入調製的步驟。

Turbo編碼不需要適配,假設產生了信息比特有100個,經過Turbo編碼(碼率1/3)那得到的數據比特爲300,對這300個比特進行QPSK調製即可,調製完的符號經過AWGN信道疊加噪聲時需要注意噪聲功率,原本的噪聲幅度爲sigma,那麼加到QPSK符號上的噪聲幅度需要變爲sigma/sqrt(2)。

Turbo譯碼器的輸入需要提供每一個比特的軟信息(符號置信度),所以經過AWGN信道的接收數據y,需要①先進行軟解調【2】處理,②將QPSK調製軟解調的符號級軟信息映射爲比特級軟信息作爲Turbo的輸入。

軟解調主要根據公式wKiom1XyzRawGGYxAABqQTPuTHQ576.jpg

實際應用中由於在高信噪比的條件下r被判決爲s1~s4中某一個的可能性會很有壓倒性,另外的三種可能較小,所以導致LLR的計算過程中會出現NaN或Inf之類的結果。所以實際應用中採用更簡化的方案:wKioL1Xyz_byGD-pAACO5YGqH9s766.jpg採用這個方案不會出現上述NaN,Inf之類的問題。

附上我做的高階(QPSK)調製有/無Turbo編碼的BER-SNR曲線~

wKiom1YABUmQS-QaAAKtE80GIJI982.jpg

總結一下的話,主要就是介紹了Turbo編碼的思想以及應用於高階調製的Matlab仿真需要注意的問題。


【1】通信系統主要是解決三個問題:可靠性、有效性、安全性。其中可靠性和有效性是一種矛盾關係,一方面希望我發送一點兒消息(比如一個數字1,接收端可以理解出大量的信息(比如a“我愛北京天安門,天安門上太陽升”);另一方面我又希望我發送的數據可以被接收方正確的理解(即a就是代表那句歌詞)。顯然消息蘊含的信息時有限的(比如數字1如果規定代表歌詞的話,那麼真的需要傳輸數字“1”的信息的時候需要找別的信息來代替)而且傳輸過程中會發生損失(比如發送數字1,卻接受到了數字7,那麼收端肯定無法正確理解發端的意思)這對於傳輸可靠性來說是一個消極因素。這時需要發端進行適當的操作來提高發送數據的準確性,即如前文所述的信道編碼,與信道編碼類似的提高可靠性的操作會引起信息的冗餘,這對於傳輸有效性來說是一個消極因素。因而通信系統需要在有效性和可靠性之間取得適當的折中。第三個安全性就顧名思義了,我希望我傳輸的數據只有我和接受的人收到,其他的人收到也是無用的信息,這涉及到一些抗干擾相關的技術,小編研究不深。

【2】軟解調,相對應的就有硬解調。

先說硬解調,還記得我們爲了提高傳輸有效性在每次發送信息的時候發的是s1~s4之中的一個嘛,現在假設s1=-1-1i,s2=-1+1i,s3=1-1i,s4=1+1i。那s1~s4可以畫成如下的星座圖。

wKiom1XyyR-zRIvFAAEvwOd3QA0188.jpg

經過無線信道的各種干擾影響之後,接收到信號r可能位於這個位置,如下圖

wKioL1Xyy-bBFbilAAFicjUyhuw093.jpg

那麼究竟應該將接收信號r判別成s1~s4中哪一種呢?硬解調給出的方案就是計算一下r到s1~s4之間的各個距離d1~d4,取距離最近的那一個作爲判決結果。這麼做是有原因的,因爲影響因素服從0均值的高斯分佈,所以噪聲影響從s1(-1,-1i)的位置變到了r所在的位置的概率畢竟是小的,所以優先判決爲距離更近的點。這麼做比較簡單,但是給人一種生硬的感覺,突出一個“強行”,硬判決由此得名。經過應判決我們得知的只有被判決成的符號是s1~s4中的哪一個,並不知道r究竟與判決結果的偏移程度有多大,這是一部分信息損失,我們希望能補償回來。

再說一下軟解調,軟解調在判決的時候,並不是生硬的給出r判決爲s1~s4的哪一個,而是給出發送s1~s4,收端收到r的這四種情況各自發生的概率p(r|s1)~p(r|s4)(這個概率又稱爲軟信息)。殘忍的判決工作軟解調並不做,只是把各種概率作爲輸出,這樣的話硬解調損失的r與判決結果的偏移/相似程度就得意保留,沒有信息損失。而這個軟信息正好可以天然的用於類似於Turbo譯碼器這種需要軟信息的譯碼操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章