본문 바로가기

통신이론

위상동기루프 PLL(Phase Lock Loop) 모델링 및 시현

새해가 밝았습니다. 여러분들 올해도 모두 새해 복 많이 받으세요~!!!

이번부터는 본격적으로 공부를 하면서 블로그를 작성하다보니, 시간이 좀 더 걸리는 것 같아요.

몇몇 블로그는 기초부터 정말 친절하게 잘 설명되어 있던데, 부럽기도 하지만, 저는 저만에 core요약과 쉽게읽기, 실용성, 기억상기용 으로 차별성을 두고 쭈욱 가 보려고 합니다!

연초라 그런지 방문객도 뜸하고,,, ㅠ,ㅜ

포스팅이 다소 힘에 부치는 느낌이 가끔 들긴하지만, 

올해는 블로그를 잘 가꾸고 다작하고 싶은 욕심이 많이 생깁니다. 많은 얘기를 퍼붇고 싶어요.ㅋㅋ

 

이번 시간에 핵심은 PLL의 이론적인 부분을 파이썬 코드로 구현하고 시현해 봄으로써 검증을 하는 것입니다.

이리저리 다양하게 변형해 보고 시뮬레이션을 관찰함으로써 응용력을 키울 수 있으면 좋겠네요.

 


앞에서 살펴보았듯이 DSB 변조는 수신기에서 송신 신호를 복원하기 위해 반드시 반송파 복원이라는 과정을 거칩니다.

그런데 동일한 특성(주파수와 위상 특성이 같은 발진기 사용)을 송신 측과 수신 측에 각각 사용하더라도 약간의 위상차가 발생합니다. 또한 송신 측에서 보낸 신호가 수신 측에 도착하면 시간 지연이 발생하므로 수신기의 국부 발진기(Local oscillator)도 시간 지연을 정확히 예측하여 반송파를 발생키겨야하는데, 이는 수신기에서 해결해야 할 매우 어려운 문제입니다.

이렇게 수신된 반송파 cos(wct + θ)를 정확히 재생하는 기술이 바로 위상동기루프 PLL(phase locked loop) 입니다.

PLL은 기본적으로 위상검파기, 루프필터, 전압제어발진기로 구성되어 있습니다.

이번 PLL의 목적은 입력 신호에 존재하는 주파수 wi, 위상 θi와 동일한 정현파 신호 vo(t)를 발생시키는 것입니다.

PLL의 구조와 각 부분의 특징

 

① 위상검파기(phase detector) : 입력신호와 VCO 출력신호 사이의 순간적인 위상 차이를 찾는 회로

ve(t) = vi(t)·vo(t) = A sin(wit + θi) · B cos(wot + θo) = AB/2[sin(wit - wot + θi - θo) + sin(wit + wot + θi + θo)]

먼저 곱셈기에서 입력과 출력 신호를 곱하여 나온 ve(t)를 구하고,

 

② 루프필터(loop filter) : 입력신호의 이득을 조절하고, 적분 역할을 하는 LPF

그리고 LPF의 기능을 갖는 루프필터를 통과시키면 2wc 주파수 성분이 제거되므로

vd(t) = AB/2 sin(θi - θo) ≒ K·θe

-π/2< θe < π/2 구간에서는 vd(루프필터 출력)은 위상의 오차를 비례적으로 나타냅니다. 그러나 그 외의 구간에서는 위상오차에 비례하는 출력이 아니지만 오차의 극성을 알려주므로 동작에 문제가 없으며, vd(t)를 VCO에 입력하면 시간이 흐르면서 위상 비교기의 직류 전압 성분(ve)이 서서히 0에 근접합니다.

 

③ 전압제어발진기(VCO, voltage controlled oscillator) : 입력 전압에 따라 출력 주파수를 바꾸는 장치

vo(t) = B sin(wot + kv∫-∞t vd(τ) dτ) = B sin(wot + θot)

입력 신호(vi)의 위상이 VCO 출력(vo)보다 빠른 경우, vd는 양의 값이 되고 결국 wo = wc + kv·vd 를 높이게 됩니다.

 

또한 이와 별개로 선형화된 소신호 PLL 모델을 라플라스 변환하여 전달함수(Transfer function)로 나타내면,

Hθ(s) = θ'(s)/ θ(s) = LF(s) / (s + LF(s)  = (kp·s + kp/Ti) / (s2 + kp·s + kp/Ti)   

여기서 LF(s) = kpd · [kp·(1+1/(Ti·s))] · kvco/s 이고, kpd = kvco = 1 두자!

한편, 위 전달함수 분모는 2차 시스템 감쇠비(damping ratio ξ)-고유진동수(undamped natural frequency ωn) 모델의 아래 특성방정식으로 볼 수 있으므로

s2 + 2ξωn · s + ωn2 = 0

특성방정식의 해(극점, poles) s = -ξωn ± ωn √(ξ2-1) 이므로

임의로 ξ = 0.5, settling time(τ=ξωn) 을 샘플타임(Ts)에 18배 정도로 정하여, kp = 2ξωn , kp/Ti = ωn2 를 구할 수 있다.

 

