仿真对比4ASK信号、8PSK信号、4FSK信号在AWGN信道下的传输性能,一个经典的通信原理仿真题目。假设符号周期为1s,载波频率为10Hz,每个符号周期内采样100个点。指标主要关注误码率和误比特率性能,同时计算理论值。
仿真实现
直接上代码
clear all;close all;clc;
gray_rule = [0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10]; %格雷编码规则
n_symbol = 100000; %传输的符号样例数目(足够多的样本使仿真趋近理论曲线)
Ts = 1; %符号周期
fc = 10; %载波频率
n_sample = 100; %每个符号周期内采样点数
EsN0_dB = 0:15; %信噪比(dB)
%数字频带幅度调制的已调信号可以表达称PAM信号与载波的乘积
% 下面生成PAM信号
M = 4; %M进制
xn = randi([0, M - 1], 1, n_symbol); %可能的信号幅度,在编码中对应M位二进制序列
xn_gray = gray_rule(xn + 1); %将原码映射为格雷码
xn_gray_pam = pammod(xn_gray, M); %PAM调制
xn_gray_pam = xn_gray_pam';
%下面生成载波信号
T_sample = 1/n_sample; %采样周期
t_xct = 0:T_sample:Ts-T_sample; %符号周期内时间序列
sct = sqrt(2/Ts)*cos(2*pi*fc*t_xct); %载波信号,也是信号空间的基信号
% 已调信号
st = xn_gray_pam*sct; %已调信号
P_symbol = norm(st)^2/length(st); %符号功率
Pb = zeros(size(EsN0_dB)); %误比特率
Ps = zeros(size(EsN0_dB)); %误符号率
%下面进行信道及接收的仿真
EsN0 = 10.^(EsN0_dB/10);
snr = 2*EsN0; %计算SNR
for i=1:length(EsN0_dB)
Pn = P_symbol/snr(i); %计算噪声功率
nt = sqrt(Pn) * randn(size(st)); %根据测量的信号功率使用randn函数产生噪声
y_noise = st + nt; %叠加高斯白噪声
y_downsamp = (y_noise*sct')/length(sct); %相关器
%一个码元周期内作相关运算,某种程度上也是在做降采样
yn = pamdemod(y_downsamp, M); %判决器
yn0 = gray_rule(yn + 1); %将格雷码映射为原码
[~, Pb(i)] = biterr(xn, yn0, log2(M)); %误比特率
[~, Ps(i)] = symerr(xn, yn0); %误符号率
end
Ps_th = 2*(M-1)/M*qfunc(sqrt(6*EsN0/(M^2-1)));
Pb_th = Ps_th/log2(M);
semilogy(EsN0_dB, Ps, 'k-*', EsN0_dB, Pb,'k-o', EsN0_dB, Ps_th, 'r-*', EsN0_dB, Pb_th, 'r-o');
xlabel('$E_s/{N_0}(dB)$', 'Interpreter','latex');
ylabel('错误概率');
legend('误符号率', '误比特率', '理论误符号率', '理论误比特率');
title('4ASK信号在AWGN信道下的传输性能');
clear all;close all;clc;
gray_rule = [0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10]; %格雷编码规则
n_symbol = 100000; %传输的符号样例数目(足够多的样本使仿真趋近理论曲线)
Ts = 1; %符号周期
n_sample = 100; %每个符号周期内采样点数
EsN0_dB = 0:15; %信噪比(dB)
%多进制PSK信号不能使用一个载波调制(相位模糊)需要两个正交的相干载波
% 分同相、正交两路调制
M = 8; %M进制
xn = randi([0,7], 1, n_symbol);
xn_gray = gray_rule(xn + 1); %格雷映射
xn_gray_psk = pskmod(xn_gray, M); %8PSK调制
xn_gray_psk = xn_gray_psk';
T_sample = 1/n_sample; %采样周期
t_xct = 0:T_sample:Ts-T_sample; %时间向量
fc = 10; %载波频率
xct = sqrt(2/Ts)*exp(1j*2*pi*fc*t_xct); %载波
xct_I = sqrt(2/Ts)*cos(2*pi*fc*t_xct); %同相载波
xct_Q = sqrt(2/Ts)*sin(2*pi*fc*t_xct); %正交载波
st = real(xn_gray_psk*xct); %已调信号
%对各符号周期内信号整形为一维度以呈现在时间向量上
st_tran = reshape(st.',1,length(xn_gray_psk)*length(xct));
P_symbol = norm(st_tran).^2/n_symbol; %符号功率
Pb = zeros(size(EsN0_dB)); %误比特率
Ps = zeros(size(EsN0_dB)); %误符号率
EsN0 = 10.^(EsN0_dB/10); %信噪比
snr = 2*EsN0; %计算SNR
for i=1:length(EsN0_dB)
Pn = P_symbol/snr(i); %计算噪声功率
nt = sqrt(Pn) * randn(size(st_tran)); %根据测量的信号功率使用randn函数产生噪声
y_tran_noise = st_tran + nt; %叠加高斯白噪声
y_noise = reshape(y_tran_noise, length(xct), length(xn_gray_psk));
y_downsamp_I = (xct_I*y_noise)/length(xct_I); %相关运算
y_downsamp_Q = (xct_Q*y_noise)/length(xct_Q); %相关运算
yt = y_downsamp_I + 1j*y_downsamp_Q; %将两个支路信号送入判决器
yn = pskdemod(yt, M); %判决器
yn0 =gray_rule(yn + 1); %逆格雷映射
[~, Pb(i)] = biterr(xn, yn0, log2(M)); %误比特率
[~, Ps(i)] = symerr(xn, yn0); %误符号率
end
Ps_th = 2*qfunc(sqrt(2*EsN0)*sin(pi/M));
Pb_th = Ps_th/log2(M);
semilogy(EsN0_dB, Ps, 'k-*', EsN0_dB, Pb, 'k-o', EsN0_dB, Ps_th, 'r-*', EsN0_dB, Pb_th, 'r-o');
xlabel('$E_s/{N_0}(dB)$', 'Interpreter','latex');
ylabel('错误概率');
legend('误符号率', '误比特率', '理论误符号率', '理论误比特率');
title('8PSK信号在AWGN信道下的误比特率性能');
clear all;close all; clc;
%MFSK星座图没有容易错为相邻信号点的特点,故而FSK不必采用格雷编码规则
M = 4; %M进制
n_symbol = 100000; %传输的符号样例数目(足够多的样本使仿真趋近理论曲线)
freq_sep = 1; %符号速率
nsamp = 100; %每个符号的取样点数
Fs = nsamp*freq_sep; %采样频率
xn = randi([0, M-1], 1, n_symbol); %消息数据
xn_fsk = fskmod(xn, M, freq_sep, nsamp, Fs); %生成4FSK基带信号
fc = 10; %载波频率(严格来说,应该是FSK调制的中心频率)
t_xct = 0:length(xn_fsk)-1; %载波时序
xct = cos(2*pi*fc*t_xct); %载波
st = xn_fsk.*xct; %已调信号
P_symbol = norm(st).^2/n_symbol; %符号功率
EsN0_dB = 0:15; %信噪比(dB)
EsN0 = 10.^(EsN0_dB/10); %信噪比
snr = 2*EsN0; %计算SNR
Pb = zeros(size(EsN0_dB)); %误比特率
Ps = zeros(size(EsN0_dB)); %误符号率
Ps_th = Ps; %理论误符号率
for i = 1:length(EsN0_dB)
Pn = P_symbol/snr(i); %噪声功率
%根据测量的信号功率使用randn函数产生噪声
nt = sqrt(Pn)*(randn(1, length(st))+1j*randn(1,length(st)));
y_noise = st + nt; %叠加高斯白噪声
y_demod = y_noise.*cos(2*pi*fc*t_xct); %解调
yn = fskdemod(y_demod, M, freq_sep, nsamp, Fs); %判决器
[~, Pb(i)] = biterr(xn, yn, log2(M)); %误比特率
[~, Ps(i)] = symerr(xn, yn); %误符号率
%计算理论误符号率(最佳接收机)
for j = 1:M-1
Ps_thj(j) = (-1)^(j+1)*nchoosek(M-1, j)*(1/(j+1))*exp(-(j/(j+1))*EsN0(i));
end
Ps_th(i) = sum(Ps_thj);
end
Pb_th = Ps_th*M/2/(M-1);
semilogy(EsN0_dB, Ps, 'k-*', EsN0_dB, Pb, 'k-o', EsN0_dB, Ps_th, 'r-*', EsN0_dB, Pb_th, 'r-o');
xlabel('$E_s/{N_0}(dB)$', 'Interpreter','latex');
ylabel('错误概率');
legend('误符号率', '误比特率', '理论误符号率', '理论误比特率');
title('4FSK信号在AWGN信道下的误比特率性能');
信号仿真分析
- 对于ASK信号的生成,可将数字频带幅度调制的已调信号表达为PAM信号与载波的乘积,即
其中以PAM信号b(t)表示离散序列。故而在实验中,通过分别生成PAM信号与载波信号实现MASK信号。
- 对于PSK信号的生成,因为对于多进制PSK信号,其信号码元可视作由正弦和余弦两个正交分量合成的信号,故而在调制仿真与仿真中,MPSK信号码元可以看作是两个特定的MASK信号码元之和,其处理与MASK是类似的。
- 对于FSK信号的生成,MFSK信号可表示为M个等能量、频率不同的正交信号组合而成,有各码元信号为
而由MATLAB函数fskmod生成的信号为基带FSK信号,可理解其体现信号点的频率与中心频率的差值,可通过将其与载波相乘将其搬移至中心频率上。
特别地,由FSK信号的信号空间的特点可知(各信号点正交,信号点彼此完全对称),不存在某个信号点更容易错称相邻信号点的特点,故而没有必要采取格雷编码。
信道仿真
对于信道的仿真,实验中采取的是计算信号的符号功率,通过使用函数randn和根据snr生成噪声。注意此处涉及到snr与之间的转化关系:
理论分析
从误符号率曲线可见,三个信号在AWGN信道中的传输性能仿真结果,与理论的预估值是基本相符的。在足够大的样本个数下,仿真曲线与理论曲线的偏离很少。
其中:
-
对于MASK信号,有其误符号率为
-
对于MPSK信号,有其误符号率为
-
对于MFSK信号,若解调采用最佳接收结构时,有其误符号率可以表示为
在仿真中,最佳接收结构中的相关器(以及后续的判决器-最佳检测器)是由MATLAB函数fskdemod完成的。
值得补充的是误比特率的计算,对于FSK信号,由于其发生误码时每种样式出现的概率相等,故而可确定一次误码造成的平均错误比特数,有误比特率
然而对于MASK信号与MPSK信号,其误比特率的估算是通过
采用这样的估算的结果是:仿真的误比特率与预估的理论误比特率存在偏差,通常使得仿真曲线高于理论估算的误比特率曲线(在MPSK的仿真中犹为明显)。这是因为这一估算实则包含了这样一个前提:每个错误码元只错了一个比特。而实际上,错误接收的比特数在传输总比特数中所占的比例要比这种简化的讨论来得更复杂。