精华内容
下载资源
问答
  • gnss二阶锁相环滤波器
    2021-03-25 13:31:06

    gnss定位之二阶锁相环滤波器

    锁相环路的滤波器是一阶加上滤波器后面还有一个数控振荡器,锁相环就是二阶环路。

    在这里插入图片描述
    环路滤波器的传递函数为:

    在这里插入图片描述

    在这里插入图片描述

    更多相关内容
  • 二阶锁相环参数设置,清楚的介绍路二阶锁相环的原理以及每个参数的设置要求。适用于新手
  • 通信实验仿真
  • matlab实现二阶锁相环参数设计

    千次阅读 2021-04-23 19:54:27
    matlab实现二阶锁相环参数设计 锁相环数学模型 图1 锁相环的复频域模型 锁相环是由鉴相器、环路滤波器、压控振荡器组成的,其中系统传递函数可以表示成H(s)H(s)H(s),误差传递函数可以表示成He(s)H_e(s)He​(s)。...

    锁相环数学模型

    这里插入图片描述

    图1 锁相环的复频域模型

    锁相环是由鉴相器、环路滤波器、压控振荡器组成的,其中系统传递函数可以表示成 H ( s ) H(s) H(s),误差传递函数可以表示成 H e ( s ) H_e(s) He(s)。其中参考公式可以参考《锁相环技术原理FPGA实现》。在此只给出一些重要的公式。
    H ( s ) = θ 2 ( s ) θ 1 ( s ) = K d F ( s ) N ( s ) 1 + K d F ( s ) N ( s ) H e ( s ) = θ e ( s ) θ 1 ( s ) = 1 1 + K d F ( s ) N ( s ) \begin{aligned} H(s)=\frac{\theta_2(s)}{\theta_1(s)}=\frac{K_dF(s)N(s)}{1+K_dF(s)N(s)} \\ H_e(s)=\frac{\theta_e(s)}{\theta_1(s)}=\frac{1}{1+K_dF(s)N(s)} \end{aligned} H(s)=θ1(s)θ2(s)=1+KdF(s)N(s)KdF(s)N(s)He(s)=θ1(s)θe(s)=1+KdF(s)N(s)1

    二阶锁相环的环路滤波器

    环路滤波器是一个低通滤波器,所以我们可以设其 F ( s ) = k 1 + k 2 S F(s)=k_1+\frac{k_2}{S} F(s)=k1+Sk2,直接给出 k 1 、 k 2 k_1、k_2 k1k2的参数设计公式。
    k 1 = 8 3 B n k 2 = 1 2 k 1 2 \begin{aligned} k_1=\frac{8}{3}B_n\\ k_2=\frac{1}{2}k_1^2 \end{aligned} k1=38Bnk2=21k12
    参考书籍可以参考《Controlled‐root formulation for digital phase‐locked loops》
    利用双线性变换公式将 F ( s ) F(s) F(s)转换成相应的Z域表达式 F ( z ) = k 1 + k 2 T 2 1 + z − 1 1 − z − 1 \begin{aligned}F(z)=k_1+k_2\frac{T}{2}\frac{1+z^{-1}}{1-z^{-1}}\end{aligned} F(z)=k1+k22T1z11+z1
    所以得到时域的表达形式
    V ( k ) − V ( k − 1 ) = k 1 [ ϵ ( k ) − ϵ ( k − 1 ) ] + k 2 T / 2 [ ϵ ( k ) − ϵ ( k − 1 ) ] \begin{aligned}V(k)-V(k-1)=k_1[\epsilon(k)-\epsilon(k-1)]+k_2T/2[\epsilon(k)-\epsilon(k-1)]\end{aligned} V(k)V(k1)=k1[ϵ(k)ϵ(k1)]+k2T/2[ϵ(k)ϵ(k1)], ϵ ( k ) \epsilon(k) ϵ(k)是环路滤波器的输入, V ( k ) V(k) V(k)是环路滤波器的输出。

    数字压控振荡器

    压控振荡器的Z域表达式在网上到处都可以查到,但是我认为这其实也是最困扰我或者说大部分人的地方。首先还是先给出压控振荡器的Z域模型。
    N ( z ) = K 0 T z − 1 1 − z − 1 \begin{aligned}N(z)=\frac{K_0Tz^{-1}}{1-z^{-1}}\end{aligned} N(z)=1z1K0Tz1简单解释一下其中 K 0 K_0 K0是考虑到FPGA实现时候的增益问题, T T T是更新周期这是一个非常重要的参数不同于系统的采样间隔。将 N ( z ) N(z) N(z)转换成时域表达式
    T ∗ V ( k − 1 ) = θ 0 ( k ) − θ 0 ( k − 1 ) \begin{aligned}T*V(k-1)=\theta_0(k)-\theta_0(k-1)\end{aligned} TV(k1)=θ0(k)θ0(k1)如果我想要利用得到的是频率而不是相位则重构公式
    f ( k ) = θ 0 ( k ) − θ 0 ( k − 1 ) 2 π T \begin{aligned}f(k)=\frac{\theta_0(k)-\theta_0(k-1)}{2\pi T}\end{aligned} f(k)=2πTθ0(k)θ0(k1)
    δ f ( k ) = θ 0 ( k ) − θ 0 ( k − 1 ) − θ 0 ( k − 1 ) + θ 0 ( k − 2 ) 2 π T = T V ( k ) − V ( k − 1 ) 2 π T = k 1 [ ϵ ( k ) − ϵ ( k − 1 ) ] + k 2 T / 2 [ ϵ ( k ) − ϵ ( k − 1 ) ] 2 π \begin{aligned}\delta f(k)&=\frac{\theta_0(k)-\theta_0(k-1)-\theta_0(k-1)+\theta_0(k-2)}{2\pi T}\\&=T\frac{V(k)-V(k-1)}{2\pi T}\\&=\frac{k_1[\epsilon(k)-\epsilon(k-1)]+k_2T/2[\epsilon(k)-\epsilon(k-1)]}{2\pi }\end{aligned} δf(k)=2πTθ0(k)θ0(k1)θ0(k1)+θ0(k2)=T2πTV(k)V(k1)=2πk1[ϵ(k)ϵ(k1)]+k2T/2[ϵ(k)ϵ(k1)]到此可以看到一个非常巧妙的地方就是可以直接有环路滤波器的输出直接得到频率的变换率,这也是我这一篇文章想要说明的问题(对于初学者来说可能会对与锁相环怎么去得到频率变化率苦恼,对此给出了公式解答)

    matlab代码

    // An highlighted block
    clc
    clear all;
    
    fs = 50e6; %采样频率
    ts = 1/fs; 
    dataLen = 10e6;  %数据长度
    SNR = -15;
    realFc = 10000500; %实信号频率
    initPhase = 2*pi*realFc*(0:dataLen-1)*ts+pi/4;%输入信号的实际相位,为了对后面得到相位进行比较
    data = sin(2*pi*realFc*(0:dataLen-1)*ts+pi/4); %科斯塔斯环的输入信号
    pllFc = 10000000; %本地频率
    
    cumulTime = 10000;%累积时间
    
    n = fs/cumulTime; 
    nn = [0:n-1];
    blockNum = floor(length(data)/n);% 数据块数目
    frame = 0;
    phase = 0;
    
    T = 1/10000; %锁相环更新时间
    cp1 = 8/3*40;   %二阶锁相环参数一,K1,此时等效噪声带宽20Hz
    cp2 = cp1*cp1/2*T/2;   %二阶锁相环参数二,K2
    vo=0;          %压控振荡器输入
    vo_1=0;        %压控振荡器上一个时刻的输入
    dfrqFrame(1) = pllFc;
    for frame=2:blockNum
    expData = exp(1i*(2*pi*pllFc*ts*nn+phase));
    sine = imag(expData);   %本地数据
    cosine = real(expData);
    
    x = data((1:n)+((frame-1)*n));
     %将数据转换到基带
    xSine = x.*sine;
    xCosine = x.*cosine;
    
    I = sum(xSine);      %积分累加相当于滤波
    Q = sum(xCosine);
    pd(frame) = atan(Q/I)/2/pi;   %这里的2pi是为了公式中求delta f做准备
    
     
    %锁相环
    deltapd =  pd(frame) -  pd(frame-1);    %解释一下这,例如上一次理论鉴相输出是0.46pi,这一次理论输出是0.92pi,但是
    if(abs(deltapd) >= 0.25)               %atan函数的实际输出是-0.08pi,所以差需要修正。类似的和不需要修正因为cp2比较小,cp1较大
         if(deltapd > 0)
            deltapd = deltapd - 0.5;
         else
            deltapd = deltapd + 0.5;
         end
    end
    %============================环路滤波、delta F求出来=======================
    vo = vo_1 + cp1*(deltapd) + cp2*(pd(frame) +  pd(frame-1));  %VCO输入
    pllFc = pllFc + (vo - vo_1); %本地复现载波频率更新
    vo_1 = vo;
    %==========================================================================
    dfrqFrame(frame) = pllFc; 
    phase = 2*pi*dfrqFrame(frame-1)*ts*n+phase ;   %得到不同块的相位
    dphaseFrame(frame) = phase; 
    
    end
    figure(1)
    plot((0:n:dataLen-1)/fs, realFc*ones(1,length(dfrqFrame)),'r');
    hold on
    plot((0:n:dataLen-1)/fs,dfrqFrame);
    title('锁相环实时频率和输入频率对比')
    xlabel('second');
    ylabel('freq/hz')
    legend('锁相环跟踪','实际的载波频率');
    

    仿真结果分析

    经过这种方法设计的锁相环设计参数只有一个环路噪声带宽 B n Bn Bn,从而使设计大大的简化。最值得注意的就是PLL锁相环实现频率输出时候的细节,可以参照主要公式。

    在这里插入图片描述

    图2 锁相环实时频率跟踪

    在这里插入图片描述

    图3 锁相环的实时频率跟踪

    简单分析一下,图2是压控振荡器更新周期是1.0000e-04,环路噪声带宽是50Hz时候,环路在0.08s左右收敛。图3是压控振荡器更新周期是1.0000e-04,环路噪声带宽是70Hz时候,环路在0.05s左右收敛。环路噪声带宽的选择取决于用户的实际,卫星的载波环大致选择20Hz左右,码环更精细一点,环路噪声带宽大相应的收敛加快,但是带来的捕获跟踪精度会降低。所以设计者需要根据实际进行权衡。

    展开全文
  • 1、资料包含二阶环路设计简要说明,Matlab程序,Matlab程序模拟FPGA工作方式,对各变量进行了量化处理 2、资料包含使用Vivado2015.4.2版本的工程文件,可直接运行查看仿真结果 3、参考资料为杜勇老师的《锁相环技术...
  • 本蚊介绍了仿真的环境以及二阶锁相环的仿真过程,并对其仿真结果进行了分析。在前三章的理论基础上,通过使用MATLAB7.0进行了仿真。验结果表明:用MATLAB进行的二阶锁相环仿真达到了最初的设想,锁相环的失锁、跟踪...

    本蚊介绍了仿真的环境以及二阶锁相环的仿真过程,并对其仿真结果进行了分析。在前三章的理论基础上,通过使用MATLAB7.0进行了仿真。

    验结果表明:用MATLAB进行的二阶锁相环仿真达到了最初的设想,锁相环的失锁、跟踪、捕获、锁定各个阶段均有体现。达到了最初仿真的要求。

    47e9ae37f9a4ea1ef429ce21dfd2bc90.png

    (典型仿真案例)图

    仿真使用软件MATLAB7.0

    仿真使用的软件是MATLAB7.0。由于MATLAB仿真软件适合多学科、多种工作平台且功能强大、界面友好、方便快捷、语言自然并且开放性强的大型优秀应用软件,已经也已成为国内外高等院校高等数学、数值分析、数字信号处理、自动控制理论以及工程应用等课程的基本教学工具。使用Matlab对锁相环仿真的实现是方便快捷的。

    仿真采用二阶锁相环

    仿真所采用的是二阶锁相环。这是由于我们实际应用中的绝大多数PLL,或者是二阶的,或者是通过忽略高阶效应(至少在初步设计时)而被设计成近似的二阶环路。鉴于二阶锁相环在实际应用的意义,所以在仿真采用了二阶锁相环。

    MATLAB仿真程序代码

    % File: c6_nltvde.m

    w2b=0; w2c=0; % iniTIalize integrators

    yd=0; y=0; % iniTIalize differenTIal equaTIon

    tfinal = 50; % simulation time

    fs = 100; % sampling frequency

    delt = 1/fs; % sampling period

    npts = 1+fs*tfinal; % number of samples simulated

    ydv = zeros(1,npts); % vector of dy/dt samples

    yv = zeros(1,npts); % vector of y(t) samples

    %

    % beginning of simulation loop for i=1:npts t = (i-1)*delt;

    % time

    if t《20

    ydd = 4*exp(-t/2)-3*yd*abs(y)-9*y; % de for t《20

    else

    ydd = 4*exp(-t/2)-3*yd-9*y;

    % de for t》=20 end

    w1b=ydd+w2b; % first integrator - step 1 w2b=ydd+w1b;

    % first integrator - step 2

    yd=w1b/(2*fs); % first integrator output w1c=yd+w2c; % second integrator - step 1 w2c=yd+w1c;

    % second integrator - step 2

    y=w1c/(2*fs); % second integrator output ydv(1,i) = yd; % build dy/dt vector yv(1,i) = y; % build y(t) vector end

    % end of simulation loop

    plot(yv,ydv) % plot phase plane xlabel(‘y(t)’) % label x axis ylabel(‘dy/dt’)

    % label y zxis

    % End of script file. % File: pllpost.m

    %

    kk = 0; while kk == 0 k = menu(‘Phase Lock Loop Postprocessor’,。。。

    ‘Input Frequency and VCO Frequency’,。。。

    ‘Input Phase and VCO Phase’,。。。

    ‘Frequency Error’,‘Phase Error’,‘Phase Plane Plot’,。。。

    ‘Phase Plane and Time Domain Plots’,‘Exit Program’);

    if k == 1

    plot(t,fin,‘k’,t,fvco,‘k’)

    title(‘Input Frequency and VCO Freqeuncy’)

    xlabel(‘Time - Seconds’);ylabel(‘Frequency - Hertz’);pause

    elseif k ==2

    pvco=phin-phierror;plot(t,phin,t,pvco)

    title(‘Input Phase and VCO Phase’)

    xlabel(‘Time - Seconds’);ylabel(‘Phase - Radians’);pause

    elseif k == 3 plot

    (t,freqerror);title(‘Frequency Error’)

    xlabel(‘Time - Seconds’);ylabel(‘Frequency Error - Hertz’);pause

    elseif k == 4

    plot(t,phierror);title(‘Phase Error’)

    xlabel(‘Time - Seconds’);ylabel(‘Phase Error - Radians’);pause

    elseif k == 5

    ppplot

    elseif k == 6

    subplot(211);phierrn = phierror/pi;

    plot(phierrn,freqerror,‘k’);grid;

    title(‘Phase Plane Plot’);xlabel(‘Phase Error /Pi’);

    ylabel(‘Frequency Error - Hertz’);subplot(212)

    plot(t,fin,‘k’,t,fvco,‘k’);grid

    title(‘Input Frequency and VCO Freqeuncy’)

    xlabel(‘Time - Seconds’);ylabel(‘Frequency - Hertz’);subplot(111)

    elseif k == 7

    kk = 1;

    end

    end % End of script file.

    % File: pllpre.m

    %

    clear all % be safe

    disp(‘ ’) % insert blank line

    fdel = input(‘Enter the size of the frequency step in Hertz 》 ’);

    fn = input(‘Enter the loop natural frequency in Hertz 》 ’);

    lambda = input(‘Enter lambda, the relative pole offset 》 ’);

    disp(‘ ’)

    disp(‘Accept default values:’)

    disp(‘ zeta = 1/sqrt(2) = 0.707,’)

    disp(‘ fs = 200*fn, and’)

    disp(‘ tstop = 1’) dtype = input(‘Enter y for yes or n for no 》 ’,‘s’);

    if dtype == ‘y’

    zeta = 1/sqrt(2);

    fs = 200*fn;

    tstop = 1;

    else

    zeta = input(‘Enter zeta, the loop damping factor 》 ’);

    fs = input(‘Enter the sampling frequency in Hertz 》 ’);

    tstop = input(‘Enter tstop, the simulation runtime 》 ’);

    end %

    npts = fs*tstop+1; % number of simulation points

    t = (0:(npts-1))/fs; % default time vector

    nsettle = fix(npts/10); % set nsettle time as 0.1*npts

    tsettle = nsettle/fs; % set tsettle

    % The next two lines establish the loop input frequency and phase

    % deviations.

    fin = [zeros(1,nsettle),fdel*ones(1,npts-nsettle)];

    phin = [zeros(1,nsettle),2*pi*fdel*t(1:(npts-nsettle))];

    disp(‘ ’) % insertblank line

    % end of script file pllpre.m

    % File: pll2sin.m

    w2b=0; w2c=0; s5=0; phivco=0; %initialize

    twopi=2*pi; % define 2*pi

    twofs=2*fs; % define 2*fs

    G=2*pi*fn*(zeta+sqrt(zeta*zeta-lambda)); % set loop gain

    a=2*pi*fn/(zeta+sqrt(zeta*zeta-lambda)); % set filter parameter

    a1=a*(1-lambda); a2 = a*lambda; % define constants

    phierror = zeros(1,npts); % initialize vector

    fvco=zeros(1,npts); % initialize vector

    % beginning of simulation loop

    for i=1:npts

    s1=phin(i) - phivco; % phase error

    s2=sin(s1); % sinusoidal phase detector

    s3=G*s2;

    s4=a1*s3;

    s4a=s4-a2*s5; % loop filter integrator input

    w1b=s4a+w2b; % filter integrator (step 1)

    w2b=s4a+w1b; % filter integrator (step 2)

    s5=w1b/twofs; % generate fiter output

    s6=s3+s5; % VCO integrator input

    w1c=s6+w2c; % VCO integrator (step 1)

    w2c=s6+w1c; % VCO integrator (step 2)

    phivco=w1c/twofs; % generate VCO output

    phierror(i)=s1; % build phase error vector

    fvco(i)=s6/twopi; % build VCO input vector

    end

    % end of simulation loop

    freqerror=fin-fvco; % build frequency error vector

    % End of script file.

    function [] = pplane(x,y,nsettle)

    % Plots the phase plane with phase in the range (-pi,pi)

    ln = length(x);

    maxfreq = max(y);

    minfreq = min(y);

    close % Old figure discarded

    axis([-1 1 1.1*minfreq 1.1*maxfreq]); % Establish scale

    hold on % Collect info for new fig

    j = nsettle; while j 《 ln

    i = 1;

    while x(j) 《 pi & j 《 ln

    a(i) = x(j)/pi;

    b(i) = y(j);

    j = j+1;

    i = i+1;

    end

    plot(a,b,‘k’)

    a = [];

    b = [];

    x = x - 2*pi;

    end hold off title(‘Phase-Plane Plot’)

    xlabel(‘Phase Error / Pi’)

    ylabel(‘Frequency Error in Hertz’)

    grid % End of script file.

    % File: ppplot.m

    % ppplot.m is the script file for plotting phase plane plots. If the

    % phase plane is constrained to (-pi,pi) ppplot.m calls pplane.m.

    kz = 0;

    仿真过程及结果

    5434c7e2d2d328a391c2c8577fc9f1f2.png

    上图是利用MATLAB提供的函数将计算结果图形化功能建立的。在运行程序后,就会出现上面的对话框,点击点击其中的任何一项就会出现相应的仿真图形。上图中包含了输入频率和VCO频率,输入相位和VCO相位,频率误差,相位误差,相位空间波特图,相位空间和时域,退出程序等选项。运行程序后出现如下指令:

    Accept the tentative values: the first loop frequency is 5 第一循环频率

    Enter y for yes or n for no 》 y

    Enter the loop gain 》40 输入环路增益为

    40 Enter the sampling frequency in Hertz 》 1200 输入采样频率

    Enter tstop, the simulation runtime 》 5 仿真时间为5秒

    设置好参数后运行程序,由上我们可知环路增益为40,仿真时间为5s,采样频率为1200Hz。接着点击上图锁相环处理框中的菜单,就能得到如下仿真图像。其中我们主要观察输入相位和VCO相位。

    8932bbf5794f9b946d8b6408c5520e68.png

    图4.2中蓝线为输入相位,绿线代表VCO相位,从图中可以看见随着时间的变化输入信号相位为线性,而VCO相位则是经历了一段曲线后斜率与输入信号相位斜率相同,输出相位跟随输入相位,达到稳定。图4.3中VCO的相位也是先经历了一段时间的曲线后变为一条直线达到稳定。根据锁相环的基本原理我们可知锁相环是个反馈网络,它是由输出信号(VCO产生)与参考频率在频率和相位上保持同步或者保持常数。由此我们可以看出锁相环工作后,在最初的一段时间中锁相环开始工作,输入信号经过鉴相器,环路虑波器后,将输出相位反馈给VCO压控振荡器,使压控振荡器与输入频率逐步实现同步,保持一个常数,实现锁定。其中经历了锁相环的失锁、跟踪、捕获、锁定,从而达到最后达到稳定状态。从开始到达到稳定的这段时间则为做捕获时间。

    f81fc0b79e60cd5a1050134aa308b6ab.png

    图4..4与图4.5也显示了锁相环工作后从失锁、跟踪、捕获、锁定的过程,过程。从不停的摆动到最后的直线状态,这个过程称为锁定过程。其中我们可以发现在捕捉过程中随着捕捉次数的增加,捕捉过程也变得较慢,这说明此时的的锁相环工作平率处在稳定工作的动态界限内,工作正常。

    展开全文
  • matlab程序描述了二阶锁相环对不同动态条件(相位阶跃,频率阶跃和频率斜升)的适应情况,以及特征频率ω,阻尼震荡因子ζ对暂态响应的影响
  • SOGI锁相环MATLAB仿真,绝对能用。其他没什么说的,懂得自然懂。
  • 二阶锁相环仿真论文

    2008-01-09 23:58:09
    二阶锁相环仿真课程设计报告完整文档
  • PLL 锁相环 仿真 C代码实现,经过验证的锁相环仿真与C语言实现,对电力电子初学者非常有用,希望对您有帮助。 PLL 锁相环 仿真 C代码实现,经过验证的锁相环仿真与C语言实现,对电力电子初学者非常有用,希望对您有...
  • 在线实验:在matlab的simulink板块做数字锁相环设计。
  • 二阶数字锁相环仿真(内附MATLAB代码)

    万次阅读 多人点赞 2019-11-08 20:35:02
    近日由于课程作业的缘故,粗读了杜勇老师著作《锁相环技术原理及FPGA实现》,实属收获满满,由于本科学习高频电子线路时的遗漏,导致本人对所学通信工程专业有所遗憾,不料恰逢合适的时间遇到厉害的老师以及同学,...

    近日由于课程作业的缘故,粗读了杜勇老师著作《锁相环技术原理及FPGA实现》,实属收获满满,由于本科学习高频电子线路时的遗漏,导致本人对所学通信工程专业有所遗憾,不料恰逢合适的时间遇到厉害的老师以及同学,有幸将此知识补缺完整,在驶向新航道的当儿多添一份自信。再者,网络上关于此块内容繁杂,且鲜有合适的代码,感觉当今也少有人能专心研读一些书本类的参考资料,故在此以ppt形式与大家研讨,鉴于本人水平有限,如有不妥恳请赐教。                   

                                                                                                                      ——2019年11月晚于南大潘忠来楼


    % =========================================================================
    % 环路增益:K = Kd * K0 * Klpf
    % Kd = 1/2 * Ui * U0,鉴相器增益,Ui:输入信号幅值,U0:LLP输出幅值
    % K0 = fs/2^Bnco,VCO增益(Hz/V)
    % Klpf:低通滤波器增益
    % =========================================================================
    %% --- 参数初始化 
    fs = 10e3;      % 采样频率10KHz
    fo = 400;       % LLP固有频率400Hz
    df = 35;         % 初始频差Hz
    fi = fo + df;   % 信号频率
    Bnco = 32;              % 频率累加字位数32Bits
    K0 = fs/2^Bnco;         % NCO增益(Hz/V),(频率控制灵敏度)
    
    c1 = 2^(-1);     % 环路滤波器系数,在FPGA中为移位运算
    c2 = 2^(-9);
    
    lfout(1) = 0;    % 环路滤波器输出
    temp  = 0;       % 环路滤波器中间变量
     
    LLP_Phase_Index = 0;
    PFout = 0;
    LLP_Phase_init = fo * 2^Bnco / fs;  %初始VCO频率控制字
    
    %% --- 产生400Hz正弦波信号
    L = 10000;  % 数据长度
    N = 8;      % 量化位数
    st = 0:1/fs:(L-1)/fs;
    si = sin(2*pi*fi*st + pi/4);   % 生成Sin正弦信号
    f_si = si/max(abs(si));        % 归一化处理
    Q_si = round(f_si * (2^(N-1)-1)); % 量化处理,round取四舍五入
    % figure;
    % plot(st(1:1000),Q_si(1:1000));
    
    %% --- FIR低通滤波器设计
    Blpf = 8;                   % 滤波器系数量化
    fc  = [300 600];            % 过渡带
    band_amplitude = [1 0];     % 窗函数幅度
    dev = [0.05 0.05];          % 带内纹波
    
    [n,Wn,beta,ftype] = kaiserord(fc,band_amplitude,dev,fs);           % 获取kaiser参数,返回滤波器阶数n,标准化频带边缘 Wn,形状因子beta
    h_kaiser = fir1(n,Wn,ftype,kaiser(n+1,beta));           % 获取滤波器系数
    qh = round(h_kaiser/max(abs(h_kaiser))*(2^(Blpf-1)-1)); % 滤波器系数量化
    qh_max = max(abs(qh));
    
    Klpf   = qh_max / max(h_kaiser);   %计算滤波器增益
    % sum_qh = sum(abs(qh));
    % figure;
    % freqz(h_kaiser,1);  %低通滤波器响应
    % title('LPF滤波器响应');
    
    K = 1/2 * 2^7 * 2^7 * K0 * Klpf;    %环路增益
    
    %乘法运算输出信号初值
    mult = zeros(1,L);
    %鉴相器输出信号初值
    pd = zeros(1,L);
    lfout(n) = 0; 
    lfout(n+1) = 0;
    pd(n)=0;
    
    f=zeros(1,L);
    
    % wn = sqrt(K/t1);
    %% --- DDS查找表
    SinTableLength = 2^10;   % DDS的sin表的长度1024
    SinTableAmp    = 2^7-1;  % DDS的sin表的最大幅度,为8位有符号量化
    t = 2*pi*(0:SinTableLength - 1)/SinTableLength;
    sin_table = floor(sin(t) * SinTableAmp);
    cos_table = floor(cos(t) * SinTableAmp);
    %DDS相位累加字为32位,而实际存储表为1024个,需要比列缩减
    sin_table_Index_Scale = SinTableLength / (2^Bnco);
    
    %% --- 鉴相过程
    for i=(1+n):L
    
         DDS_Phase_Index_Table = floor(LLP_Phase_Index * sin_table_Index_Scale) + 1;
         sin_nco(i) = sin_table(DDS_Phase_Index_Table);  %产生本地参考信号的I之路
         cos_nco(i) = cos_table(DDS_Phase_Index_Table);  %产生本地参考信号的Q之路
         
         mult(i) = Q_si(i)*cos_nco(i);   % PD乘法器
         %滤除相乘产生的高频分量
         PFout = filter(qh,1,mult(i-n:i)); %理解滤波器的工作原理,防止错误使用
         len = length(PFout);
         %鉴相器输出
         pd(i) = PFout(len);        
         
         % 计算时频
         y=fft(cos_nco(i-n:i),L);
         [m,p]=max(abs(y));
         f(i)=p*fs/L;
         
         %环路滤波器,(根据环路滤波器传递函数)
         lfout(i) = lfout(i-1) + c1*pd(i) + (c2-c1)*pd(i-1);
         lfout1 = temp + c1*pd(i);
         temp  = temp + c2*pd(i);
        % 查表法索引
        LLP_Phase_Index = LLP_Phase_Index +LLP_Phase_init + lfout1;  % 环路NCO累积,产生本地参考信号
        
        if(LLP_Phase_Index < 0)
            LLP_Phase_Index = 0;
        end
        if(LLP_Phase_Index >= 2^Bnco)
            LLP_Phase_Index = LLP_Phase_Index - 2^Bnco;
        end
    end
    %% --- 显示
    % figure;
    % y2=fft(sin_nco);
    % p2=angle(y2);
    % phase=p2*180/pi;
    % plot(phase(1:5000));
    % figure;
    % plot(lfout*pi/fs/180);
    
    figure;
    plot(pd/fs/SinTableAmp,'b');
    title('鉴相器输出(时间-相位差示意图)');
    xlabel('时间(t/s)');ylabel('相位差(rad)');
    xticklabels([0:1/10:1]);
    
    figure;
    hold on;
    plot(sin_nco(1:8000)/SinTableAmp,'-k');   % 输出波形
    hold on;
    plot(Q_si(1:8000)/SinTableAmp,'-g');      % 原始输入信号波形
    legend('输出波形', '原始波形')
    title('原始信号跟DDS输出波形对比');
    xlabel('时间(t/s)');
    xticklabels([0:1/10:1]);
    
    
    x=zeros(1,L);
    z=fft(Q_si,L);
    [a,b]=max(abs(z));
    x(1:L)=b*fs/L;
    
    figure;
    hold on;
    plot(f(1:5000),'-r');
    hold on;
    plot(x(1:5000),'-b');
    title('时域-频域示意图');
    legend('输出频率', '参考频率')
    xlabel('时间(t/s)');ylabel('频率(f/Hz)');
    xticklabels([0:1/10:1]);
    
    figure;
    phin = 2*pi*fi*st + pi/4;
    
    pvco=phin-pd/fs;
    t1 = 1:1:10000;
    plot(t1,phin/SinTableAmp,t1,pvco/SinTableAmp)
    title('输出相位与参考相位')
    legend('参考相位', '输出相位')
    xlabel('时间(t/s)');ylabel('相位(rad)');
    xticklabels([0:1/10:1]);
    
    

    运行结果见ppt

     

    需要原始资料可以关注我的个人公众号,里面有我的联系方式~

     

     

    展开全文
  • 设计飞一种试阴斗“ 海盔” 机道别亏翼推令系 兔月的简单自勺数字式二价硕相坏。
  • 写在前面的话:本篇文章参考自杜勇工程师的《锁相环技术原理及FPGA实现》 二阶环的FPGA实现 \quad\quad在前一篇文章中分析了的心脏——环路滤波器,这篇文章讨论的是二阶环的FPGA实现。 一.依据模拟环设计数字环 \...
  • 该文在已有的EBPSK传输系统基础上,详细讨论了EBPSK信号采用二阶锁相环解调时鉴相器的输出信号结构。首先通过建立锁相环的线性化模型,对比分析了不同阻尼系数的相位阶跃误差响应和矩形相位误差响应,推导了理想状态...
  • 分析和总结了二阶锁相环设计中选择环路参数的思路。对于采用无 源比例积分滤波器的二阶锁相环的稳定性提出了新的分析方法
  • 追踪电网相位,适用于单相电网锁相,经过了DSP+HIL半实物平台进行验证。包含两个include.h文件 和两个c文件。只需要直接调用c函数就可以获得电网相位角。
  • 上述是一些基本原理,下面介绍锁相环到底是怎么工作的: 二阶锁频环辅助三阶锁相环设计: 输入信号:首先是发送机那边数据仿真,这个与我的上一篇博客一致,都是BPSK调制信号,我们接收机也是接收到的这个信号。...
  • 二阶广义积分锁相环 SOGI-PLL

    千次阅读 2021-07-28 15:33:27
    本文主要是说三相的锁相环,首先介绍基本锁相环,然后引出二阶广义积分的锁相环,并对其在Simulink仿真介绍。 锁相环的基本 通常情况下,锁相环路是一个可以实现相位自动跟踪的电路,输入信号和输出信号的幅值大小...
  • 本实用新型涉及一种双二阶积分器锁相环。背景技术:伴随大功率电力电子产品广泛应用于工业生产,其产生的电力谐波严重危害着电力系统的安全稳定运行和其他工业生产。因此,消除公共电网中的电力谐波就成为谐波治理...
  • 二阶广义积分锁相环算法参考代码。适用电网工频相位同步,适用单相电锁相,包含.lib .c .h文件。可用于dsp,也可用于stm32。
  • 一份锁相环实现的载波同步的2阶环的MATLAB仿真代码,是保存在WORD上的
  • 二阶广义积分器的本质也是为了产生一组正交信号,频率为的输出信号反馈到二阶广义积分器,产生一组正交信号。此种方法的基础理论是自适应陷波器(AF),因为AF结构较复杂,...(2)基于二阶广义积分锁相环SOGI_PLL;
  • 第4章:载波同步与锁相环仿真(1)

    千次阅读 多人点赞 2021-02-10 17:07:55
    第4章(1)内容如下一、二阶锁相环的MATLAB代码实现二、锁相环经典书籍与材料三、各参数对二阶数字锁相环的性能影响四、总结 一、二阶锁相环的MATLAB代码实现 本科在学习通信原理的课程时,提到2PSK的相干解调,接收...
  • 文章介绍了一种二阶数字锁相环的基本原理和其基于FPGA的实现方案,详细阐述了鉴相器、环路滤波器和数控振荡器等环路部件的参数设计及电路结构,并引入一种有效的环路状态检测方法,仿真验证了设计的正确性和有效性。
  • 锁相环verilog代码

    2009-12-23 15:22:41
    实现了一个二阶锁相环,性能通过了调试,可以实现相位和频率的跟踪
  • 基于Matlab的二阶取样锁相环非线性分析.pdf
  • 一阶锁相环的FPGA实现(基于quartus+matlab) \quad前言:本篇文章参考了杜勇的《锁相环技术原理及FPGA实现》,这本书上是以quartus ii 为工具实现的,由于我之前一直使用的是Xilinx的产品,所以就计划将其移植到...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 341
精华内容 136
关键字:

二阶锁相环