신호를 무선으로 전송하면 이동 시간으로 인해 임의의 위상 편이가 발생하여 수신기에서 (송신기와 같은) 정확한 시점에서 샘플링할 가능성이 낮게 되고 이는 곧 에러가 발생가능성이 높아집니다. 따라서 시간 이동을 통해 디지털 심볼의 정점을 추적하여 샘플링을할 수 있어야하는데, 여기서는 이처럼 시간 동기화를 구현한 Mueller & Muller 클럭 복구 기술을 소개하겠습니다.
먼저 수학적으로 엄밀하게 이해할 수 있다면야 최선이겠지만, 그렇기하기는 너무 힘든 증명과정이었고, 대신 나 나름의 한가지 방안으로써 직관에 기대어 꼼수를 이용해 이해할 수 있도록 설명해 보려 해요!
Mueller & Muller timing-recovery scheme
h0 , h1 , h2 은 오름차순 연속 샘플값 이고, 이에 대응하는 h0 , h1 , h2 은 오름차순 연속 심볼값 이라고 하면,
( h1* h0 ) > ( h0* h1 ) : sampling early
( h1*h0 ) = ( h0* h1 ) : Correct sampling
( h1*h0 ) < ( h0* h1 ) : sampling late
따라서 mu = ( h1*h0 ) - ( h0* h1 ) + ( h2* h1 ) - ( h1* h2 ) 두면, mu = y - x 이다.
여기서 x = -( h2 - h0 ) * h1 , y = ( h2 - h0 ) * h1
샘플값, 심볼값이 복소수이므로 순수 실수(cos) 일때와 허수(sin)일 때 계산을 나누어서 생각해 보면,
conjugation 하고 mu = real(y - x) 하면 맞을 것이다!
그럼 이제,,, 파이썬으로 이를 구현한 소스코드와 결과를 보시죠!
순수 시간동화에 집중하기 위해 delay와 fo는 제외했습니다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import correlate, resample_poly
from scipy.special import erfc
# this part came from pulse shaping exercise
num_symbols =1000
sps =8
bits = np.random.randint(0, 2, num_symbols) # Our data to be transmitted, 1's and 0's
pulse_train = np.array([])
for bit in bits:
pulse = np.zeros(sps)
pulse[0] = bit*2-1# set the first value to either a 1 or -1
pulse_train = np.concatenate((pulse_train, pulse)) # add the 8 samples to the samples
# Create our raised-cosine filter
num_taps =101
beta =0.35
Ts = sps # symbol time, Assume sample rate is 1 Hz, so sample period is 1, so *symbol* period is 8
t = np.arange(-num_taps//2+1, num_taps//2+1) # remember it's not inclusive of final number
h = np.sinc(t/Ts) * np.cos(np.pi*beta*t/Ts) / (1- (2*beta*t/Ts)**2)
rh = np.sqrt(1) * h/np.sqrt(sum(h**2))
samples = np.convolve(pulse_train, rh)
s = samples[:sps*100]
p = np.arange(num_taps//2, num_symbols*sps + num_taps//2, sps)
이제 대망에 주파수동기화 차례입니다. (소스코드는 원문과 함께, 앞서 제 PLL 포스트를 참고해 주시기 바랍니다.)
참 신통방통하게도 Costas Loop를 이용하여 나머지 미세주파수도 동기화 ( -25Hz 에 수렴 ) 되는 것을 약 400 샘플타임부터 확인할 수 있습니다. Q신호들도 0에 수렴하고요.
Costas Loop
그럼 최종적으로 성상도를 통해서 원신호를 어떻게 프로세싱해서 얻는 지 확인해 볼까요?
Synchronization
무선채널에서 더럽혀진(?) 비트신호를 동기화 수행해서 수신기에서 명확히 복원할 수 있겠네요! 대박!!!
③ 프레임 동기화
대부분의 통신 프로토콜은 패킷/프레임을 대부분 사용합니다. 수신기에서 우리는 새 프레임이 언제 시작하는지 식별할 수 있어야 하는데, prefix에는 수신기가 프레임의 시작을 감지하는데 사용하는 동기화 시퀀스가 포함되어 있으며 수신자가 미리 알고 있는 시퀀스입니다. 간단히 정합필터 출력과 비슷하게 아래처럼 구할 수 있습니다.
import numpy as np
import matplotlib.pyplot as plt
x = [1,1,1,-1,-1,-1,1,-1,-1,1,-1]
plt.plot(np.correlate(x,x,'same'),'.-')
plt.grid()
plt.show()
끝까지 들어주셔서 감사합니다!
이제 어느정도 통신주제에 대해서 기본적인 분야는 포스팅해 본 것 같아요. 맘에는 썩 안들지만,,, ㅎㅎㅎ