% 设置参数M = 16; % MQAM调制阶数L = 10000; % 信号长度fc = 1000; % 2FSK载波频率fs = 8000; % 采样率EbNo = 0:2:20; % 信噪比范围bitsPerSym = log2(M); % 每个符号的比特数% 生成随机数据data = randi([0,1],1,bitsPerSym*L);% MQAM调制modData = qammod(data,M);% 2FSK调制t = linspace(0, L/fs, L);freqDev = 500; % 频率偏移量carrier1 = sin(2*pi*fc*t);carrier2 = sin(2*pi*(fc+freqDev)*t);fskData = cos(2*pi*carrier1.*data + pi/2) + cos(2*pi*carrier2.*(1-data) + pi/2);% 初始化误码率矩阵berMQAM = zeros(1,length(EbNo));ber2FSK = zeros(1,length(EbNo));% 循环计算误码率for i = 1:length(EbNo) % 添加高斯噪声 snr = EbNo(i) + 10*log10(bitsPerSym); noisePower = 10^(-snr/10); noise = sqrt(noisePower/2)*(randn(1,L) + 1i*randn(1,L)); % MQAM解调 rxDataMQAM = awgn(modData, snr, 'measured'); demodDataMQAM = qamdemod(rxDataMQAM,M); % 2FSK解调 rxData2FSK = awgn(fskData, snr, 'measured'); demodData2FSK = (cos(2*pi*(fc+freqDev)*t).*rxData2FSK > 0.5); % 计算误码率 [~, berMQAM(i)] = biterr(data, demodDataMQAM); [~, ber2FSK(i)] = biterr(data, demodData2FSK);end% 绘制误码率曲线semilogy(EbNo, berMQAM, 'o-', 'LineWidth', 2);hold on;semilogy(EbNo, ber2FSK, 'o-', 'LineWidth', 2);grid on;xlabel('EbNo (dB)');ylabel('Bit Error Rate');legend('MQAM', '2FSK');矩阵维度不一致怎么改
时间: 2023-12-10 16:42:36 浏览: 79
MQAM.rar_MATLAB 调制信号_MQAM_mqam modulation_数字信号调制_数字调制信号
在这段代码中,矩阵维度不一致的问题通常出现在误码率矩阵 `berMQAM` 和 `ber2FSK` 的赋值操作中。如果这两个矩阵的长度不同,可能会导致无法同时绘制两条误码率曲线。为了解决这个问题,可以先将误码率矩阵初始化为全部为零的矩阵,然后在循环计算误码率的过程中,逐步填充误码率矩阵。
具体的修改方法如下所示:
```matlab
% 初始化误码率矩阵
berMQAM = zeros(1,length(EbNo));
ber2FSK = zeros(1,length(EbNo));
% 循环计算误码率
for i = 1:length(EbNo)
% 添加高斯噪声
snr = EbNo(i) + 10*log10(bitsPerSym);
noisePower = 10^(-snr/10);
noise = sqrt(noisePower/2)*(randn(1,L) + 1i*randn(1,L));
% MQAM解调
rxDataMQAM = awgn(modData, snr, 'measured');
demodDataMQAM = qamdemod(rxDataMQAM,M);
% 2FSK解调
rxData2FSK = awgn(fskData, snr, 'measured');
demodData2FSK = (cos(2*pi*(fc+freqDev)*t).*rxData2FSK > 0.5);
% 计算误码率
[~, berMQAM(i)] = biterr(data, demodDataMQAM);
[~, ber2FSK(i)] = biterr(data, demodData2FSK);
end
% 绘制误码率曲线
semilogy(EbNo, berMQAM, 'o-', 'LineWidth', 2);
hold on;
semilogy(EbNo, ber2FSK, 'o-', 'LineWidth', 2);
grid on;
xlabel('EbNo (dB)');
ylabel('Bit Error Rate');
legend('MQAM', '2FSK');
```
在这个修改后的代码中,误码率矩阵 `berMQAM` 和 `ber2FSK` 的长度都被初始化为 `length(EbNo)`,也就是信噪比范围的长度。这样,在循环计算误码率的过程中,每次都会将误码率存储到对应的位置上,保证了两个误码率矩阵的长度一致。
阅读全文