clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
K = 11;
N = 64;
R = K/N;
%% Channel Construction & Frozen bit (only for long code)
design_SNR = 0 +10*log10(R);
IW = get_Channel_Construction(K, N, design_SNR); % 子信道的信道容量
[info_bit_idx, frozen_bits] = get_info_and_frozen_location(IW, N, K); % 分别表示信息位的下标和冻结位的位置
%% Encoder
G = 1;
F = [1 0;1 1];
for j = 1:log2(N)
G = kron(G,F);
end % G 表示最终的生成矩阵
List = [1, 2, 4];
qAry = log2(2); % Normalized Signal
EBN0 = [0, 1, 2, 3,4]; % 信噪比的范围
countCycles = zeros(length(List),length(EBN0)) ; % 不同码率和信噪比时所运行的帧数
FER = zeros(length(List),length(EBN0)) ; % 误帧率
BER = zeros(length(List),length(EBN0)) ; % 误码率
bpskMod = comm.BPSKModulator; % 使用BPSK调制
qpskMod = comm.QPSKModulator('BitInput', true) ; % 使用 QPSK 调制
Frames = 1000; % 总帧数
batch = 1; % Batch size
imp_prob = 0.001; % impulse probability
%% Simulation
for Len = 1:length(List)
L = List(Len);
disp('# List:');
disp(L);
for time = 1:length(EBN0)
EbNo = EBN0(time);
error_Frames = 0;
error_Bits = 0;
correct = 0;
%% AWGN channel & Noise Power
% EsNo = EbNo + 10*log10(qAry);
% snrdB = EsNo + 10*log10(R);
noiseVar = 1./10.^(EbNo/10);
noiseVar = noiseVar * 2;
chan = comm.AWGNChannel('NoiseMethod','Variance','Variance',noiseVar);
bpskDemod = comm.BPSKDemodulator('DecisionMethod','Approximate log-likelihood ratio','Variance',noiseVar);
qpskDemod = comm.QPSKDemodulator('BitOutput',true ,'DecisionMethod','Approximate log-likelihood ratio','Variance',noiseVar);
Frames_errors = 0;
Batch_total_bits = 0;
Error_counter = 0;
%% Batch Data Generator :
while (Frames_errors <= 100 & Error_counter <= 20) % Error control Threshold
Error_counter = Error_counter +1;
disp("# Error_counter : " + num2str(Error_counter));
disp("--------------------------------------------------");
for num = 1: (Frames/batch) % each batchs
disp("**No_of_batch : " + num2str(num) + " **");
% info_bit = randi([0,1],1,K); % 获取随机的比特信息
batch_data = binornd(1, 0.5, batch, K);
% batch_data = ~batch_data;
% Mini-Batch each codewords decoding : iter
for iter = 1: batch % batch each codewords
% disp("**No_of_iteration : " + num2str(iter) + " **");
info_bit = batch_data(iter,:);
% 将信息序列存储到数组before_code_bit中
before_code_bit = zeros(1,N);
before_code_bit(info_bit_idx(:)) = info_bit(:);
S = polar_encode(N, before_code_bit); % 极化码编码
% frozen_bits_flag = frozen_bits';
% 开始调制
mod = qpskMod(S');
% rSig = chan(mod);
[rSig, impulse_index] = QPSK_Prob_Impulse_Channel(mod, noiseVar, imp_prob);
clip_signal = BG_Impulse_Clipper(rSig, noiseVar, imp_prob); % Clipper
% stop
rxLLR = qpskDemod(clip_signal); % Clipping
llr = rxLLR;
[dec_list] = SCL_CRCdecoder_llr(L, N, llr, noiseVar, info_bit_idx, G);
after_decode_bit = dec_list(:,1)';
% 解码之后的序列
codeword_errors = sum(info_bit ~= after_decode_bit);
% disp("**word_wrong_bits : " + num2str(codeword_errors));
Frames_errors = Frames_errors + codeword_errors;
disp("**Cumulative_error_bits : " + num2str(Frames_errors));
Batch_total_bits = Batch_total_bits + K;
disp("**Cumulative_total_bits : " + num2str(Batch_total_bits) + " **");
disp("--------------------------------------------------");
if (Frames_errors > 5500), break; end
end
% if batch_sum_errors > 5500 : leave loop
if (Frames_errors > 5500), break; end
end
continue % if error bits not enough: keep decoding
end
FER(Len,time) = Frames_errors ./ Batch_total_bits;
disp('# BER:');
disp(FER);
end
end
%% Plot BER
semilogy(EBN0,FER(1,:),'-*b',EBN0,FER(2,:),'-^r',EBN0,FER(3,:),'-sg');
xlabel('EBN0(dB)') %x轴坐标描述
ylabel('FER') %y轴坐标描述
legend('SCL List=1(SC)','SCL List=2','SCL List=4','SCL List=8'); %右上角标注
grid on
title('SCL decode N=256 R=0.5')
没有合适的资源?快使用搜索试试~ 我知道了~
Polar编码误码率matlab仿真,调制方式采用QPSK,译码算法采用SCL,信道为Awgn【包含程序操作录像,代码部分注释】
共16个文件
m:14个
jpg:1个
avi:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 16 下载量 7 浏览量
2023-11-17
01:28:11
上传
评论 12
收藏 2.07MB RAR 举报
温馨提示
1.版本:matlab2022A,包含仿真操作录像,操作录像使用windows media player播放。 2.领域:Polar编码 3.内容:Polar编码误码率matlab仿真,调制方式采用QPSK,译码算法采用SCL,信道为Awgn。对于Polar码的误码率仿真,使用QPSK调制和SCL(连续消除列表,分别对比1,2,4三种情况)译码算法,以及在AWGN(加性白高斯噪声)信道中的仿真。最后输出误码率曲线。 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
Polar编码误码率matlab仿真,调制方式采用QPSK,译码算法采用SCL,信道为Awgn.rar (16个子文件)
仿真操作录像0020.avi 560.4MB
1.jpg 49KB
CODE
Runme1_Polar_code_SCL.m 5KB
func
crc_check_result.m 1KB
PLOT_BER_SNR.m 533B
get_info_and_frozen_location.m 571B
QPSK_Prob_Impulse_Channel.m 789B
BG_Impulse_Clipper.m 873B
get_Channel_Construction.m 331B
QPSK_One_Symbol_Impulse_Channel.m 791B
crc_bit_add.m 1KB
BPSK_impulse_Channel.m 749B
polar_encode.m 463B
QPSK_AWGN_Channel.m 294B
BPSK_AWGN_Channel.m 283B
SCL_CRCdecoder_llr.m 4KB
共 16 条
- 1
fpga和matlab
- 粉丝: 17w+
- 资源: 2611
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页