利用matlab进行数字调制

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的误码率曲线 ')

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值