matlab的qam函数运行的结果与老版函数不同

我在2013版本的matlab运行一下这段代码时

h=modem.qammod('M',mod_num,'InputType','bit','symbolorder','Gray');%qam调制
s=modulate(h,msg);

输出的s为1*40的矩阵。
然后在初始条件相同的情况下,在2022a版本运行相同性质的代码(由于新版本没有“modem.qammod”,所以我按照论坛里的修改方式改了代码),代码如下:

 s=qammod(msg,mod_num);

然而,修改之后s的输出为2*40的矩阵,这是为什么呢?

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在 Matlab R2022a 中,qammod 函数的默认参数已经发生了变化,可能会导致您得到的输出与老版本不同。具体而言,新版本的 qammod 函数默认使用 "Normalized" 符号幅度缩放方式,而旧版本默认使用 "Average power" 缩放方式。

为了使您的代码在新版本中产生与旧版本相同的结果,您需要将 qammod 函数的参数修改为与旧版本相同的选项。具体而言,您需要将 qammod 函数的参数修改为:

s = qammod(msg, mod_num, 'gray', 'UnitAveragePower', true);

这样,您可以使用 "Average power" 缩放方式并开启灰度映射,得到与旧版本相同的输出。

希望这个解决方案能够帮到您!


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    回答: matlab中的modem.qammod函数在2022a版本中已经被废弃了,取而代之的是comm.RectangularQAMModulator函数。这个新函数的输出是一个复数矩阵,其中每个元素都对应一个符号。为了得到一个和旧版本的输出一样的矩阵,需要将复数矩阵拆分成实部和虚部分别对应的数据流,然后将它们合并在一起。下面是一些示范代码,帮助你解决问题:

    % 定义数据流并将其调制为16QAM信号
    data = randi([0 15],1,40); % 40个0~15之间的整数
    qam = comm.RectangularQAMModulator(16);
    modSignal = qam(data.');
    
    % 将复数矩阵拆分成两个实数矩阵
    realPart = real(modSignal);
    imagPart = imag(modSignal);
    
    % 将两个矩阵合并到一个矩阵中
    outMat = [realPart(:), imagPart(:)].';
    
    % 显示结果矩阵及其大小
    disp(outMat);
    disp(size(outMat));
    

    在这个例子中,首先生成了一个40个随机整数的数据流,然后使用comm.RectangularQAMModulator函数将其调制为一个16QAM信号。这个信号是一个401复数矩阵。接下来,利用real和imag函数把这个复数矩阵拆分成一个401的实数矩阵和一个401的虚数矩阵。最后,将这两个实数矩阵合并成一个240的矩阵,输出并显示它的大小。执行上述代码后,应该能够得到与旧版本matlab输出相同的1*40矩阵。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^