%生成随机二进制码 bits = randi([0 1],1,N); %二进制编码到4-PAM符号映射 for k=1:length(bits)/2 if bits(2*k-1)==0 && bits(2*k)==0 symbols(k)=-3; elseif bits(2*k-1)==0 && bits(2*k)==1 symbols(k)=-1; elseif bits(2*k-1)==1 && bits(2*k)==1 symbols(k)=3; else symbols(k)=1; end end %计算AWGN噪声样本标准差 EsN0 = 10^(EsN0/10); N0 = 1/(2*R*EsN0); sigma = sqrt(N0/2); %生成AWGN噪声向量,与信号相加即可 noise = sigma*randn(1,length(symbols)); received = symbols + noise; local_code = [-3 0; -1 -2; 1 2; 3 0]; %相关器输出 for k=1:N/2 r = received(2*k-1:2*k); correlations = sum(repmat(r,4,1).*local_code,2); [Y, I] = max(correlations); decisions(k) = local_code(I,1); end %统计错误个数 num_errors = sum(abs(decisions-symbols(1:length(decisions)))>0); %计算误码率和误符号率 bit_error_rate = num_errors/N; symbol_error_rate = bit_error_rate/log2(M); %绘制误码率曲线 figure(1); semilogy(EsN0dB,theory_ber,'k-',EsN0dB,BER,'ro'); axis([0 15 1e-6 1]) xlabel('E_s/N_0 (dB)'); ylabel('BER'); legend('Theoretical','Simulation');
时间: 2024-03-30 13:40:25 浏览: 75
这段代码是用来模拟基于4-PAM调制的数字通信系统,并计算误码率和误符号率的。其中,随机生成长度为N的二进制码,将其映射到4-PAM符号集合中,然后加入AWGN噪声,接收端对接收到的信号进行相关运算,得到最接近的符号作为决策,并统计误码率和误符号率。最后,使用semilogy函数绘制误码率曲线,并将仿真结果与理论结果进行比较。
相关问题
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编写。
以下是一个简单的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');
```
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内置函数pammod和qammod。注意标注中文注释。注意检测方法使用多进制调制信号软输出检测。注意一定用MATLAB编写。
以下是一个简单的 MATLAB 代码,用于模拟4PAM和4QAM调制信号在高斯信道下的性能。
```matlab
clear all;
close all;
% 设置参数
M = 4; % 调制阶数
SNR_dB = 0:1:14; % 信噪比范围
num_bits = 1e6; % 信息比特数
% 产生随机二进制数据
data = randi([0 1], 1, num_bits);
% 将数据分组
if M == 4
group_data = reshape(data, 2, length(data)/2)';
else
group_data = reshape(data, 3, length(data)/3)';
end
% 映射到星座图上
if M == 4
x = (2*group_data(:,1)-1);
y = (2*group_data(:,2)-1);
s = x + 1i*y;
else
x = (4*group_data(:,1)-2) + (2*group_data(:,2)-1)*j;
y = (4*group_data(:,3)-2) + (2*group_data(:,4)-1)*j;
s = x + y;
end
% 计算平均功率
Es = mean(abs(s).^2);
% 根据信噪比计算噪声功率
for ii = 1:length(SNR_dB)
% 计算噪声功率
SNR = 10^(SNR_dB(ii)/10);
N0 = Es/SNR;
% 添加高斯噪声
noise = sqrt(N0/2)*(randn(size(s)) + 1i*randn(size(s)));
r = s + noise;
% 解调
if M == 4
x_hat = real(r);
y_hat = imag(r);
% 判决
x_hat(x_hat<0) = -1;
x_hat(x_hat>=0) = 1;
y_hat(y_hat<0) = -1;
y_hat(y_hat>=0) = 1;
% 重构
data_hat = zeros(length(data),1);
data_hat(1:2:end) = (x_hat+1)/2;
data_hat(2:2:end) = (y_hat+1)/2;
else
x_hat = real(r);
y_hat = imag(r);
% 判决
x_hat(x_hat<0) = -3;
x_hat(x_hat<2) = -1;
x_hat(x_hat>=2) = 1;
y_hat(y_hat<0) = -3;
y_hat(y_hat<2) = -1;
y_hat(y_hat>=2) = 1;
% 重构
data_hat = zeros(length(data),1);
data_hat(1:3:end) = (x_hat+2)/4;
data_hat(2:3:end) = (real(y_hat)+2)/4;
data_hat(3:3:end) = (imag(y_hat)+2)/4;
end
% 计算误码率和误比特率
num_errors = sum(data ~= data_hat);
BER(ii) = num_errors/num_bits;
SER(ii) = num_errors/length(s);
end
% 绘图
figure;
semilogy(SNR_dB, BER, 'r--o', 'LineWidth', 2);
hold on;
semilogy(SNR_dB, SER, 'b--s', 'LineWidth', 2);
grid on;
xlabel('SNR (dB)');
ylabel('BER/SER');
legend('理论 BER', '仿真 BER', '理论 SER', '仿真 SER');
```
运行以上代码,将生成两条性能曲线,一条是根据理论平均错误概率画出,另一条是仿真曲线。你可以自己调整参数,比如信噪比范围和信息比特数,以获得更准确的结果。
阅读全文