我正在编写数字 PLL 的 MATLAB 实现。 它需要锁定参考信号的相位和频率。所有的信号都是方波。这些是设计约束:
这是我写的代码:
Fs= 1000;
Ts=1/Fs;
n=(1:1:2000);
t=n*Ts;
% PI constants
Ki= 0.00005;
Kp= 0.2;
% input ref generation
ref = (sin(2*pi*9*t + 1)>0) ;
rec = zeros(1,length(n))-1;
%vectors initialization to 0
error_int = 0;
phi = zeros(1,length(n));
error = zeros(1,length(n));
coe= fir1(20,0.01);
%% processing
for i= 2:length(n)
% error
if(ref(i-1) == rec(i-1))
error(i) = 0;
else
error(i) = 1;
end
% error LPF filtering
if(i > length(coe))
error(i) = sum(error(i-length(coe)+1:i) .* coe);
else
error(i) = 0;
end
% integral accumulation
error_int(i) = error_int(i-1) + error(i);
if(error_int(i) > 50) error_int(i) =0; end
% update new phase value
phi(i) = phi(i-1) + 2*pi*10*Ts - Kp*error(i) + Ki*error_int(i);
% construct next sample of reconstructed signal
rec(i) = (sin(phi(i))>0);
end