写一个绘制三条BER曲线MATLAB代码
时间: 2023-12-06 20:45:05 浏览: 46
以下是绘制三条BER曲线的MATLAB代码:
```matlab
% 设置参数
EbN0_dB = 0:10; % Eb/N0范围(dB)
numBits = 100000; % 每个仿真中使用的位数
M = [2, 4, 16]; % 调制阶数
% 初始化误码率向量
BER = zeros(length(M), length(EbN0_dB));
% 循环计算误码率
for i = 1:length(M)
for j = 1:length(EbN0_dB)
% 生成随机二进制数据
dataIn = randi([0 1], 1, numBits);
% 进行调制
switch M(i)
case 2
dataMod = pskmod(dataIn, M(i));
case 4
dataMod = qammod(dataIn, M(i));
case 16
dataMod = qammod(dataIn, M(i));
end
% 添加高斯噪声
EbN0_lin = 10^(EbN0_dB(j)/10); % 将Eb/N0值转换为线性单位
noiseVar = 1/(2*EbN0_lin*M(i)); % 计算噪声方差
noise = sqrt(noiseVar)*randn(1, length(dataMod)); % 生成高斯噪声
rxSig = dataMod + noise; % 接收信号
% 进行解调并计算误码率
switch M(i)
case 2
dataOut = pskdemod(rxSig, M(i));
BER(i,j) = sum(dataOut ~= dataIn)/numBits;
case 4
dataOut = qamdemod(rxSig, M(i));
BER(i,j) = sum(dataOut ~= dataIn)/numBits;
case 16
dataOut = qamdemod(rxSig, M(i));
BER(i,j) = sum(dataOut ~= dataIn)/numBits;
end
end
end
% 绘制BER曲线
semilogy(EbN0_dB, BER(1,:), 'r-o', 'LineWidth', 2, 'MarkerSize', 8);
hold on;
semilogy(EbN0_dB, BER(2,:), 'g-d', 'LineWidth', 2, 'MarkerSize', 8);
semilogy(EbN0_dB, BER(3,:), 'b-s', 'LineWidth', 2, 'MarkerSize', 8);
grid on;
xlabel('Eb/N0 (dB)');
ylabel('Bit Error Rate');
legend('BPSK', 'QPSK', '16-QAM');
```
这段代码会生成三条BER曲线,分别对应BPSK、QPSK和16-QAM调制。你可以根据需要修改代码中的参数,比如调制阶数、位数等等。