FPGA數字訊號處理(27)卷積編碼器與Viterbi譯碼器設計
卷積編碼與譯碼
訊號在通道間傳輸主要會受到三個方面的影響:
- 通道本身對訊號產生衰落,這是由於通道本身的頻率響應特性就不理想,對訊號造成破壞;
- 通道中的各種噪聲,疊加在訊號上改變了訊號的幅度、相位、頻率,造成解調錯誤;
- 多徑效應,訊號在傳輸過程中的反射、折射、沿不同路徑傳播造成的疊加效應。
通常會採用通道編碼,在傳送端插入一些冗餘碼元,接收端利用這些冗餘碼元檢測並糾正訊號在傳輸過程中產生的錯誤。目前常用的有卷積碼、Turbo碼和LDPC碼,本文先介紹卷積碼的編碼和譯碼方式。
卷積碼通常稱作非分組碼,其含義是每個碼組的校驗位不僅與本碼組中的資訊位有關,而且還和之前的m(通常稱作約束長度)段碼組的資訊位有關。與之相對地,分組碼的含義是每個碼組中的校驗位只與本碼組中的資訊位有關。卷積碼通常用(n,k,m)表示,k表示編碼前位寬,n表示編碼後位寬,通常稱k/n為編碼效率。如一個(3,1,7)卷積編碼結構如下:
卷積碼的每一個輸出通常用生成多項式來表示,如上圖中A、B、C對應的生成多項式分別為g1=(133)8、g2=(165)8、g3(171)8。通常用8進位制或2進製表示,為1表示該移位暫存器中的對應位置與異或門相連;為0表示不相連。另外還有其它的狀態圖、網格圖等卷積碼錶示方式,本設計中不會用到,因此不予描述。
輸出資料A、B、C可以序列或並行地輸出,如果是序列輸出還涉及到時鐘速率的轉換,如上圖中輸出時鐘速率應是輸入時鐘的3倍。接收端需要作相應的譯碼,卷積譯碼不像第26篇中介紹的加擾、解擾那樣採用逆運算即可,卷積譯碼還要考慮修復傳輸過程中產生的錯誤,因此是個相當複雜的過程。
目前應用最為廣泛的是一種概率譯碼方法,Viterbi譯碼,是基於最大似然準則實現的。該演算法原理也很複雜,如果想要自己設計Verilog實現,很耗費時間,本文設計採用現成的IP核實現。《基於OFDM的卷積編譯碼與自適應傳輸技術的研究_孫婷》這篇論文中給出了詳細的Viterbi譯碼原理,以及Verilog實現方法,供各位參考研究。
MATLAB設計
使用MATLAB模擬卷積編碼和Viterbi譯碼的過程,MATLAB提供了現成的函式convenc和vitdec,生成多項式採用網格trellis結構表述,可以用poly2trellis函式將多項式轉換為trellis結構。本設計模擬時和第26篇中的加擾器、解擾器結合,資料流為:原始序列->加擾器->卷積編碼->Viterbi譯碼->解擾器。與卷積編譯碼相關的核心程式碼如下:
%----------------------------------------%
%%% ------- (3,1,7)卷積編碼 -------- %%%
%----------------------------------------%
%將生成多項式轉換為網格表示式,g1=o133,g2=o165,g3=o171
% trellis = poly2trellis(7,{'1+x^2+x^3+x^5+x^6', ...
% '1+x^1+x^2+x^4+x^6','1+x^1+x^2+x^3+x^6'});
trellis = poly2trellis(7,[133 165 171]);
%上面給出了兩種轉換方式,7為約束長度
codeData = convenc(y_scrambler,trellis); %對加擾後資料卷積編碼
%----------------------------------------%
%%% --------- Viterbi譯碼 ---------- %%%
%----------------------------------------%
decodeData = vitdec(receive,trellis,34,'trunc','hard');
Viterbi譯碼有硬決策hard和軟決策soft兩種譯碼方式,後者由於會採用額外的位寬描述訊號強度,因此效能更好,具體可以參考MATLAB文件,這裡就不再展開。卷積編碼與Viterbi譯碼結果對比如下(無噪聲情況下),可以看到編碼前資料與譯碼後資料完全一致:
MATLAB幫助文件的Convenc和Vitdec函式說明中還有更多的例項,包括不同編解碼方式在不同數字通訊訊雜比Eb/No下的誤位元速率測試,各位可以自行查閱。
FPGA設計
在Vivado中完成演算法設計及模擬。卷積編碼的設計很簡單,僅僅包含移位暫存器和異或門,和第25篇中加擾器、解擾器的設計非常相似。另外Xilinx還提供了Convolution Encoder這個IP核用於完成卷積編碼。本文設計採用自行設計Verilog程式碼,程式碼如下:
`timescale 1ns / 1ps
//-------------------------------------------------------------------------
// (3,1,7)卷積編碼器設計,written by劉奇,2018.09.16
//-------------------------------------------------------------------------
module Convenc
(
input clk,
input rst_n,
input din,
output [2:0]dout
);
//-------------------------------------------------------------------------
// 移位暫存器部分
//-------------------------------------------------------------------------
reg [6:0] conv_reg;
always @ (posedge clk or negedge rst_n)
if (!rst_n) conv_reg <= 7'b0000000;
else conv_reg <= {din,conv_reg[6:1]};
//-------------------------------------------------------------------------
// 模2加法器設計
//-------------------------------------------------------------------------
reg [2:0] dout_reg;
always @ (posedge clk or negedge rst_n)
if (!rst_n) dout_reg <= 3'b000;
else begin
dout_reg[2] <= conv_reg[6]^conv_reg[4]^conv_reg[3]^conv_reg[1]^conv_reg[0]; //o133
dout_reg[1] <= conv_reg[6]^conv_reg[5]^conv_reg[4]^conv_reg[2]^conv_reg[0]; //o165
dout_reg[0] <= conv_reg[6]^conv_reg[5]^conv_reg[4]^conv_reg[3]^conv_reg[0]; //o171
end
assign dout = dout_reg;
endmodule
Viterbi譯碼過程相當複雜,理解原理和完成Verilog程式碼設計都需要不少的時間,本設計採用Vivado提供的Viterbi Decoder IP核。這個IP核可以實現的功能非常強大,本設計只使用了最基本的功能。IP核配置介面如下:
Viterbi Type選擇Standard,即標準的Viterbi演算法結構。約束長度設定為7(與編碼方式相同),回溯長度設定為42(越高譯碼正確率越高,Latency和消耗資源也增加)。Viterbi結構可以選擇並行Parallell(更高的資料吞吐量,每個時鐘可以得到一個輸出)和Serial(佔用更少的資源,每N個時鐘得到一個輸出)。
State標籤下選擇Hard Coding方式。Convolution 0標籤下設定編碼速率和生成多項式,如上圖所示,應與編碼方式對應。Viterbi譯碼採用並行輸入方式,如編碼速率設定為3,則輸入資料訊號為[23:0]共3*8位元位寬,每8個位元為一路編碼的輸入,例項化時注意輸入的訊號要與設定的生成多項式順序對應。
模擬時與MATLAB中相同,按加擾器->卷積編碼->Viterbi譯碼->解擾器的順序級聯在一起。原始序列由MATLAB生成並儲存在txt檔案中,在testbench中讀取呼叫。模擬結果如下圖所示,看到加擾後資料scrambler_out(即卷積編碼的輸入資料)和Viterbi譯碼後輸出deconv_out完全一致;加擾前資料din與解擾後資料descrambler_out也完全一致,只是輸入與輸出之間有計算導致的延遲:
相關文章
- FPGA數字訊號處理(26)加擾器與解擾器設計FPGA
- FPGA數字訊號處理(24)數字相關器設計(簡化結構)FPGA
- FPGA數字訊號處理(25)數字相關器設計(經典結構)FPGA
- 數字訊號處理:線性卷積、迴圈卷積、圓周卷積計算卷積
- MATLAB訊號處理——數字濾波器的設計Matlab
- FPGA數字訊號處理(22)FSK調製技術FPGA
- 語音訊號預處理——數字濾波器音訊
- 數字訊號處理實驗(四):數字濾波器結構
- 利用 TensorFlow 實現卷積自編碼器卷積
- 數字訊號處理基礎----插值、抽取濾波器
- 卷積自編碼卷積
- 大牛講解訊號與系統以及數字訊號處理
- 影像處理中的valid卷積與same卷積卷積
- FPGA數字訊號處理(23)FSK解調技術(包絡檢波法)FPGA
- FPGA數字訊號處理(十三)鎖相環位同步技術的實現FPGA
- FPGA設計--數字的表示形式(程式碼+波形圖)FPGA
- 優化基於FPGA的深度卷積神經網路的加速器設計優化FPGA卷積神經網路
- 用於影像降噪的卷積自編碼器 | 視覺進階卷積視覺
- Vue(27)vue-codemirror實現線上程式碼編譯器Vue編譯
- python處理瀏覽器URL編碼Python瀏覽器
- 學習筆記1——數字基帶訊號編碼筆記
- 數字訊號處理c語言程式集C語言
- 更新計算機處理器微碼計算機
- 高通WCD9375音訊編解碼器/數字濾波器晶片簡介音訊晶片
- 普適注意力:用於機器翻譯的2D卷積神經網路,顯著優於編碼器-解碼器架構卷積神經網路架構
- gcc 編譯器與 clang 編譯器GC編譯
- Sidekiq 訊號處理原始碼分析IDE原始碼
- 數棧產品中的程式碼編譯器編譯
- 用深度卷積自編碼器在10分鐘內降低影像噪聲卷積
- 常見處理器MCU、MPU、DSP、FPGA等嵌入式處理器FPGA
- Aupera:FPGA讓視訊編碼與AI結合水到渠成FPGAAI
- 程式碼線上編譯器(上)- 編輯及編譯編譯
- 數字影像處理(一)之灰度轉換和卷積python實現卷積Python
- 訊號處理基本引數
- 字元編碼與檔案處理字元
- 程式設計師都應學習程式碼編譯器知識程式設計師編譯
- 計算機組成與設計(4)-----處理器計算機
- 深度學習高效計算與處理器設計深度學習