Line coding
Line coding은 디지털 데이터를 디지털 신호로 바꾸는 것을 말한다.
디지털 데이터는 당연히 혼자 쓸거면 굳이 신호로 만들 이유가 없지만
다른 사람에게 보낸다고 생각하면 어쩔 수 없이 전기신호로 바꾸는 과정을 거쳐야한다.
따라서 데이터를 보내는 쪽에서는 신호로 encoding 해서 보내고
받는 쪽은 반대로 decoding 해서 다시 데이터로 복원하는 과정을 거친다.
데이터가 돌아다니는 선(Line)에 대해 encoding과 decoding 규칙을 정하는 것이기 때문에 Line Coding 이라고 한다.
자원이 그렇게 많지 않던 시절에는 신호하나 보내는데에도 많은 최적화를 거쳐야했다.
원본 데이터를 빠르게 보낼수만 있다면 얼마나 좋을까..!
극한의 효율을 추구하기 위해, 이를 측정하는 기준을 말해보려 한다.
모든 데이터는 이진수로 표시할 수 있고, 그렇기 때문에 한 비트를 하나의 정보(data element)라고 취급할 수 있다.
몇개의 데이터를 몇개의 신호로 보낼 수 있는가? 가 측정 기준이 되시겠다.
이를 하나의 값으로 표현해보면, $r = \frac{data count}{signal count}$ 이라고 할 수 있다.
이 r값은 클 수록 좋기때문에 신호 하나에 많은 데이터를 보내는 것이 극강의 효율임을 어렵지 않게 알 수 있다.
위 사진을 보면
a. 데이터 1개를 신호 1개에 대응시켜 보낸다. 따라서 $r = 1$
b. 데이터 1개를 신호 2개에 대응시켜 보낸다. 따라서 $r = \frac{1}{2}$
c. 데이터 2개를 신호 1개에 대응시켜 보낸다. 따라서 $r = 2$
d. 데이터 4개를 신호 3개에 대응시켜 보낸다. 따라서 $r = \frac{4}{3}$
4개의 예시중 승자는 c가 된다.
Data rate과 Signal rate
Data rate이란 1초에 몇개의 데이터(bit)를 보낼 수 있는가를 말한다. 단위는 bps(bits per second)이다.
Signal rate이란 1초에 몇개의 시그널을 보낼 수 있는가를 말한다. 단위는 baud이다.
결론적으로 데이터 통신의 목표는 data rate(N)을 높이고, signal rate(S)을 낮추는 것이 된다.
Data rate은 신호의 전달 속도를 높이면 올라가고, signal rate은 대역폭(bandwidth)을 낮추면 감소한다는 것을 알아두자.
이를 현실세계에 비유한다면, 적은 차선(낮은 대역폭)에서 가장 많은 사람(데이터의 수)을 이동시키는 최선의 방법을 찾는것과 같다.
교통체증이 있다면 버스가 가장 효율적일테고, 별다른 제약이 없다면 스포츠카가 가장 좋은 대안이 되겠다.
위에서 $r$을 신호 하나에 몇개의 비트를 보낼 수 있는지로 정의했었다.
최소 대역폭($S = B_{min}$)은 data rate($N$)에 대해 $S = B_{min} = \frac{N}{r}$ 임을 알아두자.
Line coding시 주의할 요소들
Line coding을 할때 주의해야하는 요소들이 있다.
1. DC Components
2. Self-synchronization
이름부터 길고 무시무시 하지만, 꾹 참고 알아보자.
DC Component
DC(Direct Current) Component는 사실 직역하면 직류 성분이다.
반대로 AC(Alternating Current) Component 즉, 교류 성분도 있다.
교류 성분은 잘 모르겠고, 직류 성분에 대해 알아보자.
데이터를 보내는데, 비트의 값이 1이면 5볼트를 0이면 0볼트를 보낸다고 해보자.
데이터는 당연히 연속적인 값이 포함되기 때문에 우리는 종종 1이 연속된 데이터를 보내거나 0이 연속된 데이터를 보낼것이다.
이렇게 연속된 전기신호를 직류라고 부르기 때문에 직류 성분이라는 말이 나온것이다.
직류 성분은 알겠는데 이게 뭘 어쨌다고?
보내는건 어렵지 않지만 받는 쪽에서 문제가 발생한다.
직류 성분은 값이 변하지 않기때문에 진동수가 0이 된다.
만약 보내는 데이터가 오디오였다면.. 아무 소리도 안들린다.
분명 1이라는 데이터를 보내고 있는데, 정작 아무 소리가 안들리는 상황이 발생한다.
따라서 이런 연속적인 데이터의 흐름을 연속적이지 않게 encoding해야만 받는쪽에서 수월하게 처리할 수 있다.
데이터를 전부 받아서 평균 진폭(amplitude)를 계산해봤는데, 0이 아니라면 신호중에 직류 성분이 포함되었다는 것을 알 수 있다.
반대로 0이라면 직류 성분이 없다.
Self-synchronization
Self-synchronization은 신호가 지연되는 경우 필요한 요소이다.
신호가 지연되서 들어오는 것이 무슨 문제냐고 생각할 수 있겠다.
예를들어 우리가 연속적인 이미지로 표현된 동영상을 본다고 해보자.
이때 1번 이미지와 2번이미지 그리고 N번째 이미지에 대한 정보가 필요해진다.
근데 다음과 같이 밀려서 이상하게 해석되면 참사가 벌어진다.
타이밍이 어긋나서 데이터를 이상하게 해석해버리면, 우리는 요상한 영상을 보게될 수가 있다.
이런 타이밍 문제는 데이터에 시작과 중간 그리고 끝을 표시해서 보내는 것으로 해결 할 수 있다.
Line coding의 종류
종류는 위와같이 존재한다.
아찔하지만 하나씩 알아보자.
그 전에 NRZ에 대해 잠시 설명하려고 한다.
NRZ
NRZ는 Non Return to Zero 라는 말로 직역하면 0으로 돌아가지 않는다는 것이다.
무엇이 0으로 돌아가지 않는다는걸까??
위와같은 신호는 NRZ라고 한다.
하나에 데이터를 표현하기 위해 한가지의 전압(1의 경우 음의 전압, 0의 경우 양의 전압)을 사용했다.
즉, 하나의 데이터를 표현하기 위해 중간에 전압의 변화를(전압을 0으로 내림) 주지 않았다.
반면 Return to Zero 즉, RZ라는 것은 무엇일까?
하나의 데이터 0을 표현하기 위해 전압이 음에서 0으로 한번 변화한다.
1의 경우는 전압이 양의 값을 갖는거 한번에 0의 값을 갖는 것 한번을 가진다.
즉, 하나의 데이터를 처리하기 위해 2개의 신호를 사용했고, 전압이 중간에 0으로 이동했으므로 이는 RZ라고 할 수 있겠다.
아래의 내용을 이해할 때 이 부분을 꼭 기억하자.
Unipolar: Non-Return-to-Zero(NRZ)
Unipolar는 극이 하나만 사용된다는 의미로 데이터 값이 1이면 양의 전압을 주고, 값이 0일때는 전압을 주지 않는다.
Unipolar 방식은 이렇게 보내진다.
외워야할 부분은
- 1일때 -> 양의 전압
- 0일때 -> 0의 전압
이다.
데이터 하나에 한가지 전압만을 사용하므로 이는 NRZ임을 알 수 있다.
보내는 전압을 정규화 하면 $\frac{1}{2}V^2$인데 V가 커지면 커질 수록 굉장히 많은 자원이 든다는 것을 알 수 있다.
게다가 직류 성분이나 타이밍 문제도 해결할 수 없으므로 아주 쓸모없는 line coding 방식이다.
Polar: Non-Return-to-Zero(NRZ)
Polar 방식은 양의 전압과 음의 전압 두가지를 사용하는 방법이다.
NRZ-L 방식은 단순히 0일때 양의 전압, 1일때 음의 전압을 사용한다.
unipolar의 NRZ랑 다르다!
- 1일때 -> 음의 전압
- 0일때 -> 양의 전압
이다.
당연히 평균 진폭이 0이 아닌 경우 직류 성분이 포함되는 문제가 있다.
NRZ-I 방식은 좀 참신한다. 다음에 올 비트의 값이 1이면 전압을 변화시킨다.
따라서 1이 반복되는 경우의 직류 성분은 제거할 수 있다.
하지만 0일때는 제거하지 못하기 때문에 반쪽짜리 성공이라고 할 수 있다.
Polar방식도 여전히 Self-synchronization을 만족하지 않는다.
Polar: Return-to-Zero (RZ)
Polar방식이므로 두개의 전압을 가지고 데이터를 표현한다.
하지만 RZ방식을 사용한다.
외워야 할 부분은
- 1 일때는 양의 전압 -> 0
- 0 일때는 음의 전압 -> 0
이다.
데이터 하나를 보낼때 전압이 (양, 0, 음) 또는 (음, 0, 양) 처럼 변화한다는 것을 알 수 있다.
중간에 0인 전압을 가지기 때문에 NRZ가 아닌 RZ방식이다.
또한 데이터가 연속되더라도 구분할 수 있기 때문에 직류 성분을 제거할 수 있다.
전압이 중간중간 0을 거치기 때문에 이를 통해 동기화를 수행할 수도 있으므로 self-synchronizaiton도 만족한다.
단점이 있다면, 하나의 데이터를 표시하기 위해 두번의 신호를 보내야한다는 것이다.
따라서 많은 대역폭을 필요로 한다.
또한 중간중간 전압의 값이 0인 신호를 섞어줘야하므로 다른 방식에 비해 더 복잡하다.
Polar: Manchester
Manchester방식은 RZ와 NRZ-L을 섞어서 만든 아이디어이다.
여기서 외워야할 부분은
- 1을 보낼때는 음의 전압 -> 양의 전압
- 0을 보낼때는 양의 전압 -> 음의 전압
이다.
보면 중간에 0을 거치지 않고 양이나 음의 전압만 가지게 했음을 알 수 있다.
전압이 중간중간 0을 거치지는 않지만 비트와 비트 사이에서 일어나는 변화로 동기화를 수행할 수 있다.
당연히 직류 성분도 제거했다.
NRZ-L 방식의 단점을 해결했다는 것을 확인하자.
단점은 역시 하나의 데이터에 2개의 신호를 줘야한다는 것이다.
Polar: Differential Manchester
Differential Manchester방식은 RZ와 NRZ-I를 섞어서 만들었다.
NRZ-I 방식과 순서만 바꿨다.
다음 비트가 1이면 변화를 주지 않고, 0이면 변화를 준다.
그래프를 잘 봐야하는데 그래프의 시작 부분을 잘 보면 신호가 먼저 떨어진다.
0으로 시작했기 때문에 inversion이 먼저 일어났음을 알 수 있다.
비트값이 바로 전 비트값에 의해 다를 수 있다는 것에 주의하자.
잘 보면 두번째 1은 그 뒤에 오는 0과 형태가 ㄱㄴ 형태로 똑같다.
반면 5번째 1은 ㄱㄴ형태를 상하 반전(S와 비슷하다)시켜 놓은 형태라는 것을 알 수 있다.
NRZ-I 방식의 단점을 해결했다.
마찬가지로 하나의 데이터에 2개의 신호를 줘야한다는 단점을 가진다.
Bipolar: AMI 방식과 Pseudoternary 방식
Bipolar는 양, 음 그리고 0으로 데이터를 처리하며 1개의 데이터에 1개의 신호가 대응된다.
0과 1 둘중 하나는 무조건 0으로 처리하며, 나머지 한개의 데이터는 양과 음의 전압을 번갈아 가면서 처리한다.
AMI(Alternate Mark Inversion) 방식은 데이터 0에 대해 0V의 전압을 주고 1은 양과 음의 전압을 번갈아 가며 사용하게 한다.
반면 Pseudoternary 방식은 반대로 데이터 0에 대해 양과 음의 전압을 번갈아가며 사용하고, 1에 대해서는 0V의 전압을 준다.
위 두개의 Bipolar 방식은 NRZ와 같은 signal rate을 가지지만, 평균 전압이 0V이므로 직류 성분이 존재하지 않는다.
Self-synchronization을 하지 못한다는 단점이 존재한다.
Bipolar: Multilevel Schemes
데이터 m개(m bits)로 하나의 그룹을 만든다면, 그룹이 가질 수 있는 데이터 패턴은 총 $2^m$개다.
예를들어 3비트에 대해서는 000, 001, ..., 110, 111 로 통 8개다.
만약 우리가 L개의 서로 다른 전압을 가지고 있다면, 길이가 n인 시그널에 대해 $L^n$개의 패턴을 만들 수 있다.
예를들어 시그널의 길이가 1이라면 시그널 하나에 L개의 전압중 하나를 쓸 수 있을 것이고
길이가 2라면 시그널 하나에 L개 나머지 하나에 L개 를 사용할 수 있으므로 $L^2$ 개의 패턴이 나온다.
귀납법에 의해 길이가 n인 시그널이라면 $L^n$개의 패턴을 사용할 수 있다.
반면 데이터는 0또는 1이기 때문에 그 몇개의 데이터를 쓰느냐에 따라 패턴이 2의 제곱만큼 늘어나는 것이다.
이런 얘기를 왜 길게 했냐면, 이름에서도 알 수 있듯 multilevel을 사용하기 때문이다.
즉, 여러개의 전압을 사용한다는 것을 알 수 있다.
2B1Q
위의 line coding은 2B1Q라고 부른다.
풀어서 말해보면, Two binary one Quaternary라고 한다.
잘 보면 하나의 시그널이 2개의 데이터를 가지고 있고, 이를 구현하기 위해 4개의 서로 다른 전압을 사용함을 알 수 있다.
즉 two binary란 2개의 데이터를 의미하고, one Quaternary는 하나의 신호가 4개의 서로 다른 전압을 사용한다는 것을 의미한다.
데이터 3개를 쓴다고 했으면, 하나의 신호에 8개의 서로 다른 전압을 사용해야한다는 것을 어렵지 않게 예측할 수 있다.
거의 완벽해보이는데 단점이 존재한다.
서로 다른 전압을 사용해서 encoding 하는 것은 괜찮은데, 받는 쪽에서 decoding 할때는 문제가 생긴다.
전압은 전송되면서 감쇠하게 되는데, 도착할때 정확히 어떤 전압이 갈지도 모르고
받는 쪽에서는 예상했던 전압이 아니라 해석에 어려움을 겪을 수 있다.
8B6T
8B6T는 풀어보면 Eight binary, Six ternary이다.
8개의 데이터 비트(binary)를 사용하며, 3개(ternary)의 서로다른 전압에 신호의 길이는 6이라는 뜻이다.
즉 데이터 패턴은 총 $2^8 = 256$개이고, 전압의 패턴은 총 $3^6 = 729$개라는 것을 의미한다.
8B6T는 보내는 데이터의 진폭 평균이 항상 0이 되도록 맞춘다.
위 그래프를 보면, -0-0++, -+-++0, +--+0+를 보내는데, 각 데이터의 진폭 평균은 차례대로 0, +1, +1 이다.
이때 두번째 데이터에서 진폭 평균이 1이 됐기 때문에 다음에 보내는 데이터는 inversion하여 +--+0+를 -++-0-로 바꿔버린다.
이러면 마지막 inversion된 데이터는 진폭 평균이 -1이므로, 지금까지 보낸 모든 데이터의 진폭 평균은 $0+1-1 = 0$이 된다.
받는 쪽에서는 받은 데이터의 진폭 평균이 음수면, 다시 반전시킨 후 데이터 테이블에서 찾는다.
데이터 패턴은 256개인데 전압 패턴은 729개로 차이가 꽤 크다.
전압 패턴과 데이터 패턴을 일대일 대응시키면 나머지 패턴은 버리는건가?
결론적으로 말하면 버린다기 보다는 재사용한다.
데이터와 일대일 대응 시키는 전압 패턴은 729개중 통신 환경에 맞는 방식을 골라서 보낸다.
오해할 여지가 있어 말을 좀 다르게 하자면, 이미 256개의 패턴에 대해서 대응시킬 전압 패턴 256개는 선택되어있다.(인코딩 테이블이 존재한다.)
그중에서 통신 환경에 맞는 패턴을 대응시켜서 보내는 식이다.
따라서 한 데이터가 같은 전압 패턴을 가지는 것이 아니라 그때 그때 다르다는 것이 중요하다.
전압 패턴 256개를 사용하고 남은 나머지는 오류검출이나 동기화등에 사용한다는 것은 참고로 알아두자.
Multi-transition: MLT-3
데이터를 표현하는데 서로다른 전압의 개수가 2개보다 많다면 우리는 또 다른 encoding 방식을 만들 수 있다.
MLT-3는 그중 하나이다.
양, 음 그리고 0의 전압을 사용하며, 3개의 규칙이 존재한다.
1. 만약 다음 비트의 값이 0 -> 전압을 변화시키지 않는다.
2. 만약 다음 비트의 값이 1이고 현재 비트의 값이 0이 아니라면 -> 다음 전압은 0이다.
3. 만약 다음 비트의 값이 1이고 현재 비트의 값이 0이라면 -> 다음 전압은 현재까지 보냈던 신호 중, 가장 최근에 보낸 0이 아닌 신호의 반대 방향 전압을 사용한다.
참고
https://gusdnd852.tistory.com/273
'CS > 데이터 통신' 카테고리의 다른 글
[데이터 통신] Multiplexing (0) | 2023.04.12 |
---|---|
[데이터 통신] Analog-to-Analog 변환에 대해 (1) | 2023.04.12 |
[데이터 통신] Digital-to-Analog 변환에 대해 (0) | 2023.04.12 |
[데이터 통신] Block coding과 Analog to Digital 변환 (3) | 2023.04.12 |
[데이터 통신] 데이터와 신호 (2) | 2023.04.12 |