我用ai跑了一个研究sc译码算法性能的matlab代码,但是得到的结果一直很有问题
这是我的代码:
%% 参数设置
N = 256; % 码长
K = 128; % 信息比特数
EbN0_dB = 0:0.5:3; % 信噪比范围
max_errors = 100; % 每个SNR点最大错误数
max_runs = 1e5; % 每个SNR点最大仿真次数
%% 极化码构造
[channel_order, ~] = Gaussian_Approximation(N, K, 1); % 高斯近似构造
frozen_bits = ones(N,1);
frozen_bits(channel_order(1:K)) = 0; % 冻结位设置
%% 性能仿真
BLER = zeros(size(EbN0_dB));
BER = zeros(size(EbN0_dB));
for snr_idx = 1:length(EbN0_dB)
EbN0 = 10^(EbN0_dB(snr_idx)/10);
noise_var = 1/(2*K/N*EbN0); % 噪声方差
error_count = 0;
bit_error = 0;
total_runs = 0;
while (error_count < max_errors) && (total_runs < max_runs)
% 生成随机信息比特
info_bits = randi([0 1], K, 1);
% 极化编码
encoded_bits = polar_encode(info_bits, frozen_bits);
% BPSK调制
x = 1 - 2*encoded_bits;
% AWGN信道
y = x + sqrt(noise_var)*randn(size(x));
% SC译码
llr = 2*y/noise_var; % 计算LLR
decoded_bits = SC_Decode(llr, frozen_bits);
% 误码统计
errors = sum(info_bits ~= decoded_bits(frozen_bits == 0));
if errors > 0
error_count = error_count + 1;
bit_error = bit_error + errors;
end
total_runs = total_runs + 1;
end
BLER(snr_idx) = error_count/total_runs;
BER(snr_idx) = bit_error/(K*total_runs);
end
%% 画图
figure;
semilogy(EbN0_dB, BLER, 'b-o', 'LineWidth', 2); hold on;
semilogy(EbN0_dB, BER, 'r--s', 'LineWidth', 2);
grid on;
xlabel('Eb/N0 (dB)');
ylabel('Error Rate');
legend('BLER','BER');
title('SC译码性能分析');
%% 极化编码函数
function encoded_bits = polar_encode(info_bits, frozen_bits)
N = length(frozen_bits);
u = zeros(N,1);
u(frozen_bits == 0) = info_bits; % 冻结位填0
% 生成矩阵
n = log2(N);
F = [1 0; 1 1];
G = F;
for i = 1:n-1
G = kron(G, F);
end
encoded_bits = mod(G*u, 2);
end
%% SC译码函数
function decoded_bits = SC_Decode(llr, frozen_bits)
N = length(llr);
n = log2(N);
L = zeros(N, n+1); % 似然比存储
u_hat = zeros(N,1); % 判决结果
L(:,1) = llr; % 初始化LLR
% 递归计算
for bit = 1:N
if frozen_bits(bit) == 1
u_hat(bit) = 0; % 冻结位强制判0
else
u_hat(bit) = (L(bit,end) < 0); % 信息位判决
end
% 更新后续LLR
for layer = 1:n
[L, u_hat] = update_LLR(L, u_hat, bit, layer);
end
end
decoded_bits = u_hat;
end
function [L, u_hat] = update_LLR(L, u_hat, bit, layer)
% 实现LLR更新递归计算
step = 2^layer;
for i = 1:step/2:bit
if mod(ceil(i/(step/2)),2) == 1
upper = i;
lower = i + step/2;
L(upper, layer+1) = sign(L(upper,layer)) * sign(L(lower,layer)) * ...
min(abs(L(upper,layer)), abs(L(lower,layer)));
else
lower = i;
upper = i - step/2;
L(lower, layer+1) = L(lower,layer) + (1-2*u_hat(upper)) * L(upper,layer);
end
end
end
%% 高斯近似法构造极化码函数
function [channel_order, I] = Gaussian_Approximation(N, K, design_snr)
% 输入参数:
% N - 码长
% K - 信息位数
% design_snr - 设计SNR(dB)
% 输出:
% channel_order - 信道可靠度排序(从最可靠到最不可靠)
% I - 各信道的互信息值
n = log2(N);
sigma = 1/sqrt(2*10^(design_snr/10)); % 初始噪声方差
% 初始化对称容量
I = zeros(N,1);
I(1) = 2/sigma^2;
% 递归计算各层对称容量
for layer = 1:n
B = 2^layer;
for j = 1:B/2
index = (j-1)*2^(n-layer+1) + 1;
[I(index), I(index+2^(n-layer))] = ...
phi_transform(I(index), I(index+2^(n-layer)));
end
end
% 获取可靠信道索引
[~, channel_order] = sort(I, 'descend');
channel_order = channel_order(1:K); % 取前K个最可靠信道
end
function [I1, I2] = phi_transform(Ia, Ib)
% 高斯近似核心变换
I1 = Ia + Ib - Ia*Ib; % 上支路
I2 = Ia * Ib; % 下支路
end
这是我的代码:
%% 参数设置
N = 256; % 码长
K = 128; % 信息比特数
EbN0_dB = 0:0.5:3; % 信噪比范围
max_errors = 100; % 每个SNR点最大错误数
max_runs = 1e5; % 每个SNR点最大仿真次数
%% 极化码构造
[channel_order, ~] = Gaussian_Approximation(N, K, 1); % 高斯近似构造
frozen_bits = ones(N,1);
frozen_bits(channel_order(1:K)) = 0; % 冻结位设置
%% 性能仿真
BLER = zeros(size(EbN0_dB));
BER = zeros(size(EbN0_dB));
for snr_idx = 1:length(EbN0_dB)
EbN0 = 10^(EbN0_dB(snr_idx)/10);
noise_var = 1/(2*K/N*EbN0); % 噪声方差
error_count = 0;
bit_error = 0;
total_runs = 0;
while (error_count < max_errors) && (total_runs < max_runs)
% 生成随机信息比特
info_bits = randi([0 1], K, 1);
% 极化编码
encoded_bits = polar_encode(info_bits, frozen_bits);
% BPSK调制
x = 1 - 2*encoded_bits;
% AWGN信道
y = x + sqrt(noise_var)*randn(size(x));
% SC译码
llr = 2*y/noise_var; % 计算LLR
decoded_bits = SC_Decode(llr, frozen_bits);
% 误码统计
errors = sum(info_bits ~= decoded_bits(frozen_bits == 0));
if errors > 0
error_count = error_count + 1;
bit_error = bit_error + errors;
end
total_runs = total_runs + 1;
end
BLER(snr_idx) = error_count/total_runs;
BER(snr_idx) = bit_error/(K*total_runs);
end
%% 画图
figure;
semilogy(EbN0_dB, BLER, 'b-o', 'LineWidth', 2); hold on;
semilogy(EbN0_dB, BER, 'r--s', 'LineWidth', 2);
grid on;
xlabel('Eb/N0 (dB)');
ylabel('Error Rate');
legend('BLER','BER');
title('SC译码性能分析');
%% 极化编码函数
function encoded_bits = polar_encode(info_bits, frozen_bits)
N = length(frozen_bits);
u = zeros(N,1);
u(frozen_bits == 0) = info_bits; % 冻结位填0
% 生成矩阵
n = log2(N);
F = [1 0; 1 1];
G = F;
for i = 1:n-1
G = kron(G, F);
end
encoded_bits = mod(G*u, 2);
end
%% SC译码函数
function decoded_bits = SC_Decode(llr, frozen_bits)
N = length(llr);
n = log2(N);
L = zeros(N, n+1); % 似然比存储
u_hat = zeros(N,1); % 判决结果
L(:,1) = llr; % 初始化LLR
% 递归计算
for bit = 1:N
if frozen_bits(bit) == 1
u_hat(bit) = 0; % 冻结位强制判0
else
u_hat(bit) = (L(bit,end) < 0); % 信息位判决
end
% 更新后续LLR
for layer = 1:n
[L, u_hat] = update_LLR(L, u_hat, bit, layer);
end
end
decoded_bits = u_hat;
end
function [L, u_hat] = update_LLR(L, u_hat, bit, layer)
% 实现LLR更新递归计算
step = 2^layer;
for i = 1:step/2:bit
if mod(ceil(i/(step/2)),2) == 1
upper = i;
lower = i + step/2;
L(upper, layer+1) = sign(L(upper,layer)) * sign(L(lower,layer)) * ...
min(abs(L(upper,layer)), abs(L(lower,layer)));
else
lower = i;
upper = i - step/2;
L(lower, layer+1) = L(lower,layer) + (1-2*u_hat(upper)) * L(upper,layer);
end
end
end
%% 高斯近似法构造极化码函数
function [channel_order, I] = Gaussian_Approximation(N, K, design_snr)
% 输入参数:
% N - 码长
% K - 信息位数
% design_snr - 设计SNR(dB)
% 输出:
% channel_order - 信道可靠度排序(从最可靠到最不可靠)
% I - 各信道的互信息值
n = log2(N);
sigma = 1/sqrt(2*10^(design_snr/10)); % 初始噪声方差
% 初始化对称容量
I = zeros(N,1);
I(1) = 2/sigma^2;
% 递归计算各层对称容量
for layer = 1:n
B = 2^layer;
for j = 1:B/2
index = (j-1)*2^(n-layer+1) + 1;
[I(index), I(index+2^(n-layer))] = ...
phi_transform(I(index), I(index+2^(n-layer)));
end
end
% 获取可靠信道索引
[~, channel_order] = sort(I, 'descend');
channel_order = channel_order(1:K); % 取前K个最可靠信道
end
function [I1, I2] = phi_transform(Ia, Ib)
% 高斯近似核心变换
I1 = Ia + Ib - Ia*Ib; % 上支路
I2 = Ia * Ib; % 下支路
end

