我在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" 缩放方式并开启灰度映射,得到与旧版本相同的输出。
希望这个解决方案能够帮到您!
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
不知道你这个问题是否已经解决, 如果还没有解决的话:回答: 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矩阵。