老欧赖 soull10
关注数: 4 粉丝数: 3 发帖数: 310 关注贴吧数: 13
兄弟们,帮个忙 我用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
兄弟们,帮个忙 我用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
1 下一页