基于RS(240,224)编码的AWGN信道QPSK BER仿真报错求助
问题:RS(240,224)编码BER仿真报错:输入维度不匹配
我需要复现某论文中基于RS(240,224)编码的AWGN信道QPSK误码率(BER)估计,参考MATLAB示例修改参数后编写了如下代码:
rng(1993); % 设置随机数种子保证结果可复现 M = 4; % 调制阶数 bps = log2(M); % 每个符号的比特数 N = 240; % RS码字长度 K = 224; % RS消息长度 rsEncoder = comm.RSEncoder( ... BitInput=true, ... CodewordLength=N, ... MessageLength=K); rsDecoder = comm.RSDecoder( ... BitInput=true, ... CodewordLength=N, ... MessageLength=K); ebnoVec = (3:0.5:8)'; ebnoVecCodingGain = ... ebnoVec + 10*log10(K/N); % 考虑RS编码增益 errorStats = zeros(length(ebnoVec),3); for i = 1:length(ebnoVec) awgnChannel.EbNo = ebnoVecCodingGain(i); reset(errorRate) while errorStats(i,2) < 100 && errorStats(i,3) < 1e7 data = randi([0 1],1500,1); encData = rsEncoder(data); modData = pskmod(encData,M,InputType='bit'); rxSig = awgnChannel(modData); rxData = pskdemod(rxSig,M,OutputType='bit'); decData = rsDecoder(rxData); errorStats(i,:) = errorRate(data,decData); end end berCurveFit = berfit(ebnoVecCodingGain,errorStats(:,1)); semilogy(ebnoVecCodingGain,errorStats(:,1),'b*', ... ebnoVecCodingGain,berCurveFit,'c-') ylabel('BER') xlabel('Eb/No (dB)') legend('RS coded BER','Curve Fit') grid
运行时持续出现如下错误:
Error using comm.RSEncoder/setupImpl
输入X的维度必须与BitInput属性值、消息长度、码字长度及本原多项式一致。...
解决方法
错误核心原因:输入数据长度不是RS编码器消息长度的整数倍
- 当
BitInput=true时,comm.RSEncoder要求输入数据的总比特数必须是K(消息长度,单位:比特)的整数倍。代码中生成的data是1500比特,1500÷224≈6.696,不是整数,导致维度不匹配。
修正步骤:
- 调整随机数据长度,使其为K的整数倍。比如用固定倍数生成:
data = randi([0 1], 6*K, 1);(6倍消息长度,可根据需求调整倍数),或者动态计算合适长度:dataLen = ceil(1500/K)*K; data = randi([0 1], dataLen, 1); - 补充初始化未定义的
awgnChannel和errorRate对象,否则代码会报未定义错误:awgnChannel = comm.AWGNChannel('EbNo', ebnoVecCodingGain(1), 'BitsPerSymbol', bps); errorRate = comm.ErrorRate;
修正后的关键循环代码:
% 补充初始化信道和误码率统计对象 awgnChannel = comm.AWGNChannel('EbNo', ebnoVecCodingGain(1), 'BitsPerSymbol', bps); errorRate = comm.ErrorRate; for i = 1:length(ebnoVec) awgnChannel.EbNo = ebnoVecCodingGain(i); reset(errorRate) while errorStats(i,2) < 100 && errorStats(i,3) < 1e7 % 生成K的整数倍长度的输入数据 data = randi([0 1], 6*K, 1); encData = rsEncoder(data); modData = pskmod(encData,M,InputType='bit'); rxSig = awgnChannel(modData); rxData = pskdemod(rxSig,M,OutputType='bit'); decData = rsDecoder(rxData); errorStats(i,:) = errorRate(data,decData); end end
额外注意点:
- RS(240,224)属于缩短RS码,MATLAB的
comm.RSEncoder会自动处理参数合法性,但要确保N和K符合RS码的数学约束(N是2^m-1的约数,m为本原多项式次数)。 - 编码增益的计算是正确的:
ebnoVecCodingGain = ebnoVec + 10*log10(K/N),对应编码后信息比特能量的放大倍数。
内容的提问来源于stack exchange,提问作者nechi
相关产品推荐
相关产品推荐

