CCSDS標準的LDPC編譯碼仿真

   文檔採用MATLAB發佈,仿真沒有跑完。

CCSDS標準的LDPC編譯碼仿真

本腳本完成了CCSDS標準(o1)版本中適用於深空通訊任務的LDPC編譯碼過程的仿真, 同時給出了在信息位長度爲1024,碼率爲1/2時的誤碼率仿真結果css

  撰寫人:***
  最後修改日期:2015-03-07
  軟件版本:MATLAB(R) 2014a

和以前版本(LDPC_Simulation.m)對比,本程序添加功能包括html

  1. 完成了校驗矩陣構造(ccsdscheckmatrix.m)
  2. 經過校驗矩陣構造(準循環)生成矩陣 (ccsdsgeneratematrix.m)
  3. 按照ccsds所述,對編碼後數據進行截取,完成符合ccsds文檔的ldpc編譯碼仿真

程序修改包括算法

  1. 以前文件夾內的譯碼函數均不能對全0項進行正確的處理
  2. 問題將獲得合適的修正,同時優化了輸出顯示

Contents

初始設置

清空工做區,數據,關閉全部窗口app

clc;clear all;close all;

仿真參數設置函數

EbN0_dB = 1;                             % EbN0_dB 誤碼率範圍,向量;
FRAMES_NUM = 1;                          % FRAMES_NUM 最大仿真幀數目;
MAX_ITER_NUM = 30;                       % MAX_ITER_NUM 算法最大迭代次數;
MAX_ERROR_FRAME = 200;                   % MAX_ERROR_FRAME 仿真最大錯誤幀數目;
bitError = zeros(1,length(EbN0_dB));     % bitError 誤碼數目統計,向量;
BER = bitError;                          % BER 誤碼率,向量;
frameError = bitError;                   % frameError 誤幀數目;
iterNumTotal = zeros(1,length(EbN0_dB)); % iterNumTotal 總迭代次數統計,向量;
INFO_LENGTH = 1024;                      % INFO_LENGTH 信息位長度
RATE = 1/2;                              % RATE 碼率
SIZE_M = 512;                            % M矩陣大小(參考CCSDS文檔)

打開(新建)文件,保存運行數據優化

FILE_NAME = ['LDPC_CCSDS_' datestr(now,'yyyymmdd') '.txt'];
fid = fopen(FILE_NAME,'at+');
fprintf(fid,'日期 %s\n',datestr(now,'yyyymmdd'));
fprintf(fid,'%s\n','CCSDS的LDPC標準中section3中的碼,06年版');
fprintf(fid,'信息位長度 = %d, ',INFO_LENGTH);
fprintf(fid,'碼率 = %d, ',RATE);

H爲校驗矩陣;G爲生成矩陣。經過調用函數實現this

H = ccsdscheckmatrix(SIZE_M,RATE);
G = ccsdsgeneratematrix(H,SIZE_M,RATE);
LDPC_Simulation_ccsds_01 LDPC_Simulation_ccsds_02

譯碼準備編碼

[r_mark,c_mark] = find(H~=0);
HColNum = sum(H);
HRowNum = cell(1,size(H,1));
for rowH = 1:size(H,1)
    HRowNum{rowH} = find(r_mark==rowH);
end

誤碼率仿真

在不一樣EbN0下,對誤碼率進行仿真spa

for nEbN0 = 1:length(EbN0_dB)

多幀取統計平均3d

    for nF=1:FRAMES_NUM

編碼過程

        message = randi([0 1],1,INFO_LENGTH);
        encodeData = mod(message*G,2);

調製

        transmitSignal = 2*encodeData - 1;   %映射 0—-1; 1—+1
        transmitSignalPower = sqrt(var(transmitSignal));
        transmitSignal = transmitSignal/transmitSignalPower;%歸一化

AWGN 信道,SNR和EbN0換算關係

