FPGA數字訊號處理(26)加擾器與解擾器設計
加擾與解擾
設計數字通訊系統時,必須考慮傳送資訊的訊號特徵,這些特徵會影響到設計效能。總的來說,傳送的資訊應注意:(1).避免出現長串的0或1,否則對於從0、1交換點處提取位同步資訊的系統,容易錯判導致失去同步;(2).避免傳輸訊號具有周期性,否則在多路傳輸的通訊系統中容易造成串擾。
通道編碼中的加擾器和解擾器便是完成上述功能,將傳送訊號處理成沒有長傳的0或1,並且數字訊號最小週期足夠長。對訊號加擾處理可以使其統計特性接近於高斯白噪聲的統計特性,在接收端需要用逆運算解擾恢復出原始傳送序列。
加擾器可以採用一個帶反饋的移位暫存器生成偽隨機序列,對資料進行加擾。需要選擇的引數有生成多項式和移位暫存器初始狀態(不能是0,否則輸入為0時輸出恆為0)。如一個加擾器結構如下:
加擾器由移位暫存器和異或門(有些文獻中稱為模2加法器)組成,選擇的生成多項式決定了每級暫存器是否接到異或門中。上圖中bk=ak^bk-2^bk-3^bk-4^bk-8,解擾時採用逆運算即可,結構如下所示:
上圖中ck=bk^bk-2^bk-3^bk-4^bk-8=ak,恢復出原始資料。
MATLAB設計
使用MATLAB模擬加擾和解擾的過程,程式碼很簡單,如下:
x = randi(2,1,1000)-1; %原始隨機序列
%----------------------------------------%
%%% ------------ 加擾器 ------------ %%%
%----------------------------------------%
%scrambler = randi(2,1,8)-1; %加擾器移位暫存器初始狀態
scrambler = [0,1,1,0,1,1,1,1];
descrambler = scrambler;
y_scrambler = zeros(1,1000);
for i = 1 : 1000
z(1) = bitxor(scrambler(1),scrambler(5)); %模2加法器(異或)
z(2) = bitxor(z(1),scrambler(6));
z(3) = bitxor(z(2),scrambler(7));
y_scrambler(i) = bitxor(z(3),x(i));
for j = 1 : 7 %移位寄存
scrambler(j) = scrambler(j+1);
end
scrambler(8) = y_scrambler(i);
end
%----------------------------------------%
%%% ------------ 解擾器 ------------ %%%
%----------------------------------------%
y_descrambler = zeros(1,1000);
for i = 1 : 1000
z(1) = bitxor(descrambler(1),descrambler(5)); %模2加法器(異或)
z(2) = bitxor(z(1),descrambler(6));
z(3) = bitxor(z(2),descrambler(7));
y_descrambler(i) = bitxor(z(3),y_scrambler(i));
for j = 1 : 7 %移位寄存
descrambler(j) = descrambler(j+1);
end
descrambler(8) = y_scrambler(i);
end
加擾與解擾結果對比如下(無噪聲情況下),可以看到原始資料與解擾後資料完全一致:
為了體現加擾器的功能,將原始序列設定為全1。再次執行結果如下,可以看到加擾器將長傳的1轉換為了近似隨機序列:
FPGA設計
在Vivado中完成演算法設計及模擬。該設計很簡單,僅僅包含移位暫存器和異或門。異或門在FPGA中會轉換為查詢表實現,因此整體設計可以在很高的時脈頻率下執行。加擾器程式碼如下:
`timescale 1ns / 1ps
//-------------------------------------------------------------------------
// 加擾器設計,written by劉奇,2018.09.15
//-------------------------------------------------------------------------
module Scrambler
(
input clk,
input rst_n,
input din,
output dout
);
//-------------------------------------------------------------------------
// 移位暫存器部分
//-------------------------------------------------------------------------wire temp;
reg [7:0] scrambler_reg = 8'b11110110; //初始狀態
always @ (posedge clk or negedge rst_n)
if (!rst_n) scrambler_reg <= 8'b11110110;
else scrambler_reg <= {temp,scrambler_reg[7:1]};
//-------------------------------------------------------------------------
// 模2加法器設計
//-------------------------------------------------------------------------
assign temp = din ^ scrambler_reg[6] ^ scrambler_reg[5] ^ scrambler_reg[4] ^ scrambler_reg[0];
assign dout = temp;
endmodule
解擾器程式碼如下:
`timescale 1ns / 1ps
//-------------------------------------------------------------------------
// 解擾器設計,written by劉奇,2018.09.15
//-------------------------------------------------------------------------
module Descrambler
(
input clk,
input rst_n,
input din,
input s_tvalid,
output dout
);
//-------------------------------------------------------------------------
// 移位暫存器部分
//-------------------------------------------------------------------------
reg [7:0] descrambler_reg = 8'b11110110; //初始狀態
always @ (posedge clk or negedge rst_n)
if (!rst_n) descrambler_reg <= 8'b11110110;
else if (s_tvalid) descrambler_reg <= {din,descrambler_reg[7:1]};
//-------------------------------------------------------------------------
// 模2加法器設計
//-------------------------------------------------------------------------
reg dout_reg;
always @ (posedge clk or negedge rst_n)
if (!rst_n) dout_reg <= 0;
else if (s_tvalid)
dout_reg <= din ^ descrambler_reg[6] ^ descrambler_reg[5] ^ descrambler_reg[4] ^ descrambler_reg[0];
assign dout = dout_reg;
endmodule
模擬時將加擾器和解擾器級聯在一起,即資料加擾後再進行解擾。原始序列由MATLAB生成並儲存在txt檔案中,在testbench中讀取呼叫。模擬結果如下圖所示,看到原始資料din和解擾輸出descrambler_out完全一致,僅有一個時鐘週期的延遲:
System Generator設計
模擬結果如下圖所示,看到原始資料和解擾輸出完全一致,只是之間有些延遲:
相關文章
- FPGA數字訊號處理(27)卷積編碼器與Viterbi譯碼器設計FPGA卷積Viterbi
- FPGA數字訊號處理(24)數字相關器設計(簡化結構)FPGA
- FPGA數字訊號處理(25)數字相關器設計(經典結構)FPGA
- MATLAB訊號處理——數字濾波器的設計Matlab
- FPGA數字訊號處理(22)FSK調製技術FPGA
- 大牛講解訊號與系統以及數字訊號處理
- 語音訊號預處理——數字濾波器音訊
- 數字訊號處理實驗(四):數字濾波器結構
- FPGA數字訊號處理(23)FSK解調技術(包絡檢波法)FPGA
- 數字訊號處理基礎----插值、抽取濾波器
- FPGA數字訊號處理(十三)鎖相環位同步技術的實現FPGA
- 數字訊號處理c語言程式集C語言
- 資料庫設計的困擾資料庫
- 常見處理器MCU、MPU、DSP、FPGA等嵌入式處理器FPGA
- 訊號處理基本引數
- 計算機組成與設計(4)-----處理器計算機
- 深度學習高效計算與處理器設計深度學習
- 數字訊號處理:運用FFT簡單濾波FFT
- linux 訊號與處理Linux
- Linux訊號機制與訊號處理Linux
- C++數字訊號處理演算法庫SP++C++演算法
- MATLAB數字訊號處理(2)LFM脈衝雷達回波處理模擬Matlab
- FPGA經典:Verilog傳奇與基於FPGA的數字影像處理原理及應用FPGA
- 數字訊號處理實驗一(離散時間訊號的MATLAB實現)Matlab
- 訊號、系統與訊號處理邊角雜談
- 解讀計算機處理器之殤 - Meltdown 與 Spectre計算機
- 為什麼總有無數的Bug困擾著程式設計師程式設計師
- 註解處理器
- 前處理器變數變數
- MATLAB數字訊號處理(1)四種經典功率譜估計方法比較Matlab
- 數字訊號處理:線性卷積、迴圈卷積、圓周卷積計算卷積
- (ADRC)自抗擾控制器(二)——四旋翼無人機無人機
- 細說 ReactiveCocoa 的冷訊號與熱訊號(三):怎麼處理冷訊號與熱訊號React
- 防止FPGA設計中綜合後的訊號被優化FPGA優化
- MIPS單週期處理器設計
- linux中的訊號處理與SROPLinux
- 處理器運算位數
- FPGA設計--數字的表示形式(程式碼+波形圖)FPGA