采用Turbo编码的图像传输试验(AWAG信道,matlab实现)分别验证了不同交织器类型,交织深度对turbo码性能的影响
圖1.1 Turbo碼編碼器結構
在Turbo碼編碼過程中,兩個分量碼的輸入信息序列是相同的,長度為N的信息序列{uk}在送入第一個分量編碼器(RSC1)進行編碼的同時作為系統輸出{xks}直接送至復接器,同時{uk}經過交織器I后的交織序列{x1p}送入第二個分量編碼(RSC2)。其中,n=I(k),0<n,k<N-1。I()為交織映射函數,N為交織長度,即信息序列長度。兩個分量編碼器輸入序列僅僅是碼元的輸入順序不同。兩個分量編碼器輸出的校驗序列分別為{x1p}和【x2p}。為提高碼率和系統頻譜效率,可以將兩個校驗序列經過刪余矩陣刪余得到(xkp},再與系統輸出{}一起經過復接構成碼字序列(ck)。
Turbo碼的分量碼采用迭代系統卷積碼,這是Turbo碼性能優越的一個重要原因。分量編碼器可以選用遞歸系統卷積(RSC,Recursive Systematic Convolutional)碼或非系統卷積(NSC,Nonsystematic Convolutional Code)碼。給定一個RSC碼總能夠找到一個生成多項式與之對應的NSC碼,反之也一樣。
交織實際上就是將數據序列中元素的位置進行重置,從而得到交織序列的過程。這個過程的逆過程就是在交織序列的基礎上將交織序列中的元素恢復原有順序,從而恢復原始序列的過程,這個過程一般也稱為解交織過程。實現交織解交織過程的設備就稱為交織器和解交織器。
1.1交織器的基本原理
交織是指一個數據序列在一一對應的條件下進行數據位置的重排過程。其逆過程為解交織,也就是將接收到的信息序列進行位置交換,使數據的位置還原成發送時的順序。假設輸入序列為c=(c1,c2,c3,…,cN),那么其輸出序列及映射關系如下圖所示:
圖1.1 交織原理
1.2常用交織器的介紹
1.2.1倒序交織器
倒序交織器原理較為簡單,只需將輸入序列按照逆序輸出即可。該方法需要的計算資源少,交織時延短,但交織前后序列的相關性較大。
1.2.2分組交織器
分組交織器是比較常見的一類交織器,它廣泛應用于通信系統中。其交織過程描述如下:首先將輸入信息序列按照行的順序寫入一個的矩陣,然后將數據按列讀出。相對應的解交織處理就是將數據按列寫入相同的矩陣,然后按行讀出。
具體的讀寫順序如下圖所示:
分組交織器和其解交織器相對比較容易實現。但分組交織存在一個比較明顯的缺點,就是對于那些低重量輸入序列,交織前后,其重量分布不變(實驗證明:在這種情況下,生成的 Turbo 碼的性能較差)。
1.2.3螺旋交織器
分組螺旋交織器首先將輸入序列按行寫入一個的矩陣,與互為素數。交織時從矩陣的左上角到右下角方向讀出數據,每向右移一位的同時向下移一位,即行和列索引同時遞增,步長為。通常要求為分量碼約束長度的整數倍。假設ri和ci分別表示第i個比特的行和列的索引,則分組螺旋交織器下一個要讀取的數據的行列索引分別為:
其中,i=0,1,2,…,N-1。 遞歸的初始值設置為r0 =0,c0 = 0。
下圖給出了分組螺旋交織示意圖,按照圖中a-b-c-d-e-f的順序依次讀取數據即可得到交織輸出。當然,分組螺旋交織過程也可以從交織矩陣的左下角到右上角讀取數據,結果如下圖所示:
圖1.3 螺旋交織器
1.2.4隨機交織器
首先給序列中的每一比特位都賦予隨機產生的映射地址(交織向量),然后用查表的方式實現碼元交織。使用這種交織器,會使編碼所需存儲量增加,但交織后碼元間的相關性大大降低。其原理如下圖所示:
圖1.4 隨機交織器
實驗仿真:
2.1 參數設置
我們利用 Matlab對各交織器方案進行了仿真,各參數設置如下:
信息序列:由隨機函數產生,序列長度為25600。
編碼結構:選用4, [13 15 17],13的 RSC 編碼,編碼速率為 1/3,這也是1/3碼率下的ccdcn編碼標準。
交織長度: 128、256、512、1024。
調制解調方式:采用BPSK調制與解調。
道模型:高斯加性白噪聲無記憶信道(AWGN)。
譯碼器:采用對數最大后驗概率(LOGMAP)譯碼算法,迭代次數為 4 次。
交織器類型:倒序交織器,倒序輸出。行列式分組交織:分組矩陣選 16*(length/16);隨機交織:利用迭代算法得到。
2.2 仿真結果
根據設置的參數,EbNo設置為-16db~0db,交織深度設置為256,分別選擇倒序交織器、分組交織器、隨機交織器進行仿真,得到如下結果:
圖2.1 交織器類型對Turbo性能的影響
從上圖可以看出:隨著信道信噪比從-15db逐漸提高,隨機交織器、分組交織器在-6db時誤碼率已經趨近于0。而倒序交織器在-4db至-3db時才趨近于0。隨機交織器相比倒序交織器,降低了序列的相關性,提高了編碼性能。分組交織器與隨機交織器性能相近,但隨機交織后的序列相關性較好。
隨后,針對隨機交織器這一類型,研究交織深度對編碼性能的影響,分別選擇交織深度為128、256、512、1024,得到如下結果:
圖2.2 交織深度對Turbo性能的影響
從上圖可以看出:隨著信道信噪比從-15db逐漸提高,編碼深度為1024的曲線信噪比為-7db時誤碼率已經趨近于0,性能明顯優于其他交織深度;而交織深度為128的曲線,在-5db是誤碼率依然較高,收斂較慢。可以看出對于同一交織器,交織深度越大,編碼性能越好。
隨后我們輸入圖像,進行分析:
這里我們以灰度圖像lena(512*512)為例,采用BPSK調制與解調,信道環境為AWAG信道,信噪比為6db。
圖像在0db下分別經卷積編碼,和Turbo編碼后的傳輸質量分析:
進行試驗,結果如上圖所示:左圖原始圖像,中間為經調制,過信道,解調后的圖像,右圖為錯誤序列。信道信噪比為0db。第一行是經卷積編碼后經信道(加入信噪比6db的高斯白噪聲)的圖像。第二行是圖像經Turbo編碼后過信道的圖像。由前述可知,在-6db時Turbo誤碼率已經接近于0。而在0db條件下,卷積碼誤碼率仍然較高。這6db的提升帶來的可能是幾百萬的收益。
分析上圖的結果可知,采用不同的信道編碼的傳輸系統效果不同,觀察原始圖像、接收圖像和錯誤圖像可知Turbo碼的性能較卷積碼有較大的提升,進而得出Turbo性能明顯優于卷積碼
2.驗證不同交織器類型對Turbo碼性能的影響
進行試驗,結果如上圖所示:左圖原始圖像,中間為經調制,過信道,解調后的圖像,右圖為錯誤序列。信道信噪比為-6db。第一行是采用倒序交織器經信道的圖像。第二行是圖像隨機交織器后過信道的圖像。分析上圖可知,交織器的結構對信道編碼的效果有較大的影響,對比分析經過隨機交織器和倒序交織器結構的Turbo圖像傳輸系統后的接收圖像與原始圖像可知,在此傳輸系統中倒序交織器性能更好。
以上是整個實驗過程。下面是實驗代碼:
1.主函數,讀取圖像,進行turbo編碼,bpsk調制,過awag信道,隨后依次解調,還原,得到傳輸后的圖像。
2.子程序:turbo編碼程序(包括不同的交織器代碼)
function [receive_data,error_bits] = Turbo_AWAG_chanel(data,EbNo,intrlvrIndices_type)noiseVar = 10^(-EbNo/10); %信噪比轉換rng default%% 交織器frmLen = length(data);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 交織器類型的選取 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1表示隨機交織器 2表示倒序交織器 3表示分組交織器 %%%%%%%%%%%%%if intrlvrIndices_type == 1intrlvrIndices = randperm(frmLen); %隨機交織 利用randperm產生隨機數列elseif intrlvrIndices_type == 2intrlvrIndices = (frmLen:-1:1); %倒序排列elseif intrlvrIndices_type == 3 %分組交織a = 1:frmLen;b = zeros(1,frmLen);m =16;n =frmLen/m;for i=1:frmLenj = mod(i-1,n)*m+floor((i-1)/n)+1;b(j) = a(i);endintrlvrIndices = b;end%% Turbo% Create a turbo encoder and decoder pair using the trellis structure given% by |poly2trellis(4,[13 15 17],13)| and |intrlvrIndices|.hTEnc = comm.TurboEncoder('TrellisStructure',poly2trellis(4, ...[13 15 17],13),'InterleaverIndices',intrlvrIndices);hTDec = comm.TurboDecoder('TrellisStructure',poly2trellis(4, ...[13 15 17],13),'InterleaverIndices',intrlvrIndices, ...'NumIterations',4); %Iterations表示迭代,該參數意為迭代階數%% BPSK% Create a BPSK modulator and demodulator pair, where the demodulator% outputs soft bits determined by using a log-likelihood ratio method.hMod = comm.BPSKModulator;hDemod = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio', ...'Variance',noiseVar);%% AWAG% Create an AWGN channel object and an error rate object.hChan = comm.AWGNChannel('EbNo',EbNo);hError = comm.ErrorRate;%% 數據處理encodedData = step(hTEnc,data);modSignal = step(hMod,encodedData);receivedSignal = step(hChan,modSignal);demodSignal = step(hDemod,receivedSignal);receiveBits = step(hTDec,-demodSignal);% receiveBits = zeros(length(demodSignal),1); % % for i=1:length(demodSignal) % if demodSignal(i)>=0 % receiveBits(i)=0; % elseif demodSignal(i)<0 % receiveBits(i)=1; % end % enderrorStats = step(hError,data,receiveBits);receive_data = receiveBits;error_bits = errorStats(1);end3.子程序:卷積編碼程序(添加卷積碼,目的是為了和turbo編碼進行比較,凸顯turbo編碼性能的優越性)
function [receive_data,error_bits] = ConvolutionalCreat(data,EbNo)noiseVar = 10^(-EbNo/10); %信噪比轉換%% 卷積碼 hConEnc = comm.ConvolutionalEncoder('TrellisStructure',poly2trellis(4, ...[13 15 17],13)); hDec = comm.ViterbiDecoder('TrellisStructure',poly2trellis(4, ...[13 15 17],13),'InputFormat','Hard');%% BPSK % Create a BPSK modulator and demodulator pair, where the demodulator % outputs soft bits determined by using a log-likelihood ratio method. hMod = comm.BPSKModulator; hDemod = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio', ...'Variance',noiseVar);%% AWAG % Create an AWGN channel object and an error rate object. hChan = comm.AWGNChannel('EbNo',EbNo); hError = comm.ErrorRate; %% % hConEnc = comm.ConvolutionalEncoder; % % hChan = comm.AWGNChannel('NoiseMethod', ... % 'Signal to noise ratio (SNR)',... % 'SNR',noiseVar); % hDemod = comm.DPSKDemodulator('BitOutput',true); % hDec = comm.ViterbiDecoder('InputFormat','Hard'); % hError = comm.ErrorRate('ComputationDelay',3,'ReceiveDelay', 34);%% encodedData = step(hConEnc,data);modSignal = step(hMod,encodedData);receivedSignal = step(hChan,modSignal);demodSignal = step(hDemod,receivedSignal);receiveBits = step(hDec,-demodSignal);% receiveBits = zeros(length(demodSignal),1); % % for i=1:length(demodSignal) % if demodSignal(i)>=0 % receiveBits(i)=0; % elseif demodSignal(i)<0 % receiveBits(i)=1; % end % enderrorStats = step(hError,data,receiveBits);receive_data = receiveBits;error_bits = errorStats(1);% % for counter = 1:20 % data = randi([0 1],30,1); % encodedData = step(hConEnc, data); % modSignal = step(hMod, encodedData); % receivedSignal = step(hChan, modSignal); % demodSignal = step(hDemod, receivedSignal); % receivedBits = step(hDec, demodSignal); % errors = step(hError, data, receivedBits); % end % %% % % Display the number of errors. % errors(2) end子程序——圖像調整代碼(功能是圖像整形,進制轉換)
function y=receive_image_reshape(receive_data)receive_data_2bit = reshape(receive_data,length(receive_data)/8,8);receice_10bit = bi2de(receive_data_2bit);receive_image = reshape(receice_10bit,sqrt(length(receice_10bit)),sqrt(length(receice_10bit))); %接收圖像receive_lena = uint8(receive_image); %雙精度數值轉換為UINT8型號y = receive_lena;end實驗圖像在此:可以下載
總結
以上是生活随笔為你收集整理的采用Turbo编码的图像传输试验(AWAG信道,matlab实现)分别验证了不同交织器类型,交织深度对turbo码性能的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优质城市宣传片方案怎样写?
- 下一篇: 【数字信号处理】fft幅频特性和相频特性