Simulink通信工具箱中的Comm Sources/Data Sources提供了数字信号源Bernoulli Binary Generator,这是一个按Bernoulli分布提供随机二进制数字信号的通用信号发生器。在现实中,对受信者而言,发送端的信号是不可预测的随机信号。因此,我们在仿真中可以用Bernoulli Binary Generator来模拟基带信号发生器。其中主要参数的含义为:
Probability of a zero :产生的信号中0 符号的概率,在仿真的时候一般设成0.5,这样便于频谱的计算;
Initial seed :控制随机数产生的参数,要求不小于30,而且与后面信道中的Initial seed 设置不同的值;
Sample time:抽样时间,这里指一个二进制符号所占的时间,用来控制号发生的速率,这个参数必须与后面调制和解调模块的Symbol period 保持一致。
2.3 调制与解调模块
Simulink 通信工具箱中提供了数字信号各种调制方式的模块,如AM、CPM、FM 及PM 等。虽然不同的调制模块,参数设置有所不同,但很多参数在各种调制中是一致的,下面我们以DPSK 调制模块为例介绍一下调制模块的参数及其设置,其余模块将在下面仿真模型的建立过程中详细介绍。
M-DPSK Modulator Baseband和M-DPSK Demodulator Baseband 分别是数字信号DPSK调制和解调的专用模块,其中主要参数有:
M-ary number:输入信号的阶次数,比如2-DPSK就是2阶的;
Symbol period:符号周期,即,一个符号所占的时间,这必须与信号源的Sample time保持一致;
Carrier frequency:载波频率;
Carrier initial phase:载波的初始相位;
Input sample time: 输入信号的抽样时间;
Output sample time:输出信号的抽样时间。
其中,各参数要满足以下关系:
Symbol period > 1/(Carrier frequency)
Input sample time < 1/[2*Carrier frequency + 2/(Symbol period)]
Output sample time <1/[2*Carrier frequency + 2/(Symbol period)]
2.4 信道
在分析通信系统时通常选择高斯噪声作为系统的噪声来考查,因为这种噪声在现实中比较常见而且容易分析。Simulink 中提供了带有加性高斯白噪声的信道:AWGN Channe。仿真时可以用该模块模拟现实中的信道,该模块的主要参数有:
Initial seed:控制随机数产生的参数,要求不小于30,且与前面信号源中的Initial seed 设置不同的值;
Es/No (dB):信号每个符号的能量与噪声的功率谱密度的比值;
SNR (dB): 信号功率与噪声功率的比值;
注:Es/No (dB) 和SNR (dB)是表征信号与噪声关系的两种方法,在一次仿真中
只能选择其中一个。
2.5 误码计算仪
信号经过信道后,由于噪声的干扰,在接收端可能出现误码,Simulink中提供了Error Rate Calculation 模块来计算误码率,其主要参数的设置为:
Receive delay:接收延迟,表明在计算误码率时接收到的信号比源信号延迟的码元数,便于准确计算
Output data:数据输出,将误码率、误码数及码元总数输出,有两个选项可选择:Work space 和 Port。将数据输出到Work space就是将误码率等数据存在内存中,以便下一步使用,而输出到Port中,则是在误码计算仪后面再接一个模块(比如结果显示模块),将数据传到该模块中(显示出来);
Variable name:变量名称,该参数只有在前面选择了Work space后才有用,它决定数据输出到Wok space后的名称,默认值为ErrorVec。
利用伯努利二进制信号发生器(Bernoulli Binary Generator)成生数字信号,利用Simulink 通信工具箱中提供了专门的FSK 调制和解调模块应用FSK 调制模块能可方便地产生2FSK 信号,根据图3.1所示仿真框图。
附录1 MPSK仿真程序
N = 2*10^5;% 2PSK误码率计算
M = 2;
thetaMpsk = [0:M-1]*2*pi/M;
Es_N0_dB = [0:25];
ipPhaseHat = zeros(1,N);
for ii = 1:length(Es_N0_dB)
ipPhase = randsrc(1,N,thetaMpsk);
ip = exp(j*ipPhase);
s = ip;
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)];
y = s + 10^(-Es_N0_dB(ii)/20)*n;
opPhase = angle(y);
opPhase(find(opPhase<0)) = opPhase(find(opPhase<0)) + 2*pi;
ipPhaseHat = 2*pi/M*round(opPhase/(2*pi/M)) ;
ipPhaseHat(find(ipPhaseHat==2*pi)) = 0;
nErr(ii) = size(find([ipPhase- ipPhaseHat]),2);
end
simBer = nErr/N;
theoryBer2 = erfc(sqrt(10.^(Es_N0_dB/10))*sin(pi/M));
figure
semilogy(Es_N0_dB,theoryBer2,'bs-','LineWidth',2);
hold on
N = 2*10^5; % 4PSK误码率计算
M = 4;
thetaMpsk = [0:M-1]*2*pi/M;
Es_N0_dB = [0:25];
ipPhaseHat = zeros(1,N);
for ii = 1:length(Es_N0_dB)
ipPhase = randsrc(1,N,thetaMpsk);
ip = exp(j*ipPhase);
s = ip;
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)];
y = s + 10^(-Es_N0_dB(ii)/20)*n;
opPhase = angle(y);
opPhase(find(opPhase<0)) = opPhase(find(opPhase<0)) + 2*pi;
ipPhaseHat = 2*pi/M*round(opPhase/(2*pi/M)) ;
ipPhaseHat(find(ipPhaseHat==2*pi)) = 0;
nErr(ii) = size(find([ipPhase- ipPhaseHat]),2);
end
simBer = nErr/N;
theoryBer4 = erfc(sqrt(10.^(Es_N0_dB/10))*sin(pi/M));
semilogy(Es_N0_dB,theoryBer4,'bs-','LineWidth',2);
hold on
N = 2*10^5; % 16PSK误码率计算
M = 16;
thetaMpsk = [0:M-1]*2*pi/M;
Es_N0_dB = [0:25];
ipPhaseHat = zeros(1,N);
for ii = 1:length(Es_N0_dB)
ipPhase = randsrc(1,N,thetaMpsk);
ip = exp(j*ipPhase);
s = ip;
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)];
y = s + 10^(-Es_N0_dB(ii)/20)*n;
opPhase = angle(y);
opPhase(find(opPhase<0)) = opPhase(find(opPhase<0)) + 2*pi;
ipPhaseHat = 2*pi/M*round(opPhase/(2*pi/M)) ;
ipPhaseHat(find(ipPhaseHat==2*pi)) = 0;
nErr(ii) = size(find([ipPhase- ipPhaseHat]),2);
end
simBer = nErr/N;
theoryBer16 = erfc(sqrt(10.^(Es_N0_dB/10))*sin(pi/M));
semilogy(Es_N0_dB,theoryBer16,'bs-','LineWidth',2);
hold on
N = 2*10^5; % 8PSK误码率计算
M = 8;
thetaMpsk = [0:M-1]*2*pi/M;
Es_N0_dB = [0:25];
ipPhaseHat = zeros(1,N);
for ii = 1:length(Es_N0_dB)
ipPhase = randsrc(1,N,thetaMpsk);
ip = exp(j*ipPhase);
s = ip;
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)];
y = s + 10^(-Es_N0_dB(ii)/20)*n;
opPhase = angle(y);
opPhase(find(opPhase<0)) = opPhase(find(opPhase<0)) + 2*pi;
ipPhaseHat = 2*pi/M*round(opPhase/(2*pi/M)) ;
ipPhaseHat(find(ipPhaseHat==2*pi)) = 0;
nErr(ii) = size(find([ipPhase- ipPhaseHat]),2);
end
simBer = nErr/N;
theoryBer16 = erfc(sqrt(10.^(Es_N0_dB/10))*sin(pi/M));
semilogy(Es_N0_dB,theoryBer16,'bs-','LineWidth',2);
hold on
axis([0 25 10^-5 1])
grid on
%legend('theory', 'simulation');
xlabel('Es/No, dB')
ylabel('Symbol Error Rate')
title('Symbol error probability curve for MPSK modulation')
附录2 MFSK仿真程序
global dt df t f N T
close all
N=2^13;
L=32;
M=N/L;
Rb=4;
Rb=2 %Mb/s
Ts=1/Rb;
dt=Ts/L;
df=1/(N*dt);
T=N*dt;
Bs=N*df/2;
Na=2;
t=linspace(-T/2+Ts/4,T/2+Ts/4,N);
f=linspace(-Bs,Bs,N)+eps;
alpha=0;
%ÉýÓàÏÒ
hr1=sin(pi*t/Ts)./(pi*t/Ts);
hr2=cos(alpha*pi*t/Ts)./(1-(2*alpha*t/Ts).^2);
hr=hr1.*hr2;
HR=abs(t2f(hr)); GT=sqrt(HR); GR=GT;
A=1;
f1=5/Ts;
f2=2/Ts;
m=A*cos(2*pi*f1*t);
n=-A*cos(2*pi*f2*t);
EP=zeros(size(f));
EPa=zeros(size(f));
EPy=zeros(size(f));
EPr=zeros(size(f));
EPo=zeros(size(f));
for loop1=1:15
Eb_N0(loop1)=2*(loop1-1); %Eb/N0 in dB
eb_n0(loop1)=10^(Eb_N0(loop1)/10);
Eb=1;
n0=Eb/(4*eb_n0(loop1));
sita=n0*Bs;
n_err=0;
for loop2=1:5
a=round(rand(1,M));
b=a-1;
s=zeros(1,N);
ss=zeros(1,N);
for ii=1:Ts/dt;
s(ii+[0:M-1]*L)=a;
ss(ii+[0:M-1]*L)=b;
end
S=t2f(s);
P=S.*conj(S)/T;
EP=(EP*(loop1-1)+P)/loop1;
s1=s.*m;
s2=ss.*n;
st=s1+s2;
ST=t2f(st);
Pa=ST.*conj(ST)/T;
EPa=(EPa*(loop1-1)+Pa)/loop1;
n_ch=sqrt(sita)*randn(size(t));
sr1=st.*m;
sr2=st.*(-n);
SR=t2f(sr1);
Pr=SR.*conj(SR)/T;
EPr=(EPr*(loop1-1)+Pr)/loop1;
y1=real(f2t(t2f(sr1).*GR));
y2=real(f2t(t2f(sr2).*GR));
Y1=t2f(y1);
Py=Y1.*conj(Y1)/T;
EPy=(EPy*(loop1-1)+Py)/loop1;
y11=y1(L/2:L:N);
y22=y2(L/2:L:N);
y=y11-y22;
y=(sign(y)+1)/2;;
n_err=n_err+length(find(y~=a))
end
Pe(loop1)=n_err/(M*loop2)
for ii=1:Ts/dt;
e(ii+[0:M-1]*L)=y;
end
E=t2f(e); Po=E.*conj(E)/T;
EPo=(EPo*(loop1-1)+Po)/loop1;
end
%clear all;
%close all;
format long;
snr=0:10;
for n=1:length(snr);
peAnaly(n)=(8-1)/2*exp(-10^(snr(n)/10)*1.5);
i=1;
number=0;
aa=snr(n)
for i=1:20;
%%% random symbols
BS=randint(200,1,2);
%%% FSK modulator
fsk=fskmod(BS, 8,2,4,20);
%%% received signals with additive white Gaussian noise
Rxsignals=awgn(fsk, aa, 'measured');
%%% demodulated signals
fskdem=fskdemod(Rxsignals, 8,2,4,20);
%%% count number of errors
[num1, ratio]=biterr(BS, fskdem);
number=number+num1;
end
pe(n)=number/20000;
end
figure;
eb_n0=10.^(Eb_N0/10);
plot(snr,peAnaly,'-b*',Eb_N0,0.5*erfc(sqrt(eb_n0/2)));
%h=legend('Simulated Pe', 'Analytical Pe');
axis([0,15,1e-5,1])
%title('Pe of 8FSK with Additive White Gaussian Noise');
%axis([0 10 1.0e-006 1]);
set(gca, 'YScale', 'log');
xlabel('Eb/No (dB)');
ylabel('probability of err Pe');
grid on;
%semilogy(Eb_N0,Pe,'w');
%xlabel('Eb/N0')
%ylabel('Pe')
title('MFSK的误码率曲线 ')