请写出完成BPSK和QPSK调制在AWGN信道下的SNR-BER误码率性能评估的matlab代码,不使用内置函数
时间: 2024-03-08 22:50:23 浏览: 217
以下是BPSK和QPSK调制在AWGN信道下的SNR-BER误码率性能评估的matlab代码,不使用内置函数:
```matlab
% BPSK和QPSK调制在AWGN信道下的SNR-BER误码率性能评估
% 清空环境变量和命令窗口
clc;
clear;
% 设置参数
M = 2; % 调制阶数
k = log2(M); % 每个符号的比特数
EbNoVec = (0:10); % 信噪比范围
numBits = 1e6; % 发送的总比特数
numSym = numBits/k; % 发送的总符号数
m = 1; % 码元时间长度
% 初始化误码率向量
berVec = zeros(size(EbNoVec));
for i = 1:length(EbNoVec)
% 计算信噪比
EbNo = EbNoVec(i);
snr = EbNo + 10*log10(k) - 10*log10(m);
% 生成随机比特流
dataIn = randi([0 1], numBits, 1);
% BPSK调制
bpskTx = 2*dataIn-1;
% QPSK调制
qpskTx = zeros(numSym, 1);
for j = 1:numSym
if dataIn((2*j-1)) == 0 && dataIn((2*j)) == 0
qpskTx(j) = 1/sqrt(2)*(-1-1i);
elseif dataIn((2*j-1)) == 0 && dataIn((2*j)) == 1
qpskTx(j) = 1/sqrt(2)*(-1+1i);
elseif dataIn((2*j-1)) == 1 && dataIn((2*j)) == 0
qpskTx(j) = 1/sqrt(2)*(1-1i);
else
qpskTx(j) = 1/sqrt(2)*(1+1i);
end
end
% 生成AWGN信道
noise = sqrt(0.5/snr)*(randn(size(bpskTx))+1i*randn(size(bpskTx)));
% 传输信号通过AWGN信道
bpskRx = bpskTx + noise;
qpskRx = qpskTx + noise;
% BPSK解调
bpskDemod = real(bpskRx)>0;
% 计算误码率
[~, berVec(i)] = biterr(dataIn, bpskDemod);
% QPSK解调
qpskDemod = zeros(numBits, 1);
for j = 1:numSym
if real(qpskRx(j))<0
qpskDemod(2*j-1) = 0;
else
qpskDemod(2*j-1) = 1;
end
if imag(qpskRx(j))<0
qpskDemod(2*j) = 0;
else
qpskDemod(2*j) = 1;
end
end
% 计算误码率
[~, berVec(i)] = biterr(dataIn, qpskDemod);
end
% 绘制误码率-信噪比曲线
semilogy(EbNoVec, berVec, 'b.-');
grid on;
xlabel('Eb/No (dB)');
ylabel('BER');
title('BPSK and QPSK Modulation in AWGN');
legend('BPSK', 'QPSK');
```
阅读全文