2PSK 误码率仿真:代码结构和子程序
2PSK 误码率仿真:代码结构和子程序
本文介绍使用MATLAB进行2PSK误码率仿真的代码结构,将代码分为多个子程序,以便组织和调用。
代码结构
上述代码需要分为以下几个子程序:
-
main函数:包含主程序的代码,用于设置参数、调用其他子程序,以及绘制误码率曲线图。 -
bpskberr函数:用于计算2PSK误码率的子程序。 -
fft_func函数:用于进行快速傅里叶变换的子程序。 -
ifft_func函数:用于进行快速逆傅里叶变换的子程序。 -
bp_f函数:用于设计带通滤波器的子程序。 -
lp_f函数:用于设计低通滤波器的子程序。 -
sigexpand函数:用于进行信号扩展的子程序。
代码示例
clear all
close all
% 设置参数
% 调用主程序
main();
% 主程序
function main()
% 设置参数
A = 1; % 载波振幅
fc = 2; % 载波频率(Hz)
SNRindB1 = -5:1:12; % SNR取值范围
SNRindB2 = -5:0.2:12; % SNR取值范围
N_sample = 100; % 每个码元的采样点数
N = 10000; % 码元数
Ts = 1; % 码元宽度
d = sign(rand(1, N) - 0.5 + eps); % 产生双极性二进制码元
df = 0.01;
simu_err_prb = zeros(1, length(SNRindB1));
% 理论误码率
theo_err_prb = zeros(1, length(SNRindB2));
theo_err_prb1 = zeros(1, length(SNRindB2));
for i = 1:length(SNRindB2)
SNR = 10^(SNRindB2(i)/10);
theo_err_prb(i) = 0.5 * erfc(sqrt(SNR));
theo_err_prb1(i) = 0.5 * erfc(sqrt(2 * SNR));
end
% 普通2PSK接收机实际误码率
for i = 1:length(SNRindB1)
[numoferr, panjue, desingal, t] = bpskberr(A, fc, SNRindB1(i), N_sample, N, Ts, d, df);
simu_err_prb(i) = numoferr;
end
% 画误码率曲线图
semilogy(SNRindB2, theo_err_prb, SNRindB1, simu_err_prb, 'o', SNRindB2, theo_err_prb1, '*');
axis([-5 12 0.00000001 1]);
xlabel('SNR in dB');
ylabel('Prb of Err');
legend('蒙特卡洛仿真误码率', '2psk接收机实际误码率', '最佳接收机理论误码率');
end
% 2psk误码率计算子程序
function [numoferr, panjue, desingal, t] = bpskberr(A, fc, snr, N_sample, N, Ts, d, df)
% ... 你的代码
end
% 快速傅里叶变换
function [output, f] = fft_func(signal, ts, fs)
% ... 你的代码
end
% 快速逆傅里叶变换
function [output] = ifft_func(signal, fs)
% ... 你的代码
end
% 带通滤波器函数
function [output, f] = bp_f(N, f_start, f_cutoff, fs, delay)
% ... 你的代码
end
% 低通滤波器函数
function [output, f] = lp_f(N, B, fs, delay)
% ... 你的代码
end
% 信号扩展函数
function [output] = sigexpand(signal, factor)
% ... 你的代码
end
总结
此次修改将代码分为多个子程序,以便组织和调用。请根据您的需求和实际代码结构进行适当调整。
希望这可以帮助您解决问题。如果您还有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/qYC 著作权归作者所有。请勿转载和采集!