文檔採用MATLAB發佈,仿真沒有跑完。
本腳本完成了CCSDS標準(o1)版本中適用於深空通訊任務的LDPC編譯碼過程的仿真, 同時給出了在信息位長度爲1024,碼率爲1/2時的誤碼率仿真結果css
撰寫人:*** 最後修改日期:2015-03-07 軟件版本:MATLAB(R) 2014a
和以前版本(LDPC_Simulation.m)對比,本程序添加功能包括html
程序修改包括算法
清空工做區,數據,關閉全部窗口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);
譯碼準備編碼
[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換算關係
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