그럼 이제 PLL이 원 입력신호의 주파수와 위상을 변화시켜 얼마나 잘 추적하여 동기화(synchronization)시키는 지 동작시켜보고, 모델링한 전달함수의 연속 시간/주파수 응답과 함께 비교해 보자!

 

반송파 위상 동기
반송파 복원
아날로그 루프필터의 주파수 응답

 

그럼 소스코드를 살펴볼게요.

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

N = 500
fs = 50
T = 1/fs
fc = 5

vi = np.zeros(N)
vo = np.zeros(N)
v2 = np.zeros(N)
ve = np.zeros(N)
vd = np.zeros(N+1)
pho = np.zeros(N+1)
t = np.arange(N)*T
phi = np.pi/4 + 0.05*np.sin(1*np.pi*t)

for i in range(N):
    vi[i] = np.sin(2*np.pi*fc*t[i] + phi[i])
    vo[i] = np.cos(2*np.pi*fc*t[i] + pho[i])
    v2[i] = np.sin(2*np.pi*fc*t[i] + pho[i])
    ve[i] = vi[i]*vo[i]

    k1, k2 = 3.8, 0.9
    vd[i+1] = k2*vd[i] + (k1*ve[i])*T   # Loop filter output
    pho[i+1] = pho[i] + vd[i+1]   # VCO phase
    
    while pho[i+1] > np.pi : pho[i+1] -= 2*np.pi
    while pho[i+1] < -np.pi : pho[i+1] += 2*np.pi

f1, ax1 = plt.subplots()
plt.plot(t, phi, label='Phase of input signal')
plt.plot(t, pho[:-1], ':', label='Phase of VCO output')
plt.xlim([0, 4])
ax1.set_xlabel("Time[s]")
ax1.set_ylabel("Phase[rad]")

f2, ax2 = plt.subplots()
plt.plot(t, vi, label='Input signal')
plt.plot(t, v2, label='Carrier recovered signal')
plt.xlim([0, 1])
ax2.set_xlabel("Time[s]")
ax2.set_ylabel("Voltage[v]")
ax2.legend()

#------------------------------------------

zeta = 0.5
tau = 18*T   # settling time
omega_n = 1/(zeta*tau)
Kp = 2*zeta*omega_n
Ti = Kp/omega_n**2
num = [0, 2*zeta*omega_n, omega_n**2]
den = [1, 2*zeta*omega_n, omega_n**2]
tout, y_out, _ = signal.lsim((num, den), U=phi, T=t)
wz, hz = signal.freqs(num, den)

ax1.plot(tout, y_out, ':', label='output of a continuous-time linear tf')
ax1.legend()

f3, ax3 = plt.subplots()
plt.semilogx(wz*fs/(2*np.pi), 20*np.log10(np.abs(hz)))
plt.xlabel('Frequency')
plt.ylabel('Amplitude response [dB]')
plt.grid(True)

plt.show(block=False)

 

위 코드를 변형해 전달함수의 램프 위상입력을 주어 시간응답을 보면, 굉장히 잘 추적하는 반면,

에러값과 적분기를 이용한 PI제어는 추적을 잘 못하고 한계가 있다. 만약 전달함수를 LF(s)와 VCO를 쌍선형변환(bilinear transformation)에 의해 이산화한 후 차분방정식으로 구하면 좀 더 잘 추적될 것으로 예상 됩니다.

어쨌든 위상의 차이는 주파수의 차이로 볼 수 있기 때문에 PLL은 위상 뿐만아니라 주파수 복원도 가능하다는 것을 잊지 맙시다!!!

 

마지막으로 수신신호에서 반송파 복원 방법에 대해서 알아보겠습니다.

DSB-SC 변조되어 전송되고 수신한 신호에는 반송파 신호가 명확히 보이지 않습니다. x(t)가 항상 양 또는 음의 값이라면 진폭은 바뀌지만 주파수가 유지되는 정현파를 얻을 수 있기때문에 ①제곱기를 이용한 반송파 복원을 할 수 있습니다.

그러나 아날로그 회로로 정확한 제곱기를 구현하기 어렵기때문에 ②PLL 코스타스 루프(costas loop)를 이용한 반송파 복원이 개발되었습니다.

 

이번에도 뭔가 고생은 한 것 같은데,,, 많이 아쉽기도 하네요. 휴~ 어쨌든 끝!

 

<참고한  자료>

1. 원리로 이해하는 통신이론(한빛아카데미, 저자: 한동석)

2. [DSP] PLL(Phase Locked Loop), 모델링 및 방정식 (tistory.com)

3. [DSP] PLL(Phase Locked Loop), 선형·비선형 모델 비교, 위상각 점프와 주파수 변화 (tistory.com)

4. Closed-loop transfer function - Wikipedia

5. [제어공학/제어이론] 5. 라플라스 변환의 주.. : 네이버블로그 (naver.com)

6. [제어공학/제어이론] 7. 제어 시스템의 시간.. : 네이버블로그 (naver.com)