clear all
close all
clc
%% 预定义变量
N = 2016;
K = 1008;
R = K/N;
%% 添加工作路径
addpath('Encoder')
addpath('Decoder')
%% H矩阵生成
[ H, Hp, Hs ] = HxMatrixGen();
%% 求四种算法随着Eb/N0变化得出的BER FER
alpha = 0.7; beta = 0.5;
Eb_N0_dB = -1:0.5:2;
BER = zeros(4, length(Eb_N0_dB));
FER = zeros(4, length(Eb_N0_dB));
recordStr = [' SP', ' MS', ' NMS', ' OMS'];
% 日志记录到 mydiary.txt
diary 'mylog.txt'
clock;
for Eb_N0_i = 1:1:length(Eb_N0_dB)
disp(['Eb/N0=' num2str(Eb_N0_dB(Eb_N0_i)) 'dB is simulating...']);
% 设定停止条件
if Eb_N0_dB(Eb_N0_i) <= 1
maxErrorBlocks = 50;
else
maxErrorBlocks = 3;
end
% 设定译码算法最大迭代次数
iterMax = 30;
%设定每个信噪比下最大仿真帧个数
maxBlocks = 10^6;
% 四种算法的总误码数ErrorBits 和 总误帧数ErrorBlocks 和 所有帧的总循环数blocks 在每个Eb/N0仿真前清零
ErrorBits_SP = 0; ErrorBits_MS = 0;
ErrorBits_NMS = 0; ErrorBits_OMS = 0;
ErrorBlocks_SP = 0; ErrorBlocks_MS = 0;
ErrorBlocks_NMS = 0; ErrorBlocks_OMS = 0;
blocks_SP = 0;blocks_MS = 0;
blocks_NMS = 0; blocks_OMS = 0;
% 编码 - BPSK - AWGN
for i = 1:1:maxBlocks
recordStr = [];
% 算法2编码(s --> x)
s = randi([0, 1], 1, 1008);
x = Encoder2(Hs, Hp, s);
if sum(mod(H*(x'), 2)) > 0
sprintf('the '+ num2str(i) + ' th encoding is not right');
continue;
end
% BPSK调制
d = 1 - 2.*x;
% AWGN
SNR_dB = Eb_N0_dB(Eb_N0_i) + 10*log10(R) - 10*log10(1/2);
SNR_linear = 10^(SNR_dB/10);
sigma = sqrt(1/SNR_linear);
y = d + sigma*randn(size(d)); % 加噪声
% 译码端接收
LLR_y = 2*y/(sigma^2);
%四种算法分别译码
%四种算法在 某一Eb/N0下 某一帧传输中 的误比特数 errorbits
%四种算法在某一Eb/N0下所有帧的总误比特数 ErrorBits
%四种算法在某一Eb/N0下所有帧的总误帧数 ErrorBlocks
%四种算法在某一Eb/N0下所有帧的总循环数 blocks
if ErrorBlocks_SP <= maxErrorBlocks
v_SP = LDPCDecoder_SP( H, LLR_y, iterMax );
errorbits_SP = sum(s ~= v_SP);
ErrorBits_SP = ErrorBits_SP + errorbits_SP;
blocks_SP = blocks_SP + 1;
if errorbits_SP ~= 0
ErrorBlocks_SP = ErrorBlocks_SP + 1;
end
recordStr = [recordStr ' SP'];
end
if ErrorBlocks_MS <= maxErrorBlocks
v_MS = LDPCDecoder_MS( H, LLR_y, iterMax );
errorbits_MS = sum(s ~= v_MS);
ErrorBits_MS = ErrorBits_MS + errorbits_MS;
blocks_MS = blocks_MS + 1;
if errorbits_MS ~= 0
ErrorBlocks_MS = ErrorBlocks_MS + 1;
end
recordStr = [recordStr ' MS'];
end
if ErrorBlocks_NMS <= maxErrorBlocks
v_NMS = LDPCDecoder_NMS( H, LLR_y, alpha, iterMax );
errorbits_NMS = sum(s ~= v_NMS);
ErrorBits_NMS = ErrorBits_NMS + errorbits_NMS;
blocks_NMS = blocks_NMS + 1;
if errorbits_NMS ~= 0
ErrorBlocks_NMS = ErrorBlocks_NMS + 1;
end
recordStr = [recordStr ' NMS'];
end
if ErrorBlocks_OMS <= maxErrorBlocks
v_OMS = LDPCDecoder_OMS( H, LLR_y, beta, iterMax );
errorbits_OMS = sum(s ~= v_OMS);
ErrorBits_OMS = ErrorBits_OMS + errorbits_OMS;
blocks_OMS= blocks_OMS + 1;
if errorbits_OMS ~= 0
ErrorBlocks_OMS = ErrorBlocks_OMS + 1;
end
recordStr = [recordStr ' OMS'];
end
disp([' the ' num2str(i) '-th frame of encoding & decoding has finished based on Eb/N0 = ' num2str(Eb_N0_dB(Eb_N0_i)) ', ' recordStr ' is still running.']);
if ErrorBlocks_SP > maxErrorBlocks && ErrorBlocks_MS > maxErrorBlocks && ErrorBlocks_NMS > maxErrorBlocks && ErrorBlocks_OMS > maxErrorBlocks
break;
end
end
BER(1, Eb_N0_i) = ErrorBits_SP/(K * blocks_SP);
BER(2, Eb_N0_i) = ErrorBits_MS/(K * blocks_MS);
BER(3, Eb_N0_i) = ErrorBits_NMS/(K * blocks_NMS);
BER(4, Eb_N0_i) = ErrorBits_OMS/(K * blocks_OMS);
FER(1, Eb_N0_i) = ErrorBlocks_SP/blocks_SP;
FER(2, Eb_N0_i) = ErrorBlocks_MS/blocks_MS;
FER(3, Eb_N0_i) = ErrorBlocks_NMS/blocks_NMS;
FER(4, Eb_N0_i) = ErrorBlocks_OMS/blocks_OMS;
end
% 绘制 FER 和 BER
xlswrite('./BERofFourAlgorithm.xlsx', BER);
xlswrite('./FERofFourAlgorithm.xlsx', FER);
figure('numbertitle','off','name','BER of 4 Decode algorithms')
semilogy(Eb_N0_dB, BER(1, :), 'K-^', 'LineWidth', 1.0, 'MarkerSize', 6); hold on; % SP 三角marker 黑线
semilogy(Eb_N0_dB, BER(2, :), 'R-o', 'LineWidth', 1.0, 'MarkerSize', 6); hold on; % MS 圆形marker 红线
semilogy(Eb_N0_dB, BER(3, :), 'Y-s', 'LineWidth', 1.0, 'MarkerSize', 6); hold on; % NMS 正方marker 黄线
semilogy(Eb_N0_dB, BER(4, :), 'B-d', 'LineWidth', 1.0, 'MarkerSize', 6); % OMS 菱形marker 蓝线
xlabel('Eb/N0(dB)'); ylabel('BER');
legend('BER - SP', 'BER - MS', 'BER - NMS', 'BER - OMS')
grid on;
figure('numbertitle','off','name','FER of 4 Decode algorithms')
semilogy(Eb_N0_dB, FER(1, :), 'K--^', 'LineWidth', 1.0, 'MarkerSize', 6); hold on; % SP 三角marker 黑线
semilogy(Eb_N0_dB, FER(2, :), 'R--o', 'LineWidth', 1.0, 'MarkerSize', 6); hold on; % MS 圆形marker 红线
semilogy(Eb_N0_dB, FER(3, :), 'Y--s', 'LineWidth', 1.0, 'MarkerSize', 6); hold on; % NMS 正方marker 黄线
semilogy(Eb_N0_dB, FER(4, :), 'B--d', 'LineWidth', 1.0, 'MarkerSize', 6); % OMS 菱形marker 蓝线
xlabel('Eb/N0(dB)'); ylabel('FER');
legend('FER - SP', 'FER - MS', 'FER - NMS', 'FER - OMS')
grid on;
diary off
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于Matlab的LDPC编解码算法实现及LDPC码性能测试 本文档使用Typora软件编辑,Github由于无法解析部分语法可能会出现乱码,出现乱码请使用Typora打开即可。 行间公式出现乱码时:Typora软件勾选 “插入内联公式” 选项,点击“文件” --> “偏好设置” --> “Markdown” --> “Markdown扩展语法” —> 勾选 “内联公式(例:$ \LaTeX $)” 另外提供了无乱码的pdf版文档。 仿真流程 仿真时无需输入额外参数,只需要把整个仓库clone到本地即可。 首先运行SearchBestAlpha.m脚本得到误码率最低时的α取值; 然后运行SearchBestBeta.m脚本得到误码率最低时的β值; 把上面得到的α和β值在Comparasionof4Algorithms.m中确定下来,直接运行Comparasionof4Algorithms.m即可比较4种译码算法的误码率和误帧率曲线
资源推荐
资源详情
资源评论
收起资源包目录
LDPC-Encoder-Decoder-main.zip (22个子文件)
LDPC-Encoder-Decoder-main
SearchBestBeta.m 2KB
SearchBestAlpha.m 2KB
Matrix(2016,1008)Block56.mat 343B
Pic
BestBeta.png 40KB
和积算法变量节点传递置信度给校验节点步骤的二分图.png 73KB
和积算法初始化步骤的二分图.png 62KB
两种编码算法的时间复杂度对比.png 25KB
程序脚本停止条件.png 3KB
FERComparison.png 121KB
BERComparison.png 81KB
仿真步骤.png 37KB
BestAlpha.png 36KB
和积算法校验节点传递置信度给变量节点步骤的二分图.png 81KB
源码文件说明.png 203KB
修改信噪比仿真范围.png 4KB
Comparasionof4Algorithms.m 6KB
Decoder
LDPCDecoder_SP.m 2KB
LDPCDecoder_NMS.m 2KB
LDPCDecoder_MS.m 2KB
LDPCDecoder_OMS.m 2KB
Encoder
Encoder2.m 823B
HxMatrixGen.m 1KB
共 22 条
- 1
资源评论
博士僧小星
- 粉丝: 1774
- 资源: 5875
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功