LDPC_Simulation_ccsds_eq30691

        SNR_dB = EbN0_dB((nEbN0)) + 10*log10(2)+10*log10(RATE);
        SNR = 10^(SNR_dB/10);
        noise = randn(1,length(transmitSignal));
        noise = noise/sqrt(SNR);     %SNR換算,加噪聲
        receiveSignal = transmitSignal + noise;

根據CCSDS文檔實際上有M個符號沒有被傳送,此處取其值爲0,作仿真上的等效

        receiveSignal(end-1*SIZE_M+1:end-0*SIZE_M) = 0;

譯碼,可調用不一樣的函數

        [iterNum,recoverData] = ...
            ldpcdecoderllr(H,HRowNum,HColNum,receiveSignal,SNR,MAX_ITER_NUM);
            %ldpcdecoderbp1(H,HRowNum,HColNum,receiveSignal,SNR,MAX_ITER_NUM);
            %ldpcdecoderminsum(H,HRowNum,HColNum,receiveSignal,SNR,MAX_ITER_NUM);
        % 文件輸出
        if(nEbN0==1 && nF==1)
            fprintf(fid,'譯碼程序爲ldpcdecoderllr\n');
            fprintf(fid,'最大迭代次數 = %d, ',MAX_ITER_NUM);
            fprintf(fid,'\n-------------------------------\n');
            fprintf(fid,'EbN0\t 總幀數\t 誤幀數\t 誤比特數\t 平均迭代次數\t 誤比特率\t 誤幀率\n');
            % MATLAB的readtable笨笨的不認識中文,因此打一行給他看
            fprintf(fid,'EbN0\t T_Frame\t E_Frames\t E_Bits\t A_IterNums\t BER\t FER\n');
        end

誤比特數,誤幀數,迭代次數統計

        bitError(nEbN0) = bitError(nEbN0) + ...
            sum(abs(message - recoverData(1:length(message))));
        frameError(nEbN0) = frameError(nEbN0) + ...
            (sum(abs(encodeData - recoverData(1:length(encodeData))))~=0);
        iterNumTotal(nEbN0) = iterNumTotal(nEbN0) + iterNum;

中止條件和文件輸出

         if ( frameError(nEbN0)>=MAX_ERROR_FRAME || nF==FRAMES_NUM)
            BER(nEbN0) = bitError(nEbN0)/nF/length(message);
            fprintf(fid,'%3.2g\t %5d\t %4d\t ',EbN0_dB(nEbN0),nF,frameError(nEbN0));
            fprintf(fid,'%8d\t %8.6g\t ',bitError(nEbN0),iterNumTotal(nEbN0)/nF);
            fprintf(fid,'%e\t %e\n',BER(nEbN0),frameError(nEbN0)/nF);
             break;
         end
         if (mod(nf,100)==0)
            BER(nEbN0) = bitError(nEbN0)/nF/320;
            fprintf(fid,'\n-------------------------------\n');
            fprintf('Eb/No = %e \n',EbN0_dB(nEbN0));
            fprintf('總幀數 = %d, ',nF);
            fprintf('誤幀數 = %d, ',frameError(nEbN0));
            fprintf('誤比特數 = %d, ',bitError(nEbN0));
            fprintf('最大迭代次數 = %d, ',MAX_ITER_NUM);
            fprintf('平均迭代次數 = %e, ',iterNumTotal(nEbN0)/nF);
            fprintf('誤碼率 = %g, ',BER(nEbN0));
            fprintf('誤幀率 = %g \n',frameError(nEbN0)/nF);
         end
    end
end

仿真結果

經過編碼後實際誤碼率對比圖,不要看下面的圖,圖沒有仿真出來的,太慢了

fclose(fid);
readtable(FILE_NAME,'HeaderLines',6,'Delimiter','\t')
semilogy(EbN0_dB,BER,'r');
xlabel('Eb/N0(dB)'); ylabel('BER');
grid on;
ans = 

    EbN0    T_Frame    E_Frames    E_Bits    A_IterNums    BER    FER
    ____    _______    ________    ______    __________    ___    ___

    1       1          0           0         27            0      0  
LDPC_Simulation_ccsds_03
相關文章
相關標籤/搜索