⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dqpsk.asv

📁 光通信中非归零型差分相位调制信号建模与仿真分析
💻 ASV
字号:
clear
pack
%**************************************************************************
%input7为7位,特定码序列
upinput7=[1 0 0 1 1 0 1];
%input7=[1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1];
%**************************************************************************
%prbs为127位,7级伪随机码序列
upp7=[0 0 0 1 0 0 1];
upprbs7=[ones(1,120) upinput7];
for ii=1:120;
    a=upinput7;                              %用于保存输入
    b=upinput7.*upp7;                          %产生下位的输入
    c=sum(b);
    d=mod(c,2);
    upprbs7(121-ii)=d;
    upinput7=[d a(1) a(2) a(3) a(4) a(5) a(6)];
end
a=0;                                       %论证1 0出现概率是相等
b=0;
for ii=1:127;
    if upprbs7(ii)==1
        a=a+1;
    else
        b=b+1;
    end
end
a=a/127;
b=b/127;
%**************************************************************************
%脉冲初始情况的设定,
fs=2e10;                                    %输入电信号时钟,其输出光脉冲时钟为电信号两倍
ts=1/(2*fs);;                               %脉冲时间
p0=1;                                       %设定输入光功率
f0=1.930897e14;                              %光波频率
n=8;                                     %单个脉冲的取样点
%**************************************************************************
%pulse为单个脉冲的包络函数
%t为产生单个脉冲的离散点,         
fwhm=ts/1.6;                                %半高全宽的取值比较关键!
t=linspace(-0.0*ts,1.0*ts,n); 
% pulse=p0*(sin((pi/2)*exp(-0.6931*(2*(t-0.5*ts)/fwhm).^4)));                 
uppulse=p0*ones(1,n); 
%**************************************************************************
%完成整个序列取样点的采集(加载数据信号到相位中)
%input7为特定序列,换成upprbs7则为伪随机序列,
%注意:如换为input7,则以下有两处需要替换,并且上面upprbs7的产生要注释掉。
m=length(upprbs7);                                %m为序列中脉冲个数
k=m*n;                                          %k为全部取样点的个数,即序列中脉冲个数*单个脉冲的取样点
upsequence=zeros(1,k);                            %产生取样点矩阵,sequence为不加载波的序列                              
for ii=1:m;
   if upprbs7(ii)==1;                             %input7为特定序列,换成prbs7则为伪随机序列
       for jj=1:n;
      upsequence(((ii-1)*n+jj))=uppulse(jj);      %数据为1则相位相同
       end
   else
       for jj=1:n;
      upsequence(((ii-1)*n+jj))=-uppulse(jj);     %数据为0则相位相反
       end
   end
end
%**************************************************************************
%加上载波信号
wt=linspace(0,(ts*m),k);
upsequence_c=upsequence.*exp(i*2*pi*f0*wt);         %sequence_c为加载波的序列,exp(i*2*pi*f0*wt)为光载波
uppulse_c=uppulse.*exp(i*2*pi*f0*t);                    %pulse_c为加载波的单个脉冲
%**************************************************************************
%上面是上路信号,下面是下路信号,下路信号要加相位差pi/2
%**************************************************************************
%input7为7位,特定码序列
lowinput7=[1 0 0 1 1 0 1];
%input7=[1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1];
%**************************************************************************
%prbs为127位,7级伪随机码序列
lowp7=[0 0 0 1 0 0 1];
lowprbs7=[ones(1,120) lowinput7];
for ii=1:120;
    a=lowinput7;                              %用于保存输入
    b=lowinput7.*lowp7;                          %产生下位的输入
    c=sum(b);
    d=mod(c,2);
    lowprbs7(121-ii)=d;
    lowinput7=[d a(1) a(2) a(3) a(4) a(5) a(6)];
end
a=0;                                       %论证1 0出现概率是相等
b=0;
for ii=1:127;
    if lowprbs7(ii)==1
        a=a+1;
    else
        b=b+1;
    end
end
a=a/127;
b=b/127;
%**************************************************************************
%脉冲初始情况的设定,
fs=2e10;                                    %输入电信号时钟,其输出光脉冲时钟为电信号两倍
ts=1/(2*fs);;                               %脉冲时间
p0=1;                                       %设定输入光功率
f0=1.930897e14;                              %光波频率
n=8;                                     %单个脉冲的取样点
%**************************************************************************
%pulse为单个脉冲的包络函数
%t为产生单个脉冲的离散点,         
fwhm=ts/1.6;                                %半高全宽的取值比较关键!
t=linspace(-0.0*ts,1.0*ts,n); 
% pulse=p0*(sin((pi/2)*exp(-0.6931*(2*(t-0.5*ts)/fwhm).^4)));                 
lowpulse=p0*ones(1,n); 
%**************************************************************************
%完成整个序列取样点的采集(加载数据信号到相位中)
%input7为特定序列,换成upprbs7则为伪随机序列,
%注意:如换为input7,则以下有两处需要替换,并且上面upprbs7的产生要注释掉。
m=length(lowprbs7);                                %m为序列中脉冲个数
k=m*n;                                          %k为全部取样点的个数,即序列中脉冲个数*单个脉冲的取样点
lowsequence=zeros(1,k);                            %产生取样点矩阵,sequence为不加载波的序列                              
for ii=1:m;
   if lowprbs7(ii)==1;                             %input7为特定序列,换成prbs7则为伪随机序列
       for jj=1:n;
      lowsequence(((ii-1)*n+jj))=lowpulse(jj)*exp(i*pi/2);      %数据为1则相位相同
       end
   else
       for jj=1:n;
      lowsequence(((ii-1)*n+jj))=-lowpulse(jj);     %数据为0则相位相反
       end
   end
end
%**************************************************************************
%加上载波信号
wt=linspace(0,(ts*m),k);
lowsequence_c=lowsequence.*exp(i*2*pi*f0*wt);         %sequence_c为加载波的序列,exp(i*2*pi*f0*wt)为光载波
lowpulse_c=lowpulse.*exp(i*2*pi*f0*t);                    %pulse_c为加载波的单个脉冲
%**************************************************************************
%然后把上下两路相加
%画出时域的图形
%画出单个脉冲的形状
% figure(1);
% plot(t/1e-12,abs(pulse).^2);                        %pulse为不加载波的单个脉冲
% ylabel('Normalized Power (au)');xlabel('Time (ps)');
% title('NRZ-DPSK pulse');
% figure(2);
% plot(t/1e-12,abs(pulse_c).^2);
% ylabel('Normalized Power (au)');xlabel('Time (ps)');
% title('NRZ-DPSK pulse');
% %画出全部伪随机序列脉冲形状
% figure(3);
% plot(wt/1e-12,abs(sequence).^2);                          %输出不加载波的脉冲序列
% set(gca,'Xtick',[0:ts/1e-12:m*ts/1e-12]);
% ylabel('Normalized Power (au)');xlabel('Time (ps)');
% title('NRZ-DPSK pulse');
% figure(4);
% plot(wt/1e-12,abs(sequence_c).^2);                        %输出加载波的脉冲序列
% set(gca,'Xtick',[0:ts/1e-12:m*ts/1e-12]);
% ylabel('Normalized Power (au)');xlabel('Time (ps)');
% title('NRZ-DPSK pulse');

%**************************************************************************
%利用FFT进行时域到频域的变换
%注意:频域范围取决于采样点数n,n越小,频域横坐标越小
%注意:曲线的精细程度取决于时域范围T,T=dt*n*m=ts*m,其中ts为定值,则脉冲个数m越大,越精细
dt=ts/n;                                              %dt为时域间隔
T=dt*k;                                               %length(sequence)为脉冲在时域上的采样点数,也等于频域上的采样点数,即n*length(input)
df=1/T;                                               %T为时域范围,df为频域间隔
F=df*k;                                               %F为频域范围,也等于1/dt
f_x=df*(-k/2:k/2-1);        
%傅立叶变换,再fftshift移位 
spectra_amp=fftshift(fft(sequence_c))/k;              %傅立叶变换后要除以采样点数
spectra_pow=abs(spectra_amp).^2;
spectra_log=10*log10(abs(spectra_amp).^2+1e-10);      %对数坐标更接近实际显示
%**************************************************************************
%画出频谱图
figure(3);
plot(f_x/1e9,spectra_log);                            %纵坐标换成GHz,观察更方便
axis([-120,120,-100,0]);
set(gca,'Xtick',[-120,-80,-40,0,40,80,120])
ylabel('Power (dB)');xlabel('Frequence (GHz)');
title('NRZ-DPSK Spectrum');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -