PLL matlab实现

关于PLL的具体原理详见这里,在这着重介绍如何编程实现.

clear;
clc;

%相关参数设定
fs=7e5;	%采样率
N=1e3;	%序列点数
f1=7e3;	%输入信号频率
fvco=8e3;	%vco自由震荡频率(无输入时输出)
pvco=4e3;   %电压频率转化系数 V/Hz
fc=3e3;	%bpf截至频率
filter_coefficient_num=100;	%bpf系数个数
bpf = fir1(filter_coefficient_num,fc/(fs/2)); 	%bpf设计
%设置输入波形
Ts=1/fs;
t=0:Ts:(N-1)*Ts;
y=sin(2*pi*f1*t);
%初始化输出
VCO=zeros(1,N);
Phi=zeros(1,N);
error=zeros(1,N);

for n=2:N
    now_t=n*Ts;
    %实现乘法器
    error_mult(n)=y(n)*VCO(n-1);
    %实现loop filter
    for m=1:length(bpf)
        if n-m+1>=1
           error_array(m)=error_mult(n-m+1);
        else
           error_array(m)=0;
        end
    end
    error(n)=sum(error_array.*(bpf));
    %实现vco
    Phi(n)=Phi(n-1)+2*pi*pvco*error(n)*Ts;
    VCO(n)=sin(2*pi*fvco*now_t+Phi(n));
end
%数据可视化处理
figure
plot(t,y,t,VCO);
grid on
legend('原信号','PLL输出');
xlabel('time [s]')
title('input and output signal')

figure
plot(t,error)
xlabel('time [s]')
title('Error signal')

center_freq(VCO,fs)

在设计中遇到的问题:

  1. 采样率与检测信号频率
    在一开始,对采样率的理解只有防止抽样混叠,但在PLL中采样率的设定不仅仅由这一个因素决定.我一开始用4.8e4Hz的采样率,而检测信号的频率为7e3Hz,这看起来似乎没有什么问题,但是我们返回到时域考察一下.
    抽样间隔为2.0833e-05 s,而检测信号的周期为1.4286e-04 s,也就是说在检测信号的一个周期内,仅能得到6.8571 个样值点,相邻两点之间数字角频率间隔很大,从而影响PLL的性能,运行结果如下
    在这里插入图片描述
    为了缩短间隔,需要在一个检测信号周期内获得更多的点,这里我设定一个周期内需要100个样值点,因此 f s = 100 T 1 f_s = \frac{100}{T_1}

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
PLL是锁相环(Phase-Locked Loop)的缩写,是一种电路,可以将一个信号锁定到另一个信号的频率和相位。在现代通信系统中,PLL被广泛应用于频率合成器、时钟恢复器、解调器和调制器等电路的设计中。 在MATLAB中,可以使用Simulink建立一个全数字锁相环,并进行仿真。具体的实现代码如下: ``` clear; clc; %相关参数设定 fs = 7e5; %采样率 N = 1e3; %序列点数 f1 = 7e3; %输入信号频率 fvco = 8e3; %VCO自由震荡频率(无输入时输出) pvco = 4e3; %电压频率转化系数 V/Hz fc = 3e3; %BPF截至频率 filter_coefficient_num = 100; %BPF系数个数 bpf = fir1(filter_coefficient_num, fc/(fs/2)); %BPF设计 %设置输入波形 Ts = 1/fs; t = 0:Ts:(N-1)*Ts; y = sin(2*pi*f1*t); %初始化输出 VCO = zeros(1, N); Phi = zeros(1, N); error = zeros(1, N); for n = 2:N now_t = n * Ts; %实现乘法器 error_mult(n) = y(n) * VCO(n-1); %实现Loop Filter for m = 1:length(bpf) if n - m >= 1 error_array(m) = error_mult(n - m); else error_array(m) = 0; end end error(n) = sum(error_array .* (bpf)); %实现VCO Phi(n) = Phi(n-1) + 2*pi*pvco*error(n)*Ts; VCO(n) = sin(2*pi*fvco*now_t + Phi(n)); end %数据可视化处理 figure plot(t, y, t, VCO); grid on legend('原信号', 'PLL输出'); xlabel('time [s]') title('input and output signal') figure plot(t, error) xlabel('time [s]') title('Error signal') ``` 这段代码实现了一个基于MATLAB Simulink平台的全数字锁相环,并对其进行了仿真。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [全数字锁相环MATLAB设计与仿真](https://blog.csdn.net/qq_37934722/article/details/131266662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [PLL matlab实现](https://blog.csdn.net/white_156/article/details/103134421)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值