1.试编写程序,仿真4PAM和4QAM调制信号在高斯信道下的性能,并与理论分析结果相比。 (1)画出两条性能曲线,一条是根据理论平均错误概率画出,另一条是仿真曲线; (2)程序的基本流程:信源产生信息比特、调制、将调制信号送入信道(产生高斯白噪声的程序)、接收端检测、将检测结果与信源原始信息比较计算误符号率和误比特率; (3)在给定信噪比下,第二步需多次重复,以得到一个平均错误概率; (4)信噪比范围:4PAM(0dB-14dB),4QAM(0dB-14dB),间隔是1dB;也可在 BER =106左右终止。 (5)信噪比计算 SNR =10log( Es /N0)=10log( REb /N0)。 注意调制解调不能运用MATLAB内置函数。注意标注中文注释。 注意检测方法使用多进制调制信号软输出检测。注意一定用MATLAB编写。
时间: 2024-01-24 20:17:14 浏览: 114
matlab_采用4QAM调制方案和AWGN信道计算误码率的通信系统仿真
5星 · 资源好评率100%
以下是一个简单的MATLAB程序,用于仿真4PAM和4QAM调制信号在高斯信道下的性能。程序流程如下:
1. 生成长度为N的随机比特序列。
2. 将比特序列分组成M个符号,每个符号用2个比特表示(4PAM)或4个比特表示(4QAM)。
3. 将符号映射到相应的调制信号点。
4. 生成高斯白噪声并将其加到调制信号上。
5. 对接收信号进行软输出检测,并将检测结果与原始比特序列进行比较,以计算错误比特率和误符号率。
6. 重复步骤2-5,直到达到指定的误比特率或达到指定的信噪比范围。
程序中的模拟误差率和理论误差率都被记录在数组中,并且用图形表示。程序中也包含了一些与理论误差率比较的注释。
```matlab
clear all;
close all;
% 模拟参数
nbits = 100000; % 比特序列长度
M = 4; % 调制阶数
SNR_dB_start = 0; % 开始信噪比
SNR_dB_end = 14; % 结束信噪比
SNR_points = SNR_dB_end - SNR_dB_start + 1; % 信噪比点数
EbN0_dB = SNR_dB_start:SNR_dB_end; % 信噪比(Eb/N0)
EsN0_dB = EbN0_dB + 10*log10(log2(M)); % 信噪比(Es/N0)
% 生成随机比特序列
bits = randi([0 1], nbits, 1);
% 生成码元
if M == 4 % 4PAM
symbols = zeros(nbits/2, 1);
for i = 1:nbits/2
symbols(i) = bits(2*i-1)*2 + bits(2*i);
end
elseif M == 16 % 16QAM
symbols = zeros(nbits/4, 1);
for i = 1:nbits/4
symbols(i) = bits(4*i-3)*8 + bits(4*i-2)*4 + bits(4*i-1)*2 + bits(4*i);
end
end
% 生成调制信号点
if M == 4 % 4PAM
x = [-3 -1 1 3];
elseif M == 16 % 16QAM
x = [-3 -1 1 3];
y = [-3 -1 1 3];
[X,Y] = meshgrid(x,y);
x = reshape(X,1,M);
y = reshape(Y,1,M);
end
% 模拟误差率和理论误差率
BER_sim = zeros(1, SNR_points);
BER_theory = zeros(1, SNR_points);
SER_sim = zeros(1, SNR_points);
SER_theory = zeros(1, SNR_points);
% 模拟循环
for i = 1:SNR_points
% 信噪比
EsN0 = 10^(EsN0_dB(i)/10);
sigma = sqrt(1/(2*EsN0));
% 重复次数
N = ceil(10^6 / nbits);
% 初始化
BER_sim_total = 0;
SER_sim_total = 0;
% 循环
for j = 1:N
% 加入高斯白噪声
if M == 4 % 4PAM
noise = sigma * randn(nbits/2, 1);
elseif M == 16 % 16QAM
noise = sigma * (randn(nbits/2, 1) + 1i*randn(nbits/2, 1))/sqrt(2);
end
r = x(symbols+1)' + noise';
% 软输出检测
if M == 4 % 4PAM
r_hat = zeros(size(r));
r_hat(r < -2) = -3;
r_hat(r >= -2 & r < 0) = -1;
r_hat(r >= 0 & r < 2) = 1;
r_hat(r >= 2) = 3;
llr = zeros(size(r));
llr(r < -2) = -2*(r(r < -2)+3)/sigma^2;
llr(r >= -2 & r < 0) = -2*(r(r >= -2 & r < 0)+1)/sigma^2;
llr(r >= 0 & r < 2) = 2*(r(r >= 0 & r < 2)-1)/sigma^2;
llr(r >= 2) = 2*(r(r >= 2)-3)/sigma^2;
bits_hat = zeros(nbits, 1);
for k = 1:nbits/2
bits_hat(2*k-1) = (r_hat(k)+3)/2;
bits_hat(2*k) = mod(r_hat(k), 2);
end
elseif M == 16 % 16QAM
r_hat = zeros(size(r));
for k = 1:M
r_hat(abs(r-(x(k)+y(k)*1i))<sigma/2) = x(k)+y(k)*1i;
end
llr = zeros(size(r));
for k = 1:M
llr(abs(r-(x(k)+y(k)*1i))<sigma/2) = -(abs(r(abs(r-(x(k)+y(k)*1i))<sigma/2)-x(k)-y(k)*1i)/sigma)^2;
end
bits_hat = zeros(nbits, 1);
for k = 1:nbits/4
d = r_hat(k);
bits_hat(4*k-3) = (real(d)>0);
bits_hat(4*k-2) = (imag(d)>0);
bits_hat(4*k-1) = (abs(real(d))>1);
bits_hat(4*k) = (abs(imag(d))>1);
end
end
% 计算误差率
BER_sim_total = BER_sim_total + sum(bits ~= bits_hat);
SER_sim_total = SER_sim_total + sum(symbols ~= (r_hat-x+1)');
end
% 计算平均误差率
BER_sim(i) = BER_sim_total / (nbits*N);
SER_sim(i) = SER_sim_total / (nbits/2*N);
if M == 4 % 4PAM
BER_theory(i) = qfunc(sqrt(2*EsN0));
SER_theory(i) = 2*(1-qfunc(sqrt(3*EsN0/2)));
elseif M == 16 % 16QAM
BER_theory(i) = 1/2*qfunc(sqrt(2*EsN0/5)) + 1/2*qfunc(sqrt(2*EsN0/10));
SER_theory(i) = 4*(1-qfunc(sqrt(2/5*EsN0)));
end
% 输出
fprintf('Eb/N0 = %0.2f dB, BER = %0.5f (sim) / %0.5f (theory), SER = %0.5f (sim) / %0.5f (theory)\n', ...
EbN0_dB(i), BER_sim(i), BER_theory(i), SER_sim(i), SER_theory(i));
end
% 绘图
figure;
semilogy(EbN0_dB, BER_sim, 'bo-', EbN0_dB, BER_theory, 'r.-');
legend('Simulated', 'Theoretical');
xlabel('Eb/N0 (dB)');
ylabel('Bit Error Rate (BER)');
title('4PAM and 4QAM Modulation Performance in Gaussian Channel');
figure;
semilogy(EbN0_dB, SER_sim, 'bo-', EbN0_dB, SER_theory, 'r.-');
legend('Simulated', 'Theoretical');
xlabel('Eb/N0 (dB)');
ylabel('Symbol Error Rate (SER)');
title('4PAM and 4QAM Modulation Performance in Gaussian Channel');
```
阅读全文