Table 9-6 -- Codeword table for level_prefix


The syntax element level_prefix is decoded using the VLC specified in Table 9-6


%% OFDM系统参数设置 clear all; close all; clc; % 基本参数 N = 64; % 子载波数量 cp_len = 16; % 循环前缀长度 num_symbols = 100; % OFDM符号数量 mod_order = 4; % 调制阶数 (4=QPSK) snr = 5:2:15; % 信噪比范围(dB) num_snr_points = length(snr); %% LDPC编码设置 % 检查并加载DVB-S2 LDPC矩阵 if ~exist(&#39;dvbs2ldpc.mat&#39;, &#39;file&#39;) fprintf(&#39;正在下载DVB-S2 LDPC矩阵...\n&#39;); try websave(&#39;dvbs2ldpc.mat&#39;, &#39;https://www.mathworks.com/matlabcentral/mlc-downloads/downloads/submissions/46480/versions/1/dvbs2ldpc.mat&#39;); fprintf(&#39;下载成功!\n&#39;); catch error(&#39;无法下载dvbs2ldpc.mat文件,请检查网络连接&#39;); end end load(&#39;dvbs2ldpc.mat&#39;); % 选择码率 code_rate = 1/2; H = dvbs2ldpc(code_rate); ldpcEncoder = comm.LDPCEncoder(H); ldpcDecoder = comm.LDPCDecoder(H); % 获取LDPC编码参数 info_bits_per_block = ldpcEncoder.NumInformationBits; codeword_bits_per_block = ldpcEncoder.BlockLength; %% 数据长度计算与对齐 % 计算每个OFDM符号能承载的比特数 bits_per_symbol = N * log2(mod_order); % 计算总需要的编码比特数 required_encoded_bits = bits_per_symbol * num_symbols; % 计算需要的LDPC块数 num_ldpc_blocks = ceil(required_encoded_bits / codeword_bits_per_block); total_info_bits = num_ldpc_blocks * info_bits_per_block; % 接收端实际能解码的LDPC块数 num_ldpc_codewords = floor(required_encoded_bits / codeword_bits_per_block); info_bits_actual = num_ldpc_codewords * info_bits_per_block; fprintf(&#39;系统参数:\n&#39;); fprintf(&#39; OFDM符号数: %d, 每符号子载波: %d, 总传输比特: %d\n&#39;, ... num_symbols, N, required_encoded_bits); fprintf(&#39; LDPC码率: %.2f, 每块信息比特: %d, 码字长度: %d\n&#39;, ... code_rate, info_bits_per_block, codeword_bits_per_block); fprintf(&#39; 发送端LDPC块数: %d, 接收端可解码块数: %d\n&#39;, ... num_ldpc_blocks, num_ldpc_codewords); fprintf(&#39; 总信息比特: %d, 实际解码比特: %d\n\n&#39;, ... total_info_bits, info_bits_actual); %% BER存储 ber_results = zeros(num_snr_points, 1); last_constellation = []; % 存储最后一个SNR点的星座图 %% 主循环 - 不同SNR下的仿真 for snr_idx = 1:num_snr_points current_snr = snr(snr_idx); fprintf(&#39;\n正在仿真 SNR = %d dB...\n&#39;, current_snr); % 错误统计初始化 total_errors = 0; total_bits = 0; % 多次迭代以获得更准确的BER估计 num_iterations = 10; for iter = 1:num_iterations %% 发射端处理 % 生成随机二进制数据 (额外生成8%的冗余数据) data = randi([0 1], total_info_bits, 1); % LDPC编码 encoded_data = zeros(codeword_bits_per_block * num_ldpc_blocks, 1); for blk = 1:num_ldpc_blocks start_idx = (blk-1)*info_bits_per_block + 1; end_idx = blk*info_bits_per_block; encoded_block = ldpcEncoder(data(start_idx:end_idx)); encoded_data((blk-1)*codeword_bits_per_block+1 : blk*codeword_bits_per_block) = ... encoded_block; end % 截取刚好够用的编码后数据 tx_encoded = encoded_data(1:required_encoded_bits); % 数字调制 (QPSK) mod_data = qammod(tx_encoded, mod_order, &#39;InputType&#39;, &#39;bit&#39;, &#39;UnitAveragePower&#39;, true); % 串并转换 mod_data = reshape(mod_data, N, num_symbols); % IFFT变换 ofdm_symbols = ifft(mod_data, N); % 添加循环前缀 ofdm_symbols_cp = [ofdm_symbols(end-cp_len+1:end, :); ofdm_symbols]; % 并串转换 tx_signal = ofdm_symbols_cp(:); %% 信道传输 rx_signal = awgn(tx_signal, current_snr, &#39;measured&#39;); %% 接收端处理 % 串并转换 rx_signal_parallel = reshape(rx_signal, N+cp_len, num_symbols); % 去除循环前缀 rx_symbols_no_cp = rx_signal_parallel(cp_len+1:end, :); % FFT变换 rx_data_freq = fft(rx_symbols_no_cp, N); % 信道均衡 (简单零 forcing均衡) H_est = ones(N, 1); % 假设理想信道估计 rx_data_eq = rx_data_freq ./ H_est; % 解调 - 输出LLR用于LDPC解码 rx_llr = qamdemod(rx_data_eq(:), mod_order, &#39;OutputType&#39;, &#39;approxllr&#39;, &#39;UnitAveragePower&#39;, true); %% LDPC解码 % 将接收数据分割为LDPC码字 rx_data_decoded = zeros(info_bits_actual, 1); for blk = 1:num_ldpc_codewords start_idx = (blk-1)*codeword_bits_per_block + 1; end_idx = min(blk*codeword_bits_per_block, length(rx_llr)); codeword_llr = rx_llr(start_idx:end_idx); % 解码时处理可能的LLR长度不足 if length(codeword_llr) < codeword_bits_per_block codeword_llr = [codeword_llr; zeros(codeword_bits_per_block-length(codeword_llr), 1)]; end decoded_bits = ldpcDecoder(codeword_llr); rx_data_decoded((blk-1)*info_bits_per_block+1 : blk*info_bits_per_block) = ... decoded_bits; end %% 性能评估 - 比较实际传输的信息比特 [errors, bits] = biterr(data(1:info_bits_actual), rx_data_decoded); total_errors = total_errors + errors; total_bits = total_bits + bits; % 保存最后一个SNR点的星座图 if snr_idx == num_snr_p修改为正确完整的代码
最新发布
06-21
%% 实验3.1 汉明码编译码系统 - 修正版 clear all; close all; clc; %% 参数设置 m = 3; % 汉明码参数m=3 (7,4) n = 7; % 码长 k = 4; % 信息位长度 % 标准(7,4)汉明码的生成矩阵 G = [1 0 0 0 1 1 0; % 系统形式的生成矩阵 0 1 0 0 1 0 1; 0 0 1 0 0 1 1; 0 0 0 1 1 1 1]; % 校验矩阵 H = [1 1 0 1 1 0 0; % 标准形式校验矩阵 1 0 1 1 0 1 0; 0 1 1 1 0 0 1]; % 仿真参数 SNR_dB = 0:2:10; % 信噪比范围(dB) num_bits = 1e6; % 仿真比特数(增加以获得更准确结果) p_errors = logspace(-3, -1, 5); % BSC错误概率范围 %% 主程序演示 fprintf(&#39;标准(7,4)汉明码性能测试:\n&#39;); % 测试用例 test_msg = [1 0 1 0]; codeword = mod(test_msg * G, 2); fprintf(&#39;\n测试编码:\n信息位: %s\n编码后: %s\n&#39;, num2str(test_msg), num2str(codeword)); % 引入错误 error_pos = 3; rx_codeword = codeword; rx_codeword(error_pos) = ~rx_codeword(error_pos); fprintf(&#39;引入错误在位置%d: %s\n&#39;, error_pos, num2str(rx_codeword)); % 解码测试 syndrome = mod(rx_codeword * H&#39;, 2); error_loc = bi2de(syndrome, &#39;left-msb&#39;) + 1; if error_loc > 0 && error_loc <= n rx_codeword(error_loc) = ~rx_codeword(error_loc); end decoded_msg = rx_codeword(1:k); fprintf(&#39;解码结果: %s\n纠正位置: %d\n&#39;, num2str(decoded_msg), error_loc); %% BSC信道仿真 ber_bsc = zeros(size(p_errors)); ber_uncoded_bsc = zeros(size(p_errors)); for i = 1:length(p_errors) p = p_errors(i); num_errors = 0; num_errors_uncoded = 0; num_blocks = ceil(num_bits / k); for j = 1:num_blocks msg = randi([0 1], 1, k); codeword = mod(msg * G, 2); % 信道传输(编码情况) errors = rand(1, n) < p; rx_codeword = xor(codeword, errors); % 解码 syndrome = mod(rx_codeword * H&#39;, 2); error_loc = bi2de(syndrome, &#39;left-msb&#39;) + 1; if error_loc > 0 && error_loc <= n rx_codeword(error_loc) = ~rx_codeword(error_loc); end decoded_msg = rx_codeword(1:k); % 统计错误(编码情况) num_errors = num_errors + sum(xor(msg, decoded_msg)); % 未编码情况(相同数量的信息比特通过BSC) uncoded_rx = xor(msg, rand(1, k) < p); num_errors_uncoded = num_errors_uncoded + sum(xor(msg, uncoded_rx)); end ber_bsc(i) = num_errors / (num_blocks * k); ber_uncoded_bsc(i) = num_errors_uncoded / (num_blocks * k); fprintf(&#39;BSC p=%.3f: 编码BER=%.2e, 未编码BER=%.2e\n&#39;,... p, ber_bsc(i), ber_uncoded_bsc(i)); end %% AWGN信道仿真 ber_awgn = zeros(size(SNR_dB)); ber_uncoded_awgn = zeros(size(SNR_dB)); for i = 1:length(SNR_dB) snr = SNR_dB(i); snr_linear = 10^(snr/10); % 转换为线性值 num_errors = 0; num_errors_uncoded = 0; num_blocks = ceil(num_bits / k); % 计算编码和未编码的Eb/N0 EbN0_coded = snr_linear * k/n; % 编码后每个信息比特的能量 EbN0_uncoded = snr_linear; % 未编码时每个比特的能量 for j = 1:num_blocks msg = randi([0 1], 1, k); codeword = mod(msg * G, 2); % BPSK调制+AWGN(编码情况) tx_signal = 2 * codeword - 1; noise_power = 1/(2*EbN0_coded); noise = sqrt(noise_power) * randn(1, n); rx_signal = tx_signal + noise; rx_codeword = rx_signal > 0; % 解码 syndrome = mod(rx_codeword * H&#39;, 2); error_loc = bi2de(syndrome, &#39;left-msb&#39;) + 1; if error_loc > 0 && error_loc <= n rx_codeword(error_loc) = ~rx_codeword(error_loc); end decoded_msg = rx_codeword(1:k); % 统计错误(编码情况) num_errors = num_errors + sum(xor(msg, decoded_msg)); % 未编码情况(相同数量的信息比特) tx_uncoded = 2 * msg - 1; noise_power_uncoded = 1/(2*EbN0_uncoded); noise_uncoded = sqrt(noise_power_uncoded) * randn(1, k); rx_uncoded = tx_uncoded + noise_uncoded; rx_msg = rx_uncoded > 0; % 统计错误(未编码情况) num_errors_uncoded = num_errors_uncoded + sum(xor(msg, rx_msg)); end ber_awgn(i) = num_errors / (num_blocks * k); ber_uncoded_awgn(i) = num_errors_uncoded / (num_blocks * k); fprintf(&#39;SNR=%.1fdB: 编码BER=%.2e, 未编码BER=%.2e\n&#39;,... SNR_dB(i), ber_awgn(i), ber_uncoded_awgn(i)); end %% 结果可视化 figure; subplot(1,2,1); semilogy(p_errors, ber_bsc, &#39;b-o&#39;, &#39;LineWidth&#39;, 1.5); hold on; semilogy(p_errors, ber_uncoded_bsc, &#39;r--s&#39;, &#39;LineWidth&#39;, 1.5); xlabel(&#39;BSC错误概率&#39;); ylabel(&#39;BER&#39;); title(&#39;BSC信道性能&#39;); legend(&#39;(7,4)汉明码&#39;,&#39;未编码&#39;, &#39;Location&#39;, &#39;southwest&#39;); grid on; axis tight; subplot(1,2,2); semilogy(SNR_dB, ber_awgn, &#39;b-o&#39;, &#39;LineWidth&#39;, 1.5); hold on; semilogy(SNR_dB, ber_uncoded_awgn, &#39;r--s&#39;, &#39;LineWidth&#39;, 1.5); xlabel(&#39;SNR (dB)&#39;); ylabel(&#39;BER&#39;); title(&#39;AWGN信道性能&#39;); legend(&#39;(7,4)汉明码&#39;,&#39;未编码&#39;, &#39;Location&#39;, &#39;southwest&#39;); grid on; axis tight; sgtitle(&#39;(7,4)汉明码与未编码系统性能比较&#39;); %% 编码函数 function codeword = hamming_encode(msg, G) codeword = mod(msg * G, 2); end %% 解码函数 function [decoded_msg, error_loc] = hamming_decode(rx_codeword, H, k) syndrome = mod(rx_codeword * H&#39;, 2); error_loc = bi2de(syndrome, &#39;left-msb&#39;) + 1; if error_loc > 0 && error_loc <= length(rx_codeword) rx_codeword(error_loc) = ~rx_codeword(error_loc); end decoded_msg = rx_codeword(1:k); end这个代码为什么编码后误码率反而变高了,修改后给我完整代码
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值