% 设置参数 N = 100; % 仿真次数 Eb = 1; % 符号能量 SNR_db = [0:2:20]; % 信噪比范围 SNR = 10.^(SNR_db/10); % 信噪比 % 初始化计数器 BER_sim_bpsk = zeros(size(SNR)); BER_sim_qpsk = zeros(size(SNR)); % 循环信噪比范围 for i=1:length(SNR) % 计数器清零 BER_cnt_bpsk = 0; BER_cnt_qpsk = 0; % 循环仿真次数 for j=1:N % 生成随机数据 data = randi([0,1],1,1000); % BPSK调制 modulated_data_bpsk = pskmod(data, 2); % QPSK调制 modulated_data_qpsk = pskmod(data, 4); % 中继节点转发BPSK信号 relayed_data_bpsk = modulated_data_bpsk; % 中继节点转发QPSK信号 relayed_data_qpsk = modulated_data_qpsk; % 接收端接收信号(BPSK) received_data_bpsk = awgn(relayed_data_bpsk*sqrt(SNR(i)), 0); decoded_data_bpsk = pskdemod(received_data_bpsk, 2); % 接收端接收信号(QPSK) received_data_qpsk = awgn(relayed_data_qpsk*sqrt(SNR(i)), 0); decoded_data_qpsk = pskdemod(received_data_qpsk, 4); % 统计误码率(BPSK) BER_cnt_bpsk = BER_cnt_bpsk + sum(xor(data,decoded_data_bpsk))/length(data); % 统计误码率(QPSK) BER_cnt_qpsk = BER_cnt_qpsk + sum(xor(data,decoded_data_qpsk))/length(data); end % 计算平均误码率 BER_sim_bpsk(i) = BER_cnt_bpsk / N; BER_sim_qpsk(i) = BER_cnt_qpsk / N; end % 绘制误码率-信噪比曲线(BPSK) semilogy(SNR_db,BER_sim_bpsk,'-o'); xlabel('信噪比(dB)'); ylabel('误码率'); title('中继协作通信网络BPSK误码率性能分析');分析代码和结果
时间: 2023-12-31 12:06:49 浏览: 29
这段代码是一个中继协作通信网络的BPSK和QPSK误码率性能分析程序,主要分析了不同信噪比下的误码率情况。程序中设置了仿真次数、符号能量和信噪比范围等参数,然后通过循环信噪比范围和仿真次数,生成随机数据,对BPSK和QPSK信号进行调制和解调,然后通过AWGN信道传输,并统计误码率。最后,通过绘制误码率-信噪比曲线,分析中继协作通信网络BPSK误码率性能。
结果显示,在低信噪比下,BPSK的误码率比QPSK低,但是在高信噪比下,QPSK的误码率明显比BPSK低。这是因为在低信噪比下,BPSK的调制方式更简单,更容易被接收端正确解调,而在高信噪比下,QPSK的调制方式更有效,可以更好地利用信道带宽资源,从而降低误码率。
总之,这段代码可以帮助我们分析不同信噪比下的中继协作通信网络性能,为我们设计更好的通信系统提供参考。
相关问题
% 4PAM调制信号在高斯信道下的性能仿真 clear all; close all; clc %% 参数设置 N = 1e6; % 参考帧数 Eb = 1; % 参考能量 M = 4; % 调制阶数 %% 产生调制信号 b = randi([0 M-1], 1, N); % 随机产生0~M-1的整数 s = 2b-(M-1); % 4PAM调制信号 %% 产生高斯白噪声信号 SNR = 0:1:14; % 信噪比范围 Es = Eblog2(M); % 符号能量 for i = 1:length(SNR) N0 = Es/(10^(SNR(i)/10)); % 噪声功率 n = sqrt(N0/2)(randn(1, N)+1jrandn(1, N)); % 高斯白噪声 r = s + n; % 接收信号 r = r.'; % 转置,方便下一步计算 %% 多进制调制信号软输出检测 tau = 1.628; % 判决门限 for j = 1:N if real(r(j)) < -tau b_hat(j) = 0; elseif real(r(j)) < 0 b_hat(j) = 1; elseif real(r(j)) < tau b_hat(j) = 2; else b_hat(j) = 3; end end s_hat = 2b_hat-(M-1); % 解调结果 %% 计算误符号率和误比特率 err_symbols(i) = sum(s~=s_hat)/N; % 误符号率 err_bits(i) = err_symbols(i)log2(M); % 误比特率 end %% 绘制性能曲线 Pb_simb = err_bits; % 仿真误比特率 Pb_sims = err_symbols; % 仿真误符号率 figure semilogy(SNR, Pb_simb, 'b-', 'LineWidth', 2); hold on semilogy(SNR, Pb_sims, 'g-', 'LineWidth', 2); hold off grid on xlabel('SNR (dB)'); ylabel('Pb'); legend('理论误比特率曲线','理论误符号率曲线','仿真误比特率曲线','仿真误符号率曲线'); title('4PAM调制在高斯信道下的性能曲线');,添加理论误比特率曲线和理论误符号率曲线
可以通过Q函数计算4PAM调制在高斯信道下的理论误比特率和理论误符号率。修改代码如下:
clear all;
close all;
clc
%% 参数设置
N = 1e6; % 参考帧数
Eb = 1; % 参考能量
M = 4; % 调制阶数
%% 产生调制信号
b = randi([0 M-1], 1, N); % 随机产生0~M-1的整数
s = 2*b-(M-1); % 4PAM调制信号
%% 产生高斯白噪声信号
SNR = 0:1:14; % 信噪比范围
Es = Eb*log2(M); % 符号能量
for i = 1:length(SNR)
N0 = Es/(10^(SNR(i)/10)); % 噪声功率
n = sqrt(N0/2)*(randn(1, N)+1j*randn(1, N)); % 高斯白噪声
r = s + n; % 接收信号
r = r.'; % 转置,方便下一步计算
%% 多进制调制信号软输出检测
tau = 1.628; % 判决门限
for j = 1:N
if real(r(j)) < -tau
b_hat(j) = 0;
elseif real(r(j)) < 0
b_hat(j) = 1;
elseif real(r(j)) < tau
b_hat(j) = 2;
else
b_hat(j) = 3;
end
end
s_hat = 2*b_hat-(M-1); % 解调结果
%% 计算误符号率和误比特率
err_symbols(i) = sum(s~=s_hat)/N; % 仿真误符号率
err_bits(i) = err_symbols(i)*log2(M); % 仿真误比特率
Pb_theory(i) = 3/2*qfunc(sqrt(2/5*Eb/N0)); % 理论误比特率
Ps_theory(i) = 2/3*Pb_theory(i); % 理论误符号率
end
%% 绘制性能曲线
Pb_simb = err_bits; % 仿真误比特率
Pb_sims = err_symbols; % 仿真误符号率
figure
semilogy(SNR, Pb_theory, 'r--', 'LineWidth', 2); hold on
semilogy(SNR, Ps_theory, 'm--', 'LineWidth', 2);
semilogy(SNR, Pb_simb, 'b-', 'LineWidth', 2);
semilogy(SNR, Pb_sims, 'g-', 'LineWidth', 2); hold off
grid on
xlabel('SNR (dB)');
ylabel('Pb');
legend('理论误比特率曲线','理论误符号率曲线','仿真误比特率曲线','仿真误符号率曲线');
title('4PAM调制在高斯信道下的性能曲线');
clc; clear all; close all; %% 参数设置 M = 4; % 4PAM Eb = 1; % 符号能量 T = 1; % 符号周期 nBits = 1000000; % 发送比特数 nSnr = 15; % 信噪比范围 nErrs = zeros(1,nSnr); % 错误比特数 nRuns = 20; % 每个信噪比运行次数 nSymPerFrame = 100; % 每帧符号数 %% 信源产生信息比特 txBits = randi([0 M-1],1,nBits); %% 调制 txSym = pammod(txBits,M); %% 信道 for iSnr = 1:nSnr EbN0dB(iSnr) = iSnr - 1; % 信噪比,单位dB EbN0(iSnr) = 10^(EbN0dB(iSnr)/10); % 转换为线性值 n0(iSnr) = Eb/(2*EbN0(iSnr)); % 噪声功率 for iRun = 1:nRuns %% 加入高斯白噪声 noise = sqrt(n0(iSnr)/2)*(randn(1,nSymPerFrame)+1j*randn(1,nSymPerFrame)); rxSym = txSym + noise; %% 接收端检测,软输出检测 rxSymDemod = real(rxSym) > 0; %% 计算误符号率和误比特率 nErrs(iSnr) = nErrs(iSnr) + sum(rxDemod ~= txBits(1:nSymPerFrame))/nSymPerFrame; end end %% 计算平均错误概率 pErrSim = nErrs/(nBits*nRuns); %% 理论分析 pErrTheory = 2*(1-1/sqrt(M))*qfunc(sqrt(3*EbN0/(M-1))); %% 画图 figure; semilogy(EbN0dB,pErrSim,'o-'); hold on; semilogy(EbN0dB,pErrTheory,'r-'); grid on; xlabel('SNR(dB)'); ylabel('P_e'); legend('仿真','理论分析');代码第二十八行矩阵维度不一致发生错误,请修改
第28行应该修改为:
```
nErrs(iSnr) = nErrs(iSnr) + sum(rxSymDemod ~= txBits(1:nSymPerFrame))/nSymPerFrame;
```
因为在第22行已经将接收到的符号进行了软输出检测,所以在第28行需要使用软输出检测后的符号进行误比特率的计算。