㈠ 卷積碼編譯碼器的Matlab模擬實現
卷積程序我還是有的:
function [f,k]=conv_m(f1,k1,f2,k2)
%計算連續信號卷積積分f(t)=f1(t)*f2(t)
% f: 卷積積分f(t)對應的非零樣值向量
% k:f(t)的對應時間向量
% f1: f1(t)非零樣值向量
% f2: f2(t)的非零樣值向量
% k1: f1(t)的對應時間向量
% k2: f2(t)的對應時間向量
% p:取樣時間間隔
p=input('p=');
f=conv(f1,f2); %計算序列f1與f2的卷積和f
f=f*p;
k0=k1(1)+k2(1); %計算序列f非零樣值的起點位置
k3=length(f1)+length(f2)-2; %計算卷積和f的非零樣值的寬度
k=k0:p:k3*p; %確定卷積和f非零樣值的時間向量
subplot(2,2,1)
plot(k1,f1) %在子圖1繪f1(t)時域波形圖
title('f1(t)')
xlabel('t')
ylabel('f1(t)')
subplot(2,2,2)
plot(k2,f2) %在子圖2繪f2(t)時波形圖
title('f2(t)')
xlabel('t')
ylabel('f2(t)')
subplot(2,2,3)
plot(k,f); %畫卷積f(t)的時域波形
h=get(gca,'position');
h(3)=2.5*h(3);
set(gca,'position',h) %將第三個子圖的橫坐標范圍擴為原來的2.5倍
title('f(t)=f1(t)*f2(t)')
xlabel('t')
ylabel('f(t)')
㈡ 卷積碼的解碼方法
若信道干擾序列為,其中。接收序列為
其中和。這里「+」為模 2 運算(q=p元碼按模p運算)。解碼就是根據編碼規則和信道干擾的統計特性,對信息序列u(x)作出估值的方法。常用的有三類解碼方法,即代數解碼、維特比解碼和序貫解碼。
⒈代數
代數解碼是將卷積碼的一個編碼約束長度的碼段看作是[n0(m+1),k0(m+1)]線性分組碼,每次根據(m+1)分支長接收數字,對相應的最早的那個分支上的信息數字進行估計,然後向前推進一個分支。上例中信息序列 =(10111),相應的碼序列 c=(11100001100111)。若接收 序列R=(10100001110111),先根據R的前三個分支(101000)和碼樹中前三個分支長的所有可能的 8條路徑(000000…)、(000011…)、(001110…)、(001101…)、(111011…)、(111000…)、(110101…)和(110110…)進行比較,可知(111001)與接收序列(101000)的距離最小,於是判定第 0分支的信息數字為 0。然後以R的第 1~3分支數字(100001)按同樣方法判決,依此類推下去,最後得到信息序列的估值為=(10111),遂實現了糾錯。這種解碼法,解碼時採用的接收數字長度或解碼約束長度為(m+1)n0,所以只能糾正不多於(dmin-1)/2個錯誤(n長上的)。實用中多採用反饋擇多邏輯解碼法實現。
⒉維特比
維特比解碼過程
維特比解碼是根據接收序列在碼的格圖上找出一條與接收序列距離(或其他量度)為最小的一種演算法。它和運籌學中求最短路徑的演算法相類似。若接收序列為R=(10100101100111),解碼器從某個狀態,例如從狀態ɑ出發,每次向右延伸一個分支(對於l<L,從每個節點出發都有 2=2種可能的延伸,其中L是信息序列段數,對l≥L,只有一種可能),並與接收數字相應分支進行比較,計算它們之間的距離,然後將計算所得距離加到被延伸路徑的累積距離值中。對到達每個狀態的各條路徑(有2=2條)的距離累積值進行比較,保留距離值最小的一條路徑,稱為倖存路徑(當有兩條以上取最小值時,可任取其中之一),解碼過程如圖。圖中標出到達各級節點的倖存路徑的距離累積值。對給定 R的估值序列為=(10111)。這種演算法所保留的路徑與接收序列之間的似然概率為最大,所以又稱為最大似然解碼。這種解碼的解碼 約束長度常為編碼約束長度的數倍,因而可以糾正不多於(df/2)個錯誤。
維特比解碼器的復雜性隨m呈指數增大。實用中m不大於10。它在衛星和深空通信中有廣泛的應用。在解決碼間串擾和數據壓縮中也可應用。
⒊ 序貫解碼
序貫解碼是根據接收序列和編碼規則,在整個碼樹中搜索(既可以前進,也可以後退)出一條與接收序列距離(或其他量度)最小的一種演算法。由於它的解碼器的復雜性隨m值增大而線性增長,在實用中可以選用較大的m值(如20~40)以保證更高的可靠性。許多深空和海事通信系統都採用序貫解碼。
㈢ 什麼是卷積編碼
卷積碼是將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)],稱為碼的生成多項式矩陣。
㈣ 基於圖結構應用《編碼,解碼器》的設計與實現 這個畢業設計應該從什麼思路下手啊~~計算機專高手請指點
兄弟你這個論文有點難度了。不是隨便拉拉就行了。得找專業書籍慢慢找和高人指導了。
我查到點不指導有沒有用。
Turbo卷積碼(TCC)是3G無線系統中所採用的前向錯誤校正(FEC)機制的整體部分。然而,Turbo解碼器所帶來的計算負擔非常重,並不太適合採用傳統DSP或RISC處理器實現。由於現場可編程邏輯陣列(FPGA)內在的並行結構,FPGA為解決3G基站收發器中所需要的符號速率FEC和其它計算密集的任務提供了一個高性能信號處理平台基礎。
Turbo 編碼
級聯碼方案(Concatenated coding schemes)是為了通過結合兩個或更多相對簡單的分量或構造模塊碼來獲得較高的編碼增益。Turbo碼認為是對級聯碼結構的一種改進,其中採用迭代演算法對相關的碼序列進行解碼。Turbo碼是通過將兩個或更多分量碼應用到同一數據序列的不同交織版本上構成的。對於任何傳統單分量編碼,解碼器的最後一級生成的都是硬判決解碼數據位。為了使象Turbo碼這樣的級聯碼方案工作得更好,解碼演算法不應被限制為只能在解碼器間傳遞硬判決。為最好地利用每個解碼器獲得的信息,解碼演算法必須可以實現軟判決交換,而不是採用硬判決。對於採用兩個分量碼的系統,解碼的概念是指將來自一個解碼器的軟判決輸入到另一個解碼器的輸入,並將此過程重復幾次以獲得更好的判決,如圖1所示 。
3GPP Turbo 編碼器
圖2為3GPP編碼器。
輸入數據流輸入到RSC1,它為每個輸入比特生成一個對等比特(Parity Bit)。輸入數據還經過交織後由RSC2處理生成第二個對等比特流。
3GPP標準定義,輸入塊的長度在40至5114 位之間。編碼器生成一個速率為1/3的包括原始輸入位和兩個對等位的系統碼。通過打孔方法可以獲得1/2編碼速度的編碼。遞歸系統編碼器的實現比較直接,然而交織器則不那麼簡單,要比標準的卷積或塊交織器復雜。
一旦將輸入數據塊長度K 提供給編碼器以後,編碼器將計算交織矩陣行數R和列數 C,並創建相應的交織數據結構。R 和 C 是數據塊長度K的函數。在輸入符號被載入到交織矩陣以後,那麼將根據一定的順序進行行間交換和列間交換。交換模式是根據塊長度K選擇的(即依賴於K)。行和列交換完成後,通過逐列讀出交織矩陣數據就可以得到最終的交織序列。在數據讀出時需要進行刪減操作,以保證在輸出中只有正確的輸入符號,請注意,交織陣列包含的數據位通常比K個原始輸入符號要多 ,因為R C>K。然後,新的序列經過RSC2編碼生成第二個對等位流。
實現交織器的一種方法是在存儲器中存儲完整的交換序列。即,一旦K 給定,即調用一個初始化常式(運行在處理器上的軟體常式或利用FPGA中的功能單元)生成相應的交換序列,然後將這一信息存儲在存儲器中。然而,這一方法需要大量的存儲器。利用Virtex -E FPGA 技術提供的 4096位每塊的片上存儲器,將需要[5114 13/4096]=17個存儲器塊。
在我們的方法中,採用一個預處理引擎生成一個序列值(存儲),這一序列值被存儲起來,交織器地址發生器將使用這些序列值。這一硬體單元採用幾個小型數據結構(素數表)來計算所需要的序列。這一準備過程需要的時鍾周期數與信息塊的長度成比例。例如,對於K=40的塊需要280時鍾周期,而對於最大塊長度K=5114,則需要 5290個時鍾周期。該過程只需要在塊長度變化時進行。地址發生器利用這些更為緊湊的數據結構來實時生成交織地址。
3GPP Turbo 解碼器
解碼器包括兩個MAP(最大後驗概率)解碼器和幾個交織器。Turbo演算法的優良的性能源於可以在兩個MAP解碼器間共享可靠性信息(extrinsic data,外數據,或稱先驗數據)。
在我們的設計中,MAP解碼器採用的是Bahl, Cocke, Jelinek 和 Rajiv (BCJR) 演算法。BCJR演算法計算每個符號的最大後驗對數似然率,並且是一種真正的軟判決演算法。考慮到數據是以塊的形式傳輸的,因此可以在時間維中前向或反向搜索一個符號序列。對於任一序列,其出現概率都是單獨符號出現概率的乘積。由於問題是線性的,因此序列概述可以利用概率的對數和來代替。
為了與一般文獻中的習慣一致,我們將解碼迭代的前向和反向狀態概率分別利用 和 來表示。通常,BCJR演算法要求在接收到整個信息後才開始解碼。對於實時應用,這一限制可能太嚴格了。例如,3GPP Turbo解碼器將需要大量存儲器存儲一個5114符號信息塊的完全狀態結構(state trellis)。對於單片FPGA設計來說,這需要的存儲資源太多了。與維特比(Vitebi)演算法類似,我們可以先從全零向量 O和數據{yk}(k 從 n 到 n-L) 開始反向迭代。L次反向迭代可獲得非常好的 n-L近似值。只要L選擇合適,最終的狀態標志(state metric)就是正確的。可以利用這一性質在信息結束前就開始進行有效的位解碼。
L 被稱為收斂長度。其典型值大約是解碼器約束長度的數倍(通常為5至10倍),並隨著信噪比的降低而增加。
通常,Turbo解碼演算法將計算所有的 (對整塊信息),將這些數值存儲起來,然後在反向迭代中與反向狀態概率一起用來計算新的外信息(extrinsic information,或稱先驗信息)。我們的設計中採用了窗口化方法。
解碼過程以一個前向迭代開始,計算包含L 個接收符號的塊i的 值。同時,對未來(i+1)塊進行一個反向迭代(標號 )。對塊i+1的反向迭代結束時,就獲得了開始對塊i 進行反向迭代所需要的正確的 初始向量。 與此同時對數似然函數(Lall)也在進行。 每一 和 處理過程都需要8個max* 操作 - 每個針對狀態結構(tellis)中的8個結點之一。最終的對數似然計算需要14個並行max* 運算符。為了提供可接受的解碼速率,在設計中採用了38個max* 功能單元。
從 C描述到FPGA設計
FPGA Turbo 編碼解碼器設計是利用基於C的設計和驗證方法進行的,如圖3所示。
演算法開發階段採用具有定點C類型的Art Library 來對定點計算的位真(bit-true)效應進行准確建模。在這一階段考察了幾種可能演算法的定點性能。一旦選定正確的量化演算法,就可利用A|rtDesignerPro創建一個專用DSP架構。A|rtDesignerPro的一個最強大的功能之一是可以插入和利用專用的數據通道核心(稱為專用單元,ASU)。利用這些ASU加速器核心可以使我們處理Turbo解碼器演算法內在的計算復雜性。
A|rtDesignerPro可自動完成寄存器分配、調度和控制器生成。在Turbo編碼解碼器設計中, A|rtDesignerr的自動循環合並可獲得最佳的;任務調度,MAP解碼步驟的內部循環都只有一個周期長。
A|rtDesignerPro生成的最終結果是可綜合的寄存器級(RT-level) VHDL或Verilog 描述。基於C的工具流支持FPGA專用功能。例如,可利用BlockRAM自動構造RAM,而寄存器文件也可利用分布式存儲器而不是觸發器來實現 。
最後,邏輯綜合和Xilinx實施工具套件將RTL HDL 轉換為 FPGA 配置位流。
FPGA Turbo 編碼解碼器實現
A|rtDesigner創建的Turbo編碼器和解碼器核心硬體結構包含許多專用ASU加速器。其中最重要的一個加速器完成max* 操作。max* 運算符根據下式計算兩個冪值a 和 b:
max* (a,b)=ln(expc(a)+expc(b))。
如 圖4所示, max* 運算是通過選擇(a,b)最大值,並應用一個存儲在查找表(LUT)中的校正因子近似進行的。這一近似演算法非常適合利用Xilinx FPGA 實現,其中LUT是其最終基本構造單元。
結果
Turbo解碼演算法硬體字長的選擇極大地影響總體性能。利用C-to-FPGA設計流程,這一定點分析是完全在C環境中完成的。結果示於圖 5。
上圖顯示出了我們的浮點Turbo解碼器演算法和對應的定點演算法之間的性能差別。模擬是在5114塊長度、5次解碼迭代和AWGN信道模型情況下進行的。結果清晰明顯出性能的損失是非常小的。
我們的Turbo解碼器的定點性能做為解碼器迭代次數的函數 ,對於1.5 dB SNR,位錯率為10-6。
解碼器功能的實現非常具有挑戰性,我們同時針對Virtex-E和 Virtex-II 器件進行了適配。Virtex-II 器件實施是採用運行在1.85 speedfile資料庫上的Xilinx 4.1i 實施工具集完成的。利用XC2V1000BG575-5 FPGA實現的最終設計,達到了66 MHz 的時鍾性能,消耗了3,060個邏輯片 和 16個塊RAM。對於從40至 5114符號長度的塊,採用5次解碼迭代循環的情況下,解碼器達到了2 至6.5 百萬符號每秒(Msym/s)的吞吐量。編碼器佔用了903個邏輯片、3個塊RAM並支持83 MHz時鍾頻率。對於從40至5114位的塊長度,速率可達到9 至20 Msym/s。
能用上就好了,用不上別怪我。對不起哈~祝福你~