You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:57:21