在基带上,2FSK看作两路正交信号:
s 1 = ( E , 0 ) s_{1}=(\sqrt{\mathcal{E}}, 0) s1=(E,0)
s 2 = ( 0 , E ) s_{2}=(0, \sqrt{\mathcal{E}}) s2=(0,E)
相当于向量的两个位置代表两个频率。
MFSK请参考:MFSK调制与解调-MATLAB基带仿真
瑞利衰落信道
瑞利衰落信道的核心在于乘性衰落因子 h h h:
h = (randn(2,L)+1j*randn(2,L))/sqrt(2); % L为信号长度,两行表示信号为2维
其中 2 \sqrt2 2为归一化系数,使得 h h h方差为1。
这里解释几个问题:
Q:为什么 h h h服从瑞利分布?
A:在此篇仿真中,我们认为信道不存在多普勒频移,即FDT=0,同时来波的方向是均匀分布且无穷多的,没有直射分量(若有直射分量,信道衰落系数变为莱斯分布),此时信道衰落系数可等效为瑞利分布。若要考虑多普勒频移的影响,需要建立时间选择性衰落信道,此篇文章方法不适用。
Q:为什么仿真中 h h h的方差设置为1?
A:设AWGN信道下2FSK系统平均信噪比为 E b N 0 \frac{E_b}{N_0} N0Eb,则瑞利衰落信道下2FSK系统平均信噪比为
为了公平地在一张图中比较2FSK系统在两种信道下的性能差异,要使得仿真中的横坐标,也就是平均信噪比相同,因此设置 h h h的方差为1
Q:为什么在仿真中,每一个发送符号都乘了不同的信道衰落系数,信道不是分快衰落和慢衰落吗?
A:实际上,一个相同的 h h h持续几个符号,对仿真结果没有影响。我们考察的是统计误码率,只要统计样本足够多,结果是没有变化的。当然在实际问题中,需要考虑信道衰落的平坦与否。
简单评价一下: h h h和 n n n对信号的影响有着本质的区别。后者是加性信号,前者是乘性信号,存在对原始信号的放缩作用,因此在利用门限进行判别星座点时,非常容易发生误判。对抗衰落信道的方法有很多,典型的方法有分集等。
相干调制与解调:
相干调制:
相干解调:
2FSK在AWGN信道下的相干解调理论误比特率:
2FSK在瑞利衰落信道下的相干解调理论误比特率:
非相干调制与解调:
非相干调制:
其中 ϕ \phi ϕ服从在[0,2π]上的均匀分布。
非相干解调:
2FSK在AWGN信道下的非相干解调理论误比特率:
BPSK在瑞利衰落信道下的非相干解调理论误比特率:
MATLAB基带仿真程序:
clc
clear
close all
% Title: 2FSK的在瑞利衰落信道下的相干与非相干检测误码率仿真 %
% Data: 2020.05.04 %
% Author: K.X.Song
L = 10000000; % 蒙特卡洛仿真次数
data = round(rand(1,L)); % 生成长度为L的仿真数据
send = zeros(2,L); % 预置调制后的发送数据,每列为一个符号,行表示M维信号。
% 2FSK调制
for q = 1:L
if (data(q) == 1)
send(1,q) = 1;
else
send(2,q) = 1;
end
end
h = (randn(2,L)+1j*randn(2,L))/sqrt(2); % 瑞利衰落信道系数
% 设置信噪比
EbN0_dB = 0:2:50;
EbN0 = 10.^(EbN0_dB/10);
Eb = 1; % 2FSK的每比特能量
N0 = Eb ./ EbN0;
error_coherent = zeros(1,length(EbN0_dB));
error_noncoherent = zeros(1,length(EbN0_dB));
ser_coherent = zeros(1,length(EbN0_dB));
ser_noncoherent = zeros(1,length(EbN0_dB));
tser_coherent_AWGN = zeros(1,length(EbN0_dB));
tser_coherent_fading = zeros(1,length(EbN0_dB));
tser_noncoherent_AWGN = zeros(1,length(EbN0_dB));
tser_noncoherent_fading = zeros(1,length(EbN0_dB));
for q = 1:length(EbN0_dB)
detect_coherent = zeros(1,L);
detect_noncoherent = zeros(1,L);
noise_coherent = sqrt(N0(q)/2) * randn(2,L); % 相干调制噪声
noise_noncoherent = (sqrt(N0(q)/2) + 1j * sqrt(N0(q)/2)) * randn(2,L); % 非相干调制噪声
receive_coherent = abs(h).*send + noise_coherent; % 瑞利衰落信道相干调制
receive_noncoherent = h.*send + noise_noncoherent; % 瑞利衰落信道相干调制
% 相干解调
for w = 1:L
if (receive_coherent(1,w) > receive_coherent(2,w))
detect_coherent(w) = 1; % argmin判决,相干解调
end
% 统计错误数
if (detect_coherent(w) ~= data(w))
error_coherent(q) = error_coherent(q) + 1;
end
end
% 非相干解调
for w = 1:L
r_1 = abs(dot(receive_noncoherent(:,w),[1;0]));
r_2 = abs(dot(receive_noncoherent(:,w),[0;1]));
if (r_1 > r_2)
detect_noncoherent(w) = 1; % argmin判决,相干解调
end
% 统计错误数
if (detect_noncoherent(w) ~= data(w))
error_noncoherent(q) = error_noncoherent(q) + 1;
end
end
ser_coherent(q) = error_coherent(q) / L;
ser_noncoherent(q) = error_noncoherent(q) / L;
% 2FSK在AWGN信道下相干解调理论误码率
tser_coherent_AWGN(q) = qfunc(sqrt(EbN0(q)));
% 2FSK在瑞利衰落信道下相干解调理论误码率
tser_coherent_fading(q) = 1/2*(1-sqrt(EbN0(q)/(2+EbN0(q))));
% 2FSK在AWGN信道下非相干解调理论误码率
tser_noncoherent_AWGN(q) = 1/2*exp(-EbN0(q)/2);
% 2FSK在瑞利衰落信道下相干解调理论误码率
tser_noncoherent_fading(q) = 1/(2+EbN0(q));
end
% 画图
semilogy(EbN0_dB,ser_coherent,'o',EbN0_dB,ser_noncoherent,'o',EbN0_dB,tser_coherent_AWGN,'b',EbN0_dB,tser_noncoherent_AWGN,'m',EbN0_dB,tser_coherent_fading,'r',EbN0_dB,tser_noncoherent_fading,'k');
grid on;
xlabel('Eb/N0 (dB)');
ylabel('SER');
legend('2FSK在瑞利衰落信道下的相干检测仿真误码率','2FSK在瑞利衰落信道下的非相干检测仿真误码率','2FSK在AWGN信道下的相干检测理论误码率',...
'2FSK在AWGN信道下的非相干检测理论误码率','2FSK在瑞利衰落信道下的相干检测理论误码率','2FSK在瑞利衰落信道下的非相干检测理论误码率');
axis([0 50 10^-5 10^-1]);