数字锁相环的matlab仿真

1.简介与仿真结论

 

2.理论分析

      全数字锁相环路的工作原理:环路的输入信号通常为时间上连续的信号,如单频正弦波、模拟调频信号或移频键控信号等。环路的输出信号,即数字控制振荡器的输出信号为周期性脉冲序列,其周期可调且受数字滤波器输出信号的控制。输入信号和数控振荡器的输出信号加到抽样相位检测器的输入端。在检测器中,由数控振荡器的输出脉冲序列对输入信号抽样,检测出脉冲序列与输入信号之间的相位差,并变换成数字信号作为检测器的输出信号。该信号经数字滤波器滤波后作为数控振荡器的控制信号,改变数控振荡器的周期,实现对相差的校正。

与模拟锁相环路比较,全数字锁相环路有如下特点:

(1)全部采用数字电路。由于数字电路中的有源器件工作于导通和截止两种工作状态,受干扰的影响比模拟电路小,使工作的可靠性提高。另外,数字电路易于集成化。

(2)在数字锁相环路中,时钟源通常不直接受控,不同于模拟锁相环路中的压控振荡器直接受误差信号的控制,这将有利于提高环路的性能。应用数字锁相环路,在一定范围内可以消除类似于模拟锁相环路中压控振荡器特性的非线性、环路滤波器传输函数的不稳定等的影响,从而改善锁相环路的性能。全数字锁相环已成为全数字相干通信、跟踪接收机和频率综合器中的核心部件,日益获得更广泛的应用。

3.部分核心代码

% PLL illustration
clear all;
close all;
% define initial phase offset and incoming Cw frequency and Sampling frequency
theta = pi/3;
f=1000;
fs=100000;
% Create the real and imaginary parts of a Cw non-modulated Carrier to be tracked.
k=1:1:1000;
delf=f/20;
Signal=exp(j*(2*pi*k*(f+delf)/fs+theta))+0.01*(rand(1,1000)+j*rand(1,1000));
% initilize PLL Loop
phi_hat(1)=30;
e(1)=0;
phd_output(1)=0;
nco(1)=0
% define Loop filter parameters
kp=0.15; % Proportional constant
ki=0.1; % Integrator constant
% PLL implementation
for n=2:length(Signal)
nco(n)=conj(exp(j*(2*pi*n*f/fs+phi_hat(n-1)))); % Compute nCO
phd_output(n)=imag(Signal(n)*nco(n)); % Complex multiply nCO x input
e(n)=e(n-1)+(kp+ki)*phd_output(n)-ki*phd_output(n-1); % Filter integrator
some(n)=(kp+ki)*phd_output(n)-ki*phd_output(n-1);
phi_hat(n)=phi_hat(n-1)+e(n); % update nCO
end;
% plot waveforms
index_stop=200;
figure;
plot(1:index_stop, phd_output(1:index_stop)),ylabel('Ph. Det.');
figure;
plot(1:index_stop, phi_hat(1:index_stop)*180/pi,'m'),ylabel('Est. Phs.');
index_stop=1000;
% subplot(211)
figure;
plot(1:index_stop, real(nco(1:index_stop)),1:index_stop,real(Signal(1:index_stop))),ylabel('Re-PLL');
% subplot(212)
figure;
plot(1:index_stop, imag(nco(1:index_stop)),1:index_stop,imag(Signal(1:index_stop))),ylabel('Im-PLL');
figure;
plot(1:index_stop,some(1:index_stop));
figure;
plot(1:index_stop,e(1:index_stop));

A01-15

数字锁相环Matlab仿真代码如下: ```matlab %% Parameters fs = 1e6; % Sampling frequency fc = 10e3; % Carrier frequency fd = 500; % Input frequency N = 10000; % Number of samples f_out = zeros(1, N); % Output frequency phase_out = zeros(1, N); % Output phase error_out = zeros(1, N); % Phase error loop_filter_out = zeros(1, N); % Loop filter output %% Loop filter parameters Kp = 1; Ki = 1; Kd = 1; Tf = 1/(2*pi*fc); Nf = Tf*fs; %% Loop variables phase = 0; freq = fc; K1 = Kp+Ki/Nf+Kd*Nf; K2 = -Kp-2*Kd*Nf; K3 = Kd*Nf; integ = 0; prev_err = 0; %% Loop for n = 1:N % Generate input signal x = cos(2*pi*fc*(n-1)/fs+pi/3)+cos(2*pi*fd*(n-1)/fs); % Multiply by local oscillator y = x.*cos(2*pi*fc*(n-1)/fs+phase); % Lowpass filter ylp = lowpass(y, fd, fs); % Hilbert transform yht = hilbert(ylp); % Phase detector err = angle(yht); % Loop filter integ = integ+Ki/Nf*err+Kd*Nf*(err-prev_err); loop_filter_out(n) = Kp*err+integ; % Voltage controlled oscillator freq = fc+loop_filter_out(n); phase = phase+2*pi*freq/fs; % Output frequency f_out(n) = freq; % Output phase phase_out(n) = phase; % Output phase error error_out(n) = err; % Save previous error prev_err = err; end %% Plot results t = (0:N-1)/fs; figure; subplot(4,1,1); plot(t, f_out/1e3); xlabel('Time (s)'); ylabel('Frequency (kHz)'); title('Output frequency'); subplot(4,1,2); plot(t, phase_out); xlabel('Time (s)'); ylabel('Phase (rad)'); title('Output phase'); subplot(4,1,3); plot(t, error_out); xlabel('Time (s)'); ylabel('Error (rad)'); title('Phase error'); subplot(4,1,4); plot(t, loop_filter_out); xlabel('Time (s)'); ylabel('Output (V)'); title('Loop filter output'); ``` 注意,此代码仅用于演示数字锁相环的工作原理和效果。实际应用中,需要根据具体的系统要求进行参数调整和